{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Sequential_NLP - DEEPAK KUMAR" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### PART-A - Sentiment Classification" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "colab_type": "code", "executionInfo": { "elapsed": 1281, "status": "ok", "timestamp": 1597837875489, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "WgVyb-XPhZg_", "outputId": "b45a3901-05ff-4dc9-d9fb-86cf71679956" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n" ] } ], "source": [ "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "OudB5by50jlI" }, "source": [ "# Sentiment Classification" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xT7MKZuMRaCg" }, "source": [ "### Dataset\n", "- Dataset of 50,000 movie reviews from IMDB, labeled by sentiment positive (1) or negative (0)\n", "- Reviews have been preprocessed, and each review is encoded as a sequence of word indexes (integers).\n", "- For convenience, words are indexed by overall frequency in the dataset, so that for instance the integer \"3\" encodes the 3rd most frequent word in the data. This allows for quick filtering operations such as: \"only consider the top 10,000 most common words, but eliminate the top 20 most common words\".\n", "- As a convention, \"0\" does not stand for a specific word, but instead is used to encode any unknown word.\n", "\n", "Command to import data\n", "- `from tensorflow.keras.datasets import imdb`" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Q34-Y3nRKXdO" }, "source": [ "### Importing the data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": {}, "colab_type": "code", "executionInfo": { "elapsed": 7625, "status": "ok", "timestamp": 1597837881853, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "JxfwbrbuKbk2" }, "outputs": [], "source": [ "#### Add your code here ####\n", "import numpy as np\n", "from keras.preprocessing import sequence\n", "from keras.models import Sequential\n", "from keras.layers import Dense, Embedding, Conv1D, GlobalMaxPool1D, LSTM, TimeDistributed, Flatten\n", "from matplotlib import pyplot\n", "from tensorflow.keras.datasets import imdb\n", "\n", "(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=10000, maxlen=300)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 7613, "status": "ok", "timestamp": 1597837881854, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "GIKRRNDSXTP9", "outputId": "c024342f-dfb9-46f1-a87c-85f1ad3095a9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(19051,)\n", "(19450,)\n", "[1 0 0 ... 0 1 0]\n", "[0 1 0 ... 0 0 0]\n" ] } ], "source": [ "print(X_train.shape)\n", "print(X_test.shape)\n", "print(y_train)\n", "print(y_test)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "executionInfo": { "elapsed": 7598, "status": "ok", "timestamp": 1597837881855, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "WNQRn9YbXg_X", "outputId": "fff6dffd-3d80-4376-9908-d72d936c753d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Labels: \n", "[0 1]\n" ] } ], "source": [ "# Summarize number of Labels\n", "print(\"Labels: \")\n", "print(np.unique(y_train))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "executionInfo": { "elapsed": 7583, "status": "ok", "timestamp": 1597837881857, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "J0AGD3QvGD0Q", "outputId": "3ca003a4-f8a4-416b-d628-bc6a5f38762e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Max length of sequence in X_train: 299\n", "Max length of sequence in X_test: 299\n" ] } ], "source": [ "X_train_max_len = max(len(x) for x in X_train)\n", "print(\"Max length of sequence in X_train: {}\".format(X_train_max_len))\n", "\n", "X_test_max_len = max(len(x) for x in X_test)\n", "print(\"Max length of sequence in X_test: {}\".format(X_test_max_len))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "DldivBO4LTbP" }, "source": [ "### Padding each sentence to be of same length" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 299 }, "colab_type": "code", "executionInfo": { "elapsed": 7562, "status": "ok", "timestamp": 1597837881857, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "E808XB4tLtic", "outputId": "e85c6d9b-5edb-48b5-d8c6-579b9aaf4fe5" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Review length: \n", "Mean 159.68 words (60.730229)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# Summarize review length\n", "print(\"Review length: \")\n", "result = [len(x) for x in X_train]\n", "print(\"Mean %.2f words (%f)\" % (np.mean(result), np.std(result)))\n", "# plot review length\n", "pyplot.boxplot(result)\n", "pyplot.show()\n", "\n", "# we can see that max reviews are under the 500 characters mark" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": {}, "colab_type": "code", "executionInfo": { "elapsed": 7548, "status": "ok", "timestamp": 1597837881858, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "cLwVSYgaKBfz" }, "outputs": [], "source": [ "#padding to 300 length\n", "X_train_padded = sequence.pad_sequences(X_train, maxlen=300)\n", "X_test_padded = sequence.pad_sequences(X_test, maxlen=300)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "JBFFCrybMSXz" }, "source": [ "### Print shape of features & labels" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "qOcyRtZfMYZd" }, "source": [ "Number of review, number of words in each review" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "executionInfo": { "elapsed": 7536, "status": "ok", "timestamp": 1597837881859, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "hdMCUPr7RaCm", "outputId": "216b6302-db2a-4569-cb85-8d40a725becc" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of reviews in x_train: 19051\n", "Number of reviews in x_test: 19450\n" ] } ], "source": [ "\n", "# summarize size\n", "# number of reviews\n", "print(\"Number of reviews in x_train: {}\".format(len(X_train)))\n", "print(\"Number of reviews in x_test: {}\".format(len(X_test)))\n", "#print(\"Padded Training and Test data: \")\n", "#print(len(X_train.shape))\n", "#print(len(X_test.shape))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 7512, "status": "ok", "timestamp": 1597837881859, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "eGVHeKOWyJiG", "outputId": "8fc7b91b-6fa8-49d8-c101-f0820fa8fc67" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of words in each review is 300\n" ] } ], "source": [ "\n", "# number of words in each review\n", "print(\"Number of words in each review is {0}\".format(X_train_padded[0].shape[0]))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "5cNk5sDvMr3j" }, "source": [ "Number of labels" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 7500, "status": "ok", "timestamp": 1597837881860, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "6Z00-mYgMoKv", "outputId": "ec4f0576-e1bf-46b6-ef8d-502cc69161dd" }, "outputs": [ { "data": { "text/plain": [ "(19051,)" ] }, "execution_count": 10, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "\n", "y_train.shape" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "executionInfo": { "elapsed": 1194, "status": "ok", "timestamp": 1597837972953, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "H7f5tPeaMxti", "outputId": "37bc0d34-d25f-4d8a-f7ec-7a13d404f756" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unique Labels: \n", "[0 1]\n" ] } ], "source": [ "\n", "y_test.shape\n", "print(\"Unique Labels: \")\n", "print(np.unique(y_train))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NdXPWuOmNEbh" }, "source": [ "### Print value of any one feature and it's label" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MGLEdeFmNZfR" }, "source": [ "Feature value" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "colab_type": "code", "executionInfo": { "elapsed": 1288, "status": "ok", "timestamp": 1597837996635, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "RKFyMa28zztL", "outputId": "bee33d7a-250f-4ef9-efb2-b21bc591d69e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Value of the 100th review: [1, 14, 9, 6, 389, 20, 19, 6, 253, 1096, 65, 5, 4, 6891, 7, 1181, 3855, 5, 4, 620, 756, 7, 803, 674, 11, 113, 97, 14, 6, 55, 467, 2525, 20, 92, 387, 4, 2, 7, 4, 182, 2, 25, 39, 319, 14, 2065, 47, 389, 388, 5, 13, 594, 33, 4, 192, 15, 212, 9, 115, 2525, 88, 156, 40, 2065, 97, 170, 39, 486, 8, 622, 1801, 168, 6529, 776, 87, 20, 32, 187]\n" ] } ], "source": [ "\n", "print(\"Value of the 100th review:\" ,X_train[100])" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "h_85Hqm0Nb1I" }, "source": [ "Label value" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 1219, "status": "ok", "timestamp": 1597838010254, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "-FoehB5jNd1g", "outputId": "6cc51076-0d77-4f05-911c-aac75846cd7a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sentiment Label: 1\n" ] } ], "source": [ "\n", "print(\"Sentiment Label:\", y_train[100])" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "0cof4LSxNxuv" }, "source": [ "### Decoding the feature value to get original sentence" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Q_oiAyPZOkJD" }, "source": [ "First, retrieve a dictionary that contains mapping of words to their index in the IMDB dataset" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": {}, "colab_type": "code", "executionInfo": { "elapsed": 8325, "status": "ok", "timestamp": 1597837882749, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "Clsk-yK8OtzD" }, "outputs": [], "source": [ "\n", "imdb_wordindex = imdb.get_word_index()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "NRgOD5S2Uuvd" }, "source": [ "Now use the dictionary to get the original words from the encodings, for a particular sentence" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 8316, "status": "ok", "timestamp": 1597837882751, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "zJ504QDORwxj", "outputId": "0bf81be6-4878-476a-e4ea-17754fc6e380" }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 15, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "\n", "index_from = 3\n", "imdb_wordindex = {key:value + index_from for key, value in imdb_wordindex.items()}\n", "imdb_wordindex['the']" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "colab_type": "code", "executionInfo": { "elapsed": 8304, "status": "ok", "timestamp": 1597837882753, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "9Jt1OWiT4Blr", "outputId": "30c91688-e987-4a73-c1f7-f8ca969c7f9a" }, "outputs": [ { "data": { "text/plain": [ "['this',\n", " 'is',\n", " 'a',\n", " 'wonderful',\n", " 'movie',\n", " 'with',\n", " 'a',\n", " 'fun',\n", " 'clever',\n", " 'story',\n", " 'and',\n", " 'the',\n", " 'dynamics',\n", " 'of',\n", " 'culture',\n", " 'differences',\n", " 'and',\n", " 'the',\n", " 'running',\n", " 'theme',\n", " 'of',\n", " \"what's\",\n", " 'important',\n", " 'in',\n", " 'life',\n", " 'make',\n", " 'this',\n", " 'a',\n", " 'very',\n", " 'under',\n", " 'appreciated',\n", " 'movie',\n", " \"don't\",\n", " 'let',\n", " 'the',\n", " 'of',\n", " 'the',\n", " 'world',\n", " 'you',\n", " 'from',\n", " 'seeing',\n", " 'this',\n", " 'keaton',\n", " 'has',\n", " 'wonderful',\n", " 'moments',\n", " 'and',\n", " 'i',\n", " 'wonder',\n", " 'at',\n", " 'the',\n", " 'fact',\n", " 'that',\n", " 'comedy',\n", " 'is',\n", " 'never',\n", " 'appreciated',\n", " 'because',\n", " 'actors',\n", " 'like',\n", " 'keaton',\n", " 'make',\n", " 'going',\n", " 'from',\n", " 'humor',\n", " 'to',\n", " 'serious',\n", " 'bits',\n", " 'look',\n", " 'tremendously',\n", " 'easy',\n", " 'great',\n", " 'movie',\n", " 'all',\n", " 'around']" ] }, "execution_count": 16, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "inverted_word = {value: key for key, value in imdb_wordindex.items()}\n", "[inverted_word[index] for index in X_train[100] if index > index_from]" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WLGABrJoVZe6" }, "source": [ "Get the sentiment for the above sentence\n", "- positive (1)\n", "- negative (0)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 8288, "status": "ok", "timestamp": 1597837882754, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "XDyQGJT0Ve-a", "outputId": "757c3891-fd4f-4d61-aae8-f91cbbbb44eb" }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 17, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "\n", "y_train[100]\n", "# confirmed that the review is bad and the label also confirmed the same" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "BmCjr8miXIWB" }, "source": [ "### Define model\n", "- Defining a Sequential Model" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": {}, "colab_type": "code", "executionInfo": { "elapsed": 1254, "status": "ok", "timestamp": 1597838152807, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "Np5GxT1caFEq" }, "outputs": [], "source": [ "\n", "\n", "vocabulary = 10000\n", "max_words = 300\n", "\n", "model = Sequential()\n", "model.add(Embedding(vocabulary, 100, input_length=max_words))\n", "model.add(LSTM(100,return_sequences= True))\n", "dense_layer = Dense(100, activation='relu')\n", "model.add(TimeDistributed(dense_layer))\n", "model.add(Flatten())\n", "model.add(Dense(1, activation='sigmoid'))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Hc4bknOobDby" }, "source": [ "### Compile the model" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": {}, "colab_type": "code", "executionInfo": { "elapsed": 1360, "status": "ok", "timestamp": 1597838159392, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "jw4RJ0CQbwFY" }, "outputs": [], "source": [ "\n", "model.compile(optimizer='adam', loss='binary_crossentropy', metrics='accuracy')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8sEzwazqbz3T" }, "source": [ "### Print model summary" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 340 }, "colab_type": "code", "executionInfo": { "elapsed": 1298, "status": "ok", "timestamp": 1597838168224, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "6Hx1yxwlb2Ue", "outputId": "646b2aa0-a06a-4b80-abaf-1fc04194aaa8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential_1\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "embedding_1 (Embedding) (None, 300, 100) 1000000 \n", "_________________________________________________________________\n", "lstm_1 (LSTM) (None, 300, 100) 80400 \n", "_________________________________________________________________\n", "time_distributed_1 (TimeDist (None, 300, 100) 10100 \n", "_________________________________________________________________\n", "flatten_1 (Flatten) (None, 30000) 0 \n", "_________________________________________________________________\n", "dense_3 (Dense) (None, 1) 30001 \n", "=================================================================\n", "Total params: 1,120,501\n", "Trainable params: 1,120,501\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "None\n" ] } ], "source": [ "\n", "print(model.summary())" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "bmkolKP4b-U6" }, "source": [ "### Fit the model" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "executionInfo": { "elapsed": 42709, "status": "ok", "timestamp": 1597838300880, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "vRg3KFXLcAkk", "outputId": "1fbf34a7-90cb-411b-cf9a-fe815a5e871d" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/5\n", "298/298 [==============================] - 8s 28ms/step - loss: 0.1743 - accuracy: 0.9344\n", "Epoch 2/5\n", "298/298 [==============================] - 8s 28ms/step - loss: 0.0992 - accuracy: 0.9637\n", "Epoch 3/5\n", "298/298 [==============================] - 8s 28ms/step - loss: 0.0602 - accuracy: 0.9794\n", "Epoch 4/5\n", "298/298 [==============================] - 8s 28ms/step - loss: 0.0367 - accuracy: 0.9863\n", "Epoch 5/5\n", "298/298 [==============================] - 8s 28ms/step - loss: 0.0295 - accuracy: 0.9902\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "\n", "model.fit(X_train_padded, y_train, epochs=5, batch_size=64)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "bwLl54MXnkEA" }, "source": [ "### Evaluating model" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "executionInfo": { "elapsed": 5178, "status": "ok", "timestamp": 1597838357357, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "EUqY-bD8RaDR", "outputId": "fbed0156-892f-42da-884c-c8320b0217ce" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Score: 0.7076\n", "Accuracy: 0.8644\n" ] } ], "source": [ "\n", "scores, accuracy = model.evaluate(X_test_padded, y_test, verbose=0)\n", "print(\"Score: {:.4f}\".format(scores))\n", "print(\"Accuracy: {:.4f}\".format(accuracy))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "h2amr1tJn9Jz" }, "source": [ "### Predict on one sample" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "colab": {}, "colab_type": "code", "executionInfo": { "elapsed": 1306, "status": "ok", "timestamp": 1597838455107, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "Wl4idfWR_A8E" }, "outputs": [], "source": [ "#### Add your code here ####\n", "goodsample = \"i liked the movie\"\n", "badsample = \"i did not like this movie\"" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 1667, "status": "ok", "timestamp": 1597838601605, "user": { "displayName": "Anamay tamrakar", "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GhquhLUHnKEDe6-3g6DT_G8Wu17P9ZKYAQbxLx7qw=s64", "userId": "03768491071577504839" }, "user_tz": -330 }, "id": "pdbXlqq17W6a", "outputId": "0b1f5075-1cc7-43ef-c67b-c315bb1aee07" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Review: i liked the movie\n", "\tSentiment: positive\n", "Review: i did not like this movie\n", "\tSentiment: negative\n" ] } ], "source": [ "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "for review in [goodsample, badsample]:\n", " encoded_review = []\n", " review_split = review.split(\" \")\n", " for word in review_split:\n", " encoded_review.append(imdb_wordindex[word])\n", " review_padded = pad_sequences([encoded_review], maxlen=300)\n", " pred = model.predict(review_padded)\n", " if pred > 0.5:\n", " sentiment = 'positive'\n", " else:\n", " sentiment = 'negative'\n", " print(\"Review: {0}\\n\\tSentiment: {1}\".format(review, sentiment))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "pp68FAQf9aMN" }, "source": [ "### Part-B: Sarcasm Detection" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "v9kv9tyJ77eF" }, "source": [ "### Import Packages" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 122 }, "colab_type": "code", "id": "D0O_n6OIEVyL", "outputId": "ff2a7691-a162-4f4d-c2b4-8d5469b2238e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n", "\n", "Enter your authorization code:\n", "··········\n", "Mounted at /content/drive\n" ] } ], "source": [ "# Mounting Google Drive\n", "from google.colab import drive\n", "drive.mount('/content/drive')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "0mgRpOvFMjKR" }, "outputs": [], "source": [ "# Setting the current working directory\n", "import os; os.chdir('drive/My Drive/Great Learning/NLP/Sarcasm Detection/')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "fnY_BnILi810", "outputId": "afd89f6e-709e-48e2-f1f5-ada7a539bee3" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", "[nltk_data] Unzipping corpora/wordnet.zip.\n", "[nltk_data] Downloading package stopwords to /root/nltk_data...\n", "[nltk_data] Unzipping corpora/stopwords.zip.\n", "[nltk_data] Downloading package averaged_perceptron_tagger to\n", "[nltk_data] /root/nltk_data...\n", "[nltk_data] Unzipping taggers/averaged_perceptron_tagger.zip.\n" ] } ], "source": [ "# Import packages\n", "import warnings; warnings.filterwarnings('ignore')\n", "import pandas as pd, numpy as np, tensorflow as tf\n", "import matplotlib.pyplot as plt, seaborn as sns\n", "import matplotlib.style as style\n", "\n", "import random, re\n", "assert tf.__version__ >= '2.0'\n", "%matplotlib inline\n", "\n", "# Text preprocessing and stopwords\n", "from text_preprocess import * #(custom module)\n", "\n", "# Models\n", "from tensorflow.keras.layers import Dense, LSTM, Embedding, Dropout, Flatten, Bidirectional, GlobalMaxPool1D\n", "from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau, TensorBoard\n", "from tensorflow.keras.preprocessing.sequence import pad_sequences\n", "from tensorflow.keras.preprocessing.text import Tokenizer\n", "from tensorflow.keras.models import Model, Sequential\n", "from tensorflow.keras.initializers import Constant\n", "\n", "from sklearn.metrics import classification_report, confusion_matrix\n", "from sklearn.model_selection import train_test_split\n", "\n", "# Set random state\n", "random_state = 42\n", "np.random.seed(random_state)\n", "tf.random.set_seed(random_state)\n", "\n", "!rm -R log/" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WXYwajPeQbRq" }, "source": [ "### Loading Dataset" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 221 }, "colab_type": "code", "id": "StSLB-T8PuGr", "outputId": "22d60b3f-41b7-42fd-93b0-56eceb0eea59" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data has 26709 rows and 3 columns. Here are the first five rows of the data...\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
article_linkheadlineis_sarcastic
0https://www.huffingtonpost.com/entry/versace-b...former versace store clerk sues over secret 'b...0
1https://www.huffingtonpost.com/entry/roseanne-...the 'roseanne' revival catches up to our thorn...0
2https://local.theonion.com/mom-starting-to-fea...mom starting to fear son's web series closest ...1
3https://politics.theonion.com/boehner-just-wan...boehner just wants wife to listen, not come up...1
4https://www.huffingtonpost.com/entry/jk-rowlin...j.k. rowling wishes snape happy birthday in th...0
\n", "
" ], "text/plain": [ " article_link ... is_sarcastic\n", "0 https://www.huffingtonpost.com/entry/versace-b... ... 0\n", "1 https://www.huffingtonpost.com/entry/roseanne-... ... 0\n", "2 https://local.theonion.com/mom-starting-to-fea... ... 1\n", "3 https://politics.theonion.com/boehner-just-wan... ... 1\n", "4 https://www.huffingtonpost.com/entry/jk-rowlin... ... 0\n", "\n", "[5 rows x 3 columns]" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "data = pd.read_json('./Data/Sarcasm_Headlines_Dataset.json', lines = True)\n", "print(f'Data has {data.shape[0]} rows and {data.shape[1]} columns. Here are the first five rows of the data...')\n", "display(data.head())" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 493 }, "colab_type": "code", "id": "5s9jDOxrnk3T", "outputId": "3e5b476b-4daf-4143-d2cc-35c89353ea37" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------\n", "Value Counts for `is_sarcastic` label\n", "------------------------------------------------------------\n", "Is Sarcastic count: 11724 i.e. 44.0%\n", "Isn't Sarcastic count: 14985 i.e. 56.0%\n", "------------------------------------------------------------\n", "Distributon of `is_sarcastic` label\n", "------------------------------------------------------------\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('--'*30); print('Value Counts for `is_sarcastic` label'); print('--'*30)\n", "print(f'Is Sarcastic count: {data[data.is_sarcastic == 1].shape[0]} i.e. {round(data[data.is_sarcastic == 1].shape[0]/data.shape[0]*100, 0)}%')\n", "print(f'Isn\\'t Sarcastic count: {data[data.is_sarcastic == 0].shape[0]} i.e. {round(data[data.is_sarcastic == 0].shape[0]/data.shape[0]*100, 0)}%')\n", "\n", "print('--'*30); print('Distributon of `is_sarcastic` label'); print('--'*30)\n", "_ = data['is_sarcastic'].value_counts().plot(kind = 'pie', autopct = '%.0f%%', labels = ['Sarcastic', 'Non-sarcastic'], figsize = (10, 6))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 145 }, "colab_type": "code", "id": "6TqY6nd_tVnN", "outputId": "7c2a0462-0a30-47ba-e854-dff1bd1d3330" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Analysis of `is_sarcastic` label by news website\n", "------------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
huffingtonposttheonion
Sarcastic011724
Non-sarcastic149851
\n", "
" ], "text/plain": [ " huffingtonpost theonion\n", "Sarcastic 0 11724\n", "Non-sarcastic 14985 1" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Analysis of `is_sarcastic` label by news website'); print('--'*30)\n", "\n", "hf = data[data['article_link'].str.contains('huffingtonpost.com')].shape[0]\n", "op = data[data['article_link'].str.contains('theonion.com')].shape[0]\n", "\n", "is_sarcastic_hf = data.loc[(data['article_link'].str.contains('huffingtonpost.com')) & (data['is_sarcastic'] == 1)].shape[0]\n", "not_sarcastic_hf = data.loc[(data['article_link'].str.contains('huffingtonpost.com')) & (data['is_sarcastic'] == 0)].shape[0]\n", "\n", "is_sarcastic_op = data.loc[(data['article_link'].str.contains('theonion.com')) & (data['is_sarcastic'] == 1)].shape[0]\n", "not_sarcastic_op = data.loc[(data['article_link'].str.contains('theonion.com')) & (data['is_sarcastic'] == 0)].shape[0]\n", "\n", "display(pd.DataFrame([[is_sarcastic_hf, is_sarcastic_op], [not_sarcastic_hf, not_sarcastic_op]], \n", " columns = ['huffingtonpost', 'theonion'], index = ['Sarcastic', 'Non-sarcastic']))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 323 }, "colab_type": "code", "id": "3U5VxSEkuygG", "outputId": "dd761697-eb05-4b4f-be38-71e2b2c4dbc1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------\n", "Checking 5 random headlines and labels from the data\n", "------------------------------------------------------------\n", "Headline: chromat features not 1, but 2 plus-size models on its runway\n", "label: 0\n", "\n", "Headline: documentary about grisly murder inspires dozens of copycat documentaries\n", "label: 1\n", "\n", "Headline: breakup doesn't seem to have changed relationship\n", "label: 1\n", "\n", "Headline: 3 myths about low libido\n", "label: 0\n", "\n", "Headline: man calls trust fund savings\n", "label: 1\n", "\n" ] } ], "source": [ "# Checking 5 random headlines and labels from the data\n", "print('--'*30); print('Checking 5 random headlines and labels from the data'); print('--'*30)\n", "rands = random.sample(range(1, data.shape[0]), 5)\n", "headlines, labels = list(data.loc[rands, 'headline']), list(data.loc[rands, 'is_sarcastic'])\n", "\n", "_ = [print(f'Headline: {head}\\nlabel: {label}\\n') for head, label in zip(headlines, labels)]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 714 }, "colab_type": "code", "id": "Kd6KB7YoPpM-", "outputId": "9adc7a4b-699c-4871-be83-47661a2d7d4e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------\n", "Checking 5 random headlines and labels from the data where the length of headline is > 100\n", "------------------------------------------------------------\n", "Headline: paul ryan confident american people will warm up to tax plan once they realize life a cruel and meaningless farce\n", "label: 1\n", "\n", "Headline: 'zero dark thirty' reveals navy seals killed bin laden by frantically throwing whatever they could find at him\n", "label: 1\n", "\n", "Headline: skipping out on friend's birthday party at last minute closest woman will ever come to feeling rush of heroin\n", "label: 1\n", "\n", "Headline: melania trump hangs decayed badger carcass over white house mantel to finish off traditional slovenian christmas decor\n", "label: 1\n", "\n", "Headline: ornithologist forced to participate in history channel's 'what if humans suddenly became birds?' program\n", "label: 1\n", "\n", "------------------------------------------------------------\n", "Distributon of label where the length of headline is > 100\n", "------------------------------------------------------------\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "# Checking 5 random headlines and labels from the data where the length of headline is > 100\n", "print('--'*30); print('Checking 5 random headlines and labels from the data where the length of headline is > 100'); print('--'*30)\n", "indexes = list(data.loc[data['headline'].str.len() > 100, 'headline'].index)\n", "rands = random.sample(indexes, 5)\n", "headlines, labels = list(data.loc[rands, 'headline']), list(data.loc[rands, 'is_sarcastic'])\n", "\n", "_ = [print(f'Headline: {head}\\nlabel: {label}\\n') for head, label in zip(headlines, labels)]\n", "\n", "print('--'*30); print('Distributon of label where the length of headline is > 100'); print('--'*30)\n", "_ = data.loc[indexes, 'is_sarcastic'].value_counts().plot(kind = 'pie', autopct = '%.0f%%', labels = ['Sarcastic', 'Non-sarcastic'], figsize = (10, 6))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "_GfOfMP0OdIR" }, "source": [ "#### **Observation**\n", "* 44% of the data have sarcastic labels whereas 56% don't.\n", "* Suprising! There are no headlines from HuffPost that are sarcastic whereas all but one from The Onion are sarcastic.\n", "* Based on some random headlines seen above, it appears that the data is mostly lower-cased. Pre-processing such as removing punctuations and lemmatization can be used.\n", "* There are digits in the headlines for e.g. `3 things i needed to hear when i weighed 300 pounds` where removing the digits wouldn't help.\n", "* 83% of data where length of sentence (headlines) > 100 are sarcastic headlines." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "z6pXf7A78E2H" }, "source": [ "### Drop `article_link` from dataset." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "id": "VLSVsvrlP9qD", "outputId": "b1174c83-aca9-424d-bed2-241a62b51114" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dropping `article_link` from the data\n", "------------------------------------------------------------\n" ] } ], "source": [ "print('Dropping `article_link` from the data'); print('--'*30)\n", "data.drop('article_link', axis = 1, inplace = True)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "jp-4qfCAD6df" }, "source": [ "### Data Preprocessing\n", "Few of the data pre-processing steps taken before applying model on the data\n", "\n", "* Converting to lower case, avoid any capital cases\n", "* Converting apostrophe to the standard lexicons\n", "* Removing punctuations\n", "* Lemmatization" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 136 }, "colab_type": "code", "id": "Oz4LGa55uPCa", "outputId": "b362b534-9c04-48b6-e10f-030fe8663e6b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------\n", "Converting headlines to lower case\n", "Replacing apostrophes to the standard lexicons\n", "Removing punctuations\n", "Applying Lemmatizer\n", "Removing multiple spaces between words\n", "------------------------------------------------------------\n" ] } ], "source": [ "print('--'*30); print('Converting headlines to lower case')\n", "data['cleaned_headline'] = data['headline'].apply(lambda x : x.lower())\n", "\n", "print('Replacing apostrophes to the standard lexicons')\n", "data['cleaned_headline'] = data['cleaned_headline'].apply(lambda x : replace_words(x))\n", "\n", "print('Removing punctuations')\n", "data['cleaned_headline'] = data['cleaned_headline'].apply(lambda x: remove_punctuation(x))\n", "\n", "print('Applying Lemmatizer')\n", "data['cleaned_headline'] = data['cleaned_headline'].apply(lambda x: lem(x))\n", "\n", "print('Removing multiple spaces between words')\n", "data['cleaned_headline'] = data['cleaned_headline'].apply(lambda x: re.sub(' +', ' ', x))\n", "\n", "# print('Removing stopwords')\n", "# data['cleaned_headline'] = data['cleaned_headline'].apply(lambda x: remove_stopwords(x))\n", "print('--'*30)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "D0h6IOxU8OdH" }, "source": [ "### Get the Length of each line and find the maximum length\n", "As different lines are of different length. We need to pad the our sequences using the max length." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 156 }, "colab_type": "code", "id": "BRAsChZAQmr3", "outputId": "54aa6ee8-3ae9-479a-9f80-f336224dead5" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------------------------------------\n", "Get the length of each line, find the maximum length and print the maximum length line\n", "Length of line ranges from 7 to 241.\n", "--------------------------------------------------------------------------------\n", "Minimum line length: 7\n", "Maximum line length: 241\n", "Line with maximum length: maya angelou poet author civil right activist and—holy cow—tony award–nominated actress college professor magazine editor streetcar conductor—really streetcar conductor wow—calypso singer nightclub performer and foreign journalist dead at 86\n" ] } ], "source": [ "print('--'*40); print('Get the length of each line, find the maximum length and print the maximum length line'); \n", "print('Length of line ranges from 7 to 241.'); print('--'*40)\n", "# Get length of each line\n", "data['line_length'] = data['cleaned_headline'].str.len()\n", "\n", "print('Minimum line length: {}'.format(data['line_length'].min()))\n", "print('Maximum line length: {}'.format(data['line_length'].max()))\n", "print('Line with maximum length: {}'.format(data[data['line_length'] == data['line_length'].max()]['cleaned_headline'].values[0]))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 156 }, "colab_type": "code", "id": "278SpH4NykbV", "outputId": "b23befca-02bd-44fc-e3de-f697f40d77b9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------------------------------------\n", "Get the number of words, find the maximum number of words and print the maximum number of words\n", "Number of words ranges from 2 to 39.\n", "--------------------------------------------------------------------------------\n", "Minimum number of words: 2\n", "Maximum number of words: 39\n", "Line with maximum number of words: elmore leonard modern prose master noted for his terse prose style and for writing about thing perfectly and succinctly with a remarkable economy of word unfortunately and sadly expired this gloomy tuesday at the age of 87 year old\n" ] } ], "source": [ "print('--'*40); print('Get the number of words, find the maximum number of words and print the maximum number of words'); \n", "print('Number of words ranges from 2 to 39.'); print('--'*40)\n", "# Get length of each line\n", "data['nb_words'] = data['cleaned_headline'].apply(lambda x: len(x.split(' ')))\n", "\n", "print('Minimum number of words: {}'.format(data['nb_words'].min()))\n", "print('Maximum number of words: {}'.format(data['nb_words'].max()))\n", "print('Line with maximum number of words: {}'.format(data[data['nb_words'] == data['nb_words'].max()]['cleaned_headline'].values[0]))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 826 }, "colab_type": "code", "id": "HocNTtR-G9Sh", "outputId": "ee0e178e-ae13-4475-d26d-78d3efe5caa4" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Word Cloud of Sarcastic and Non-sarcastic Headlines\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAGMCAYAAADHrwO4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOy9ebQty13f9/lVz72HM9/pzZKQoiC8IiYjBSNCAsTETMaBxIxZGIMNayEbmyEkIBvsMAXjZSDBLBPwsrHBxgxmNGYWyALJAiSkpye98Y5nPnvquavyR9XeZ99zzx3effe+Qe7Pevudu7urq6uH3V2/+n1/vxJjDB0dHR0dHR0dHR0dHR0vHPVSN6Cjo6Ojo6Ojo6Ojo+Mjhc7A6ujo6Ojo6Ojo6OjouEd0BlZHR0dHR0dHR0dHR8c9ojOwOjo6Ojo6Ojo6Ojo67hGdgdXR0dHR0dHR0dHR0XGP6Aysjo6Ojo6Ojo6Ojo6Oe0RnYHV0dLwiEJGvFBEjIg+eWP7dbvmXnFj+6W75m+9Te/ZE5G13UG4oIn9fRN4vIrmITETk90Tkr4mI58q8TUT27kc7b9Kmvjs3X3EP6uqJyL8Wkf1b1SkigYj8bRF5n4hk7vy9U0S++YW24cVERP66iHzeKcufEZHve4F13/Q+EJEfF5F3vZD6n2dbvk5EzNL3T3XX9w1Ly4yIfN2L1aaOjo6OVwr+S92Ajo6OjjvkD9zfNwM/vbT8zUDm/v6LE8tL4N0vSutOQUTOAL8NrALf79oSAZ/mvu8CP/9Ste8e8TeAzwa+DLgMPHmTcj8IfDHwD4B3Ys/JJ7ltv+v+N/Oe8deB9wE/d2L55wP7L35zXlLeBDz9Ujeio6Oj4+VGZ2B1dHS8UngcOGDJwBKRAPh44Mfd8mXeDLzbGFPe7Q5FJDbGFHe7PfD/AGvAxxtjLi8t/1UR+UFg5QXU/XLhvwI+aIz5mZsVEJEU+N+AbzXGfO/Sqn8nIvJCGyAiiTEmf6H1vBCMMe95Kff/UmCM+U8vdRs6Ojo6Xo50EsGOjo5XBMYYA7yD6w2pN7q/Pwy8QUQGACKigD8P/P68oIh8oYi8V0RKEbkoIv9ARPyl9V/hJE+fKCK/LSI58Hfduk8RkT8RkUJE3n0nskMReRTr1fiHJ4yr+fE8Z4x57y22f0xEfk5Exk5W+O9F5DXL9bv2/qUT290gJRORLxCRJ5xE8XexRtFtEZFNEfkJJ//L3Hn5+KX1zwBfCbzRtcXcpKoeEADXTq5w13VeX09EflBEPuj297SI/JCIDE+0yzi54Q+IyC7wXrc8EZHvEZFn3XV+WkT+r6XtvkxE3i4iByJyKCK/tXw8rsxHi8ivujIzEfmAiHytW/fbwMcBXz4/3rkk8jSJoLtvfktEpiIycufvjdwjRORhJ888cOfr10TkdSfKfJe776cicklE/qWInDtRJnLn/cjV9Y+w1+t2+79OIuiO79+KyF8VkQ+7e/dX5EZZb+yu00V3nf5ERD7rRJnPcb+1mbtW7xSRt9zViero6Oh4kek8WB0dHa8k/gB425LH4k1Y2d37gBHWqPqPwEdjvUO/DyAinwH8FPDPsUbTnwO+A9gAvubEPv4V1mD7e8CRiFwAfgX4Q+CvABeAfwmkt2nrXwAE+NXne5AiEgG/AdTAVwGNa8/viMjHGGMOnkddH4s99p8Fvh54A9dLLG/FzwGvAf4OsIc9d78lIm80xnwYa0B+J/AqrIfqVIwxuyJyEXvtZsCvG2MmpxRNAQ/4Vqx88iH3738DfOaJsn8X+F3gSwElIoKVW74Je23fDTyAvQ5zHsXeA08CIfC/Ar8nIh9tjHnKlfn3wAeAL8FKTF8HzA28vwn8DPCU2wfcRBIpIp8K/DrwW8CXAzPgv3VtuqW3S5YM/+XFJ8qsA2/HyhK/BiuT/WbgP4rIa5c8emeAfwhcAbaAbwB+U0TeYIzRrsx3AX8Ne67fj73n/udbtfEW/Hnsb+QbgAT4x8A/BZYNqH8LfCLw7djz94XAL4jIxxtj/lhEXu3K/GPsdY6xhu36Xbapo6Oj48XFGNN9uk/36T6viA/wFsAAn+K+/xTwve7fvwR8m/v3V7tyW+77fwJ+60Rd3wi0wIPu+1e4bb7+RLnvwXZi06VlX+zKvu0Wbf1mVya6g+N6G7C39P1rsEbVq5aWPQhUwLe474+6+v/Sibp+HHjX0vefxnaaZWnZt7ptv+IWbfofXZm3LC3rYQ2fH7nZ/m5R36cBO67OFngX1nALb7GNjzVKDPDw0nID/OcTZT/TLf+cO7yXlKv/8aX7ZtPV8TG32O5dwI+fsvwZ4PuWvr/DlZU7ac/SfWBu8Vm+rt/h7sv1pWVr2IGGr71J/R7WwFv+DW0AOfBNJ87N4zgHo1v2qW67N5y4Dl+39P233f7Xlpa91ZVL3Pf//uR95Zb/LvBv3L//CrB/p+et+3Sf7tN9Xm6fTiLY0dHxSuKPsIbHXKL3ZmxHFqwRtbz8Q8Z6TjzgY7FekGV+CtuRfNOJ5b904vsnYj0u2dKyn30ebb6ZbO5WfCLWgJh7VTDGXMJ65D75Lur6BWPMcjv+3R1ut2OM+Z2lNsyAX7yLNmCM+U3g1cD/AvwYtmP/vVhvyuJdJCJfKiLvEZEp1oP3drfqtSeq/OUT3z8NODDG/MLN2iAirxeRnxWRbayRV2M9VPO6D4CLwP8rIl8kNknJ80ZEelhPzk+cOO93wgj4hFM+v3ii3P+A9ZCNRcR3Xq8J1nO3LOP8iyLyByIywv52LrlV82P+GKyHaJFsxVjP1t0mX/kjY8zh0vf3u78PLLX7GvD783a7tv/GUrvfC6w4eepnuPPZ0dHR8YqhM7A6OjpeMTgj54+BN7u4jgc5zi74DuCTnFTszRzHX21i40m2T1Q3/35SdnSy3Dms5+VkO6a3ae487urh25Q7jfOntGPetucrk7qh/ad8v1kbTit3N20AwBgzMcb8lDHmq7Cywu/Aeqg+G0BEPh8r4XsHVqL2SVgZIlgj4GQ7ltkArt5s32Lj8/4DVnb4t7HSwU8A/mRetzMsPgNrAPwYcE1sSv3nGze1hpX03bQ9t6Axxrzr5IcbMxRuAl+ENRKXP/+dO0ZE5BOAX8AaVV+KHUz4JLf9/HzO47Hu5h45jaMT36sT+9t0+zzZ7rfN222M+SDwudh75JeBPRH5SRHZuss2dXR0dLyodDFYHR0drzR+HyvRezPwjDFmnjjhD4EBVsr0Gqy0D2zsUI2NRVnmrPt7Mp7ppMfh2sltxWbF69+mnb/r6vpM4MO3KXuSq9g4spOc5bi98+yG4Ykyaye+39D+U77frA2nlVtuw11jjDEi8r3A/4lNuvHzWKPqncaYvzkvd4vEBiev0z7WKLwZb8Ia5J9ujHl8qf7rMjm6dV8gNkPlXwC+G/glEXnQHMcs3Y5DQN+mPS+UA6zx9B2nrJvHt30+VtL5RXNPmog8cqLs/Pdzhuuv61157+6AA+zgww1ziS1jjPkl7HlfAf4n4AeAf4L1gHZ0dHS8rOk8WB0dHa80/gA7Cv7lHMsDMcaMgT/DxvWA82AZY1qsbOpk0P4XYjvB7+DW/BHw6c6omvP5Nyu81J5nsVLC/11Ebuhoi8hDIvIxN9n8ncDHichjS+UfwBqVc8ncDtZwfP1SmT43pqv/I+BznGdvzl++XftdG86IyKcs1Z9iO7tvv+lWpyB2kuHVU1Z9lPs790Yl2MQSy3zxHe7mN4B1OZFVcYnE/V3ULzYb5KOnFTbG1E7W+P1YQ2ne/oobvWknt51hz9+XnTjv95LfwBrhf3aKx+uDrkwC1CdkiifP53uxxvrnzhc4yebncn/4DawHa3oTT911GGNGxpifxP6W/uv71KaOjo6Oe0rnwero6HilMZcE/kVsVrxl3oHNgHaIzQQ359uBXxOR/w/419i4k+8AftTFNt2KHwC+FvhFEfl+bIa0b8EmBrgdfwP4HeBdbtv5RMNvcXV+GS7F+Al+HPgm4FdE5Nuw8ULfjvXG/QhYOZuI/Dzwt0TkWaw06xtOadd3Yzv7Py0i/wybRfArb9dwY8yvicgfAD8lIt+M9RD9HWyn/XtvufGNrABPiMhPYLPqjbCxT9+C9WbMY9p+HfghEflW1+bPwiZFuBN+Hfg14CdF5O8D/xlrGH2KMearsTF6U+BHReR7sN6st3Es5URE/hzwfdj4vKew3sBvAv7EHGdufBz4TBH5TOw5edoYc9oEw9+MzWj5KyLyT7FZBN+ETVRxMp7qbvh+bKbD3xSRf+KO4yz23nq7MeZfuXPyVhH5AWx2xDe7bRYYY/Zd+/6eiDTYQYqv4vYe2rtlfp1+XUS+2+1vCPw3QGyM+RYR+WrsufpVbPbDj8IOkPzz+9Smjo6OjntK58Hq6Oh4ReEMouewMS4nvU/vmC9fHrU3xvwHrLTo47EdzbcC/zfwddwGY+ew+iys1+xnsKm6vwSbFvt22+5gY15+DNtp/VVs+ulPBv4WNyYumG9XYpMBPA78M+An3DF/qrk+RfvXYT11Pwz8EDbF/G+eqOtd7tjfiE27/nnY2J074fOwHeIfwCYJEeDTjE3R/nwYYyWbHwf8KPY8fCO2o/1JxpiRK/cj2Ovy9dhEHI8Af/VOduCu9+djU4K/FZta/zuxRinGmG1sJ/0cVo74Vmy2xuVjuYb1pn2r2/6HsYb65yyV+U637Kex3sHPvkl7fhf4dGzq+X+BNdrewnGSiReEMWYPe289DvwjbHzZ92CN2T91ZX4ZayB+AVZO+BbgNA/fN2Lv0W/D3kNXsAbcPcddp7/s9vdW7D3wI1iDau4Z/VNsSvnvxx7X/4G9b77pfrSpo6Oj414jzz/BUUdHR0dHR0dHR0dHR8dpdB6sjo6Ojo6Ojo6Ojo6Oe0RnYHV0dHR0dHR0dHR0dNwjOgOro6Ojo6Ojo6Ojo6PjHtEZWB0dHR0dHR0dHR0dHfeIzsDq6Ojo6Ojo6Ojo6Oi4R3QGVkdHR0dHR0dHR0dHxz2iM7A6Ojo6Ojo6Ojo6OjruEZ2B1dHR0dHR0dHR0dHRcY/wb7O+m4W4o6PjJWV5MnStDVobDAZPKZSSE2WPy9s/blsRlAgix3W2raFuWtpW43nKfpSglDou5/5n7P/QxmDM6fuet00ExO3L/pUTZTRaG1r3b6XsvpUI2P8W219/HMfLFvUZg9Fm0U4RUOr6fRoDWmtXw3Gb5u2bnw9Dgza1PVZ33sRugaBs5QYMGtCAh4hyDXTlxUfwMLQY0wIGEQ9QGNNgaBHUohxoDBpjWlcvgEJE2XJ41x1LR4cxhrpqaeqGpm5pGnvfRHFAFAeIkht+A6fVMX9W1FVDVTYIELo6TqK1oalb6rqhaTRt04IIURQQxb59ttxmn/cLow3a2OeTbQPdb+YlojU12tQACB5KFOCeZS+Da2KMoW00Td0CoLyl953Yp/3if2b+Xjl+v8xR6vr73RiDbvWJ959bL0vv5XkdwqLc8nJxv6NXIKc2+nYGVkdHR8dLztx4KcqavLBGQJqEJHHgDCexnaCmpXEPeq2PXxBKCVHoE4Y+batpWs14WrC3P2U8LVgZxAwHCb00JIlDwsBb1KFdB6ZpWqq6pWlb0tju2/PUon15UZEXNZ6vCHyPwPfwPYXve4vjqJuWPK/Iioosr8mKijQJGfRi4shHnCEY+B5BoDAGdzzaGXUKpVgcb1U3lJU1Elut8T1FkoTEoX/9Pouapm1te1ybgsDDm78g0ZTtEVW7T2sqjGkAEAlQEuBJiJIQMLQmpzUVviR4ktitTQ0IobdCoIa0OqPSY4xp8ZUtV+kRtR7jSUzkbRCoPo3JaXVOozMak2FoF/X6qoevUoQbO7wd/+WiW83h3oS97RGHe1OODqZg4KFXn+HhV58hTgLC0Mdb+t2dxBhom5ambtm+csjV5w4QgQcf2+LBx7ZuKN82Lft7E/Z2xhwezDg6mOH7iocf2+LhRzcJQp8w8vG8F79z2LSaumpoW00Y2Wdcx0tD2Y7Imz0MLaEaEKg+vorxJQJufj++mExHGUd7EzCQ9COiNFwMMCrPvmMQQbftwmjS2g7kzUfxojggjIOFgaVbTT4rKbIS3/fwQx8/8PEDD89X9rdWNWg9H4gT/EDh+R661TSNRgT8wMNXHzn370fOkXR0dHzEorWhbTV5UXM0ytAYBIhCHxR4C4PDGUGNNaKM8zgFvvU4haFP68odjTKeubTP1Z0RF86ucuHsCsb0FsaR1oam1QuDrCxrZnlFVTWwAmHoO2MHWu3aNs4IQ58kDjBhgETBdQ/Zum6ZzEqORhkHoxmHo4z11R5nN4cM+jFKCZ4SiEM8X9kR9sYeT+AbAh/AGllaG8qyZZaXVG50PYp8PE8Rhf5iSK2uW2ZZSVk1hKFHGPgkMfieWhKJt1T6kGn9HLWeOoPJOEMndsZOD0NL3Y5p9IzQWyVUqxg0rS6wHjaFrwY0JqNodtCmJvLWCJShaHbJmquE3hBPYnyV0uqCqh1RtgeUeh9jGlfvitt/BNIZWB3HtK3hcG/CM09c47knd7j09B7aGD6hrFnf7COS4vnerbuzxnqkyqJm+9Ihf/buZxARoiQ81cBqGs3+7oQnn9jm4jN7XHx2nyjyaRrNxmaftB8TBN5L0oduW01R1DR1i4gQBP4Nnu6OF4eqHTGunkXTkPpnSH3rXfW88HQXx0vAdJSx/dw+2hhWN/sM13oEC4PIGkUI1jtcN7SNpm3sIJ8xxnqZgMC9e8EaWEVWMtqfWk9yGhEnBlGC5yv7W8tr2taeD6UEY3xECU3dUpX1wuPlfwQ97jsDq6Oj42WPOElBUdYcjjOaVuP7HkkcEgQeKhDysmZvf8poki9G5KqqIS8qAt/j3JkhURTQOFlg0+iFR6xu2uv00NoYisqum0xLJtOCpmlRniIMPFo3EleUNdNZSVZUlGVDWdVMswqtDUkcsLHWY3WYOq9VTV5UFEVNlleMJwUHRxlB4LO20lKWDVlekpc1ZzYGnNkc0Laao1FGltf005BeLwJjDbqyaphMC8bT0kkbBc9TixHHLK/IspLM7a90o9yt1myt99laH5CmIZ4SjIAxGk2NoQEn1zM0tKYCbdCmst4slRCoAdo0lO0RBisFVOLT6BmVPqTWU1pTuovn4akIEeVkiI2TBWpqPSJrrtCYDG0qDIZGzzCmxZOE0Ft9Ue+zjpc/SgmDlZTzD22QZxVHBzOKrEJ5ykmRuG1wg1l87MBNXTXWK9zqU8t7nmK4mvLAQ+sUecXhwQwwrqM4l9i+eFiJs0a3hskoY3dnQlnUnD2/QpKG3ESxdM9pTUvRlpS6oNY1tW4IVEDf79Pz0zuqo2gLJvWEWZuReimpnxBKiKc8PLnRYtVG05gGbTSe2DJWinf/MEZjnKe+bI8o2xEaJ7MTn0D1CFWfWme0pqIxBXmzR2NyfInxJCZQKb5KCSRGSYgnAZWeUrZjWlO4PQmh6hN6fYwxNKZAm8YpCAIM7ULGbWWHHp6Edj0+Ih7qlHN23bG4wcqmbilmFUopdKsx2tBbSVnd7OP5HqO9CYc7Y5Sn8AKPtmkpZiVN03L2wQ18p/LIpwX5rKQsaqq8IpsU6HZE3ItYPzNkuN5nfDDlaG9CVdQYbX83vWFCOkyoy5oiq/ACj7WtIVES3tdr+WLSGVgdHR0ve+ajW2XVcDjKqKqGNAlZGcRWWuB75EXF9t6IqztjemlEPw2ZzEoOjmYEgUcQ+mys9ReSu1ZbI6tpWvvQd/I8RNBaU5QN42nB9s6Yq7tjMIb1tR4bq71FnFeWV2zvjTkaZ86o86zRM8lJ4hARIYkCDkYZewdTqrpFCVRVy3RWcjTOGPRj2tYaTLsHU3b3J3hKsbaSUjctB0cZR+OMjbUeSglNa9s2y0pGk5zROHfHG5HGoYu5MowmOTu7Y2tYaUNZ1YynBeNJQV23JJGVQhJ4KA/ALI5LlobiDQ2NqUHPCNSQNHiA2NtkVl+maC9hTItSIT4JtZ4iraLWMzQ1aiExjBH3ujFLxlvVjsiaSwAoiVHi0eiChpzQW3NxXB0dxyhPsbY1IOlFNE3L6GDGoRs5v192he8rNrYG9PoRVdVweDCjyKtT47VeLNpWU5UNo6OMq5cOmE1L4jhg6+wK3ovkSWt0w6yZclSPmDUZWTuj5/e4EJ9/XgbWtXKbnWKHrWiLrWiLvt8jkuimBlataypdEakI5b0YudoMxjS0pmDaXGVUPkVjSkDwVULfP0cvOEetrcy5NSV5W5C1u2DsTRl7q6TBGRJvnUD1CVWPrNlhXD9H2Y4AEBT94AJ9cx5NS9Ee0uiC0OsTqD6tKWl0hjate64GhGpA6A2ctDrkTt2obdtS5pVVhswKimnJ5oVV0kFMiHC4M+aZx6+Q9GN6g5i6ajjcHZPPSpRSrGz0qYqa3SuHTI8yPCf5m44yJocZSS9ClBClEUd7E64+s0fuBio9T7G6OWB1a0CRWaMsSkKiJGR1c3CfruGLT2dgdXR0vCJQ6lgGWFQN1TzgPLDD1nXdMpla+V3ge3iDGGMMRdlQ1S1l6TxVxhwHwrtAXd9XxJFPEPrWo2OgaaxXKS9rsrzEd4ko4jgg8L3rDL6DUcbqMGE1DpkKlFWDMWbhuToa5+zuT1FKGPZjosjH95VLImFpWs0sqzgYZWRFRasNTaPJi4rJtCBNQuqmdYZfzjSrKMsaxHYAIxd/MfdizWYluwdT6qbFU4q6aZlMC0bj3EoG64bGJfjAGVjLSUHmbbOjtzYRhYeVDiIeBo02FSCLGK3GzKjrkUtO4eNJgsKVpabVBYJn47h0QmsKWlO48iH2lfTS5FbSRjNpCqZ1DkCgPELlEyifUNlYP8WdJzJotKbRLY3RtMbYGDml8MQlNMF5StuGoq0JlEfs+QTquIM0XycIsecTeS6hAkJjNHXbYIDI84k9H20MrTE0pqV2+/eVh7+0T4Nx6zSeCJ5S+KIIlMJf3ndekU1L6qqhN4hJ+xH5rGI6zmkbTZyGJGlok7a01oMzPzVWXtTa2A2XUMJ2UiFJQ+IkxJ//1oBsUjCb2lF8z/dQbpCjdZ5qP7CfMAoII5+0F5H2IlY3+vQGMdnMxn6cdmWMNmSzknxW0jrZsNY2uUVTt0zHuZXgBjfvmCpP0etF9HoRq2s9ev3IJrs50bmf5+PRWpNnFdmsdNKqpcQa2pC4cxeEnksyIORZRZ6XtM1yeZsAIIwD4jjA960m2RjDZJQzHudcuXTI5YsHzCYlvX7MYJgQp9azv/jcp7gsg6HSFVmbMWnGjOsJrdFshhvPrx5j41yXE+ycRDsvUqUrJs2EWTNjJVghUMGphti9xFghNK0pKdtDps1VtNEEKkGJ77xZS203trz17tvfa20y8maPVpeE3pBGDSjb0cLrJQgiHlU7IcOjdd6yxpQ0JidUJa0p7OCVafHEt3GxPvgqATHzXEh3RF011FUDLvFF27S0LmGMMYZ8VnC4M0YEesMYEaEqG7JxTpGV9t/TgqPdMZOjjOFGn5V+jIyEMq9sHVP7u5uNc6ZHM2aTAt1oxL3L57GDTdXY93tzugd5maKqyauautEuZvnGZFTzgc049BHEPhe1lfovBliNwVeKJAxsqMF9oDOwOjo6XvbMs94Fvo0vMu7heBKDzaQ16Mec21ohDH2XmMIaElXdEPgeUeCTxDYZRBT69NLIJrlIQnxPLSSAAEkUsL7SI4p8tjYGbK71iSPbOZxL9aqqIY4Czm4N8TxF25qFrGQ6K5nOCqZZQb8XMxzE9HsRZdWQFTX9NHLGljvWE2/Iuexp7l2q6obJ1MZU9XsRZ7eG9JKIXhqSumPSxlBWDaNJboPfXUyW5yl6aUhgg7lcp2bpPC9aICy/qRUeiN2mbA9pTUWtJyjx8aVH7G2hJGRaP82keprUv0A/fJTYWwdR1HpC3Y4o9SGamqo9RLnkFYEaYtBzcw5fpfjKJrkQefFeUa3RXJzt8sTkMgCrYY+1oM96NGA9HBAqH195nN6Nv5GybZjUJbO6ImtqirYm9QN6fojvOtW1brmaTbg6G7MSJVxIB6yE8aKOq9mEK9mYQDzO9wacifv4ShEoj0ldcljmtEZzLhlwNh1Q65bC7feozJnWFYMgpB9E+MpDxBp+k7pkUpckXkDqB/SDiGEY0V8ysEaHM555Ypvx4YxHX3uOR197lp0rhzzx3kvkecUDj2xy/qF1qrKhKmuMsfeXNobpKGcyzmmqhqY5DpY3Bi48vM75hzYYrqVEcYAxcPnZfZ5+4iqCkPYjPN+jKmqqsibtx/SGMatrPdbPDAmj/vO6rlprdq8dcfGpXbJpaduyFEuye21EkVUEK8nzqvdWNHXL1cuHPPfMHqWTRbVaL7IePvDwOg8+vMHqWo84CVBKsbs94vLFfbJZZZP1NFa2pbVh6+yQM+dX6Ls4TWMMly8ecuXyAdtXRuxcO6LIbYKdIq9YXe8xXElYWUtZWe2x8jJOfBF7MefiswtZYc/rnWo0zaWBs3bGXrnHfnWAwdDzewT3ORGOHUxqaHVFa2paUxOqPv3gAXr+OWJvjchbo2onLntgQKD6eBIRqJRA9aj1jLzZJ28PCFvrwVIEJN4mff88noSIeBTNIZP68kIe6I4ebWrbBlNiTEvjDLLIW0E5Y0ueh6FZZhXTUUZV1KyfGbJ+doXhep8wCq7Lspn0YzbPr6G1k9ICYRSg25ayqMhnJVVRE6chWxfW3fvP3rvGGLJxbg05ERvfFXgYA8WsJJ8WJP2I3iAhHcR3NBBwNCu4tHfEeFYukjbNE1HN2+17igubQx7YWEGAqrGDspO8ZJLbwcWqbujFERc2hpwJn98z5U55+f7qbsJyymb7nVPTSc4t2TtGjjs24tJUiiwtd+/Ul0OqzfvN4hwvncflEUj3r3t3fk+c0/8SznHH82N+z3iezdDXtsejYPP4B/sosB2nueHh+x6zmc3a53uKum4JA+vpiSPfen0im5Sin0bEUeCSVhxL0+IoYHUlpZeEbK732FjrLdZpbahcJzIOfdZXe4tsh0XZYIyVEc4/cynf5nqfydRK/NIkXHid5rFmtm4rY9Ra29Fb95Or65aZk3ac2ehz4cwKcQ2GGhMAACAASURBVBRYr5hnO+5FWVNWDdNZuYjJCgIPTynSxI5ui1xvuM3Toltj6noDy3YafECo9YRKjxFASUjorRB7W4goRuUHmFZPEygraYm8dRo9o9ZTajOl0VPAULUTfEkBIVAraFO6xBoKX/VcYozedVLFZczSs37xbF7cK3f3/GiN5mp+wB8fPgXAuWSNC8k6LYbIC9EYYlgEds8T2C+zvO+ybRhVOQdFxrgqGdclq2HMapQQeT6eCEXb8OR4nw8c7nAhHd5guj07OeQDRztEnk9rNJHyF96qwzLn4vSIWmtiL+BsOqDSLdO6ZL+YcS2bcFBmbMY9NuPewjNW6pa9YsZePmMQRqxFCRtaEyqPfhAt9j05zHjq8atsXzog6UU89Kotdq+NeN+7n2F8OKPKa6LYJ5uWZLPSdmwCD6MNe9sjdq+NKIuapmppl4yssqgI4wA/9PA8hQGuXtznT9/5NEoJa5t9ojhw9RasbQ5Y3xrQPNiSOK/VnTC/r9tWs3d1xBPvvcToYLrwtgWhTxB6FFlFUVQM7qWB1Wh2t8c88f7LTCfFIs17WTaURU2eV8RxaDMP+grfh92dMU+8/wqjo4zaGWKtS7Lzqtecsc87N1CkteHalUOe/OA1drfHjMf5wngbjzLOnFvh7PlVtDZEUcDK6p3J9YzzImljFp5SAM1ygoOlaSeMXnQD5jFtBk1rNK1pj58tbrsbBo8wBCpgPVxnPVy/odxyf68xDaWumNZTdss9ruRXSb2UrWiLUIXH/YulfRjmXrHjRs49rSfbc8vnhjEY09KaBu2mlPBVSt8/xzB8GF8SfJWQqRgRhZKASA2JvDUSf4PE32BcPcukvsSkuuhisRKG4cMMg4dJvS18laLEZ1u/h2lxlVrP8FSEJyHaNDS6tEqCE9NatKZCiY+nAp6PRrYqag53J8zGGcP1PsP1PoOVlCD0qMpm8T5NehEb51ZAhNx5tIMosLGLRUOZVzR1QxSHrJ8dYrSmyCrKvALnCZsnYPFDfxHzNT6cMjmYsfXAGqubA9JBQhDd3iQZzQqeuXbI9tGE0PcJXUKq1nmltDZEgUfgK7ZW+giQlzWTvGRvlLE3njErSqZFxeawRz8JObPaGVjXY6AoqoULMpuV5NOSsqgoi5q6bOycFZWVKWgnDbAIypOltJTiJAj2gRunEXESkvRC4jQiSUOiJCCKwxcrdvQlpypqysIGH87lFfMfTVU2C3lF6xIGzEfa4Hh+A6XEBkj6Hn5oZQpRZNN7JmloJSY9Kz2Z63VPzi3U0WGM9drUdctoUnA4yphlNoFC07Rsrg+OR81OM/pvckvNPUNtozka5Vy8csDaao9hP75e+rOYm+rGysLAZ2WY0GrDZFby4Wd2OBrnHBzN8JSil0asDBMKJ0/0lHBtb8z+0YxrO2N2XLzV+qrNXpjEIYNBTJZVPP3cHllRc21nRJZXrAwSjDHEccD6akrhEnA88dQ2cRwQRyGDnt1fGPgLIzPLq0WK+XnHwlPKGpqB7eQKhtBbox8+sjRqumxg2bmpgCUZj+2gzDMMCsIgfDUgpP4FQrWCEOCpFPDoB4/iS4KSkNjbIlBDPNUjNCXGNGgaBM8Fg/fwJL3piGxRNczKirqZp573iAKPyL/7VNmeKB5MN/mEjddS6dpKA8VnXM/40KTEFw9fPCLPJ/UiUj8m9SJ6foR/SjuLtuGwLJg1NYMw4kzSJ2trRlVB4gVsJinrfsp6NP8krEcpa9FxZ3jNfY88z61L8J2UL6yKhfxlfk2mdcW1fELW1KyEMZtxj34Q0QtCpnXJTj7jqMqddFDRas24KgnEY3XJcza//HM7W+vjuXPCyMcPfcqy5nBvSpFV5FmF73sL75PnKcLQZ7hqPShh5FM5SZLve1x+eo8iq3j41WcYrCTUVUOeFQyGKWubAzbPDRcj4Gk/Ju3HDFdT0sGJNt6CttEUecVsUlgDUBtWnBesN7D7rKqGg53x4tjuFUHgce7CKm37iPXuaetRHh9ljI5y0jRkfJQRxT6B79Hrx+RZxcH+DM9TXHhonZXV3mJeu42tAVtnhqT9CCUKrTVnz69S1y1pGrG3O6auWh56dJOHHtlgZTVlsJIwHCakaXT7BjsKXbBb7rFf7rMVbbIZbVK2JdeKbY7qEWvhKmvhKiA0uqHSFXmbo42mbEumzZSiLTAGjuojWtPSmIae12MYDBn4fSIvJlYR02bKuJkwbaZuu5LNaIPNaJPUSwgkQImi0jW1rjisjzioDtkr99guttmvDriYXcIYw0q4QuIlJF5C6v5OXWxY1mQ0C+PIGoCJl7IarDAIBgQqILxNplJxiXpCBvSDC8xHl4v2kLasiLwVIm+Vqp2gTYNgjSxfRXgSoPAQFItnqtFoaV2yCiuntnP/CXNBIuDq8Z3xd1JrMB/ikaXvd046iHngVVsLue/+1SMAvMAOerQnfhOn1R7GAcP1Ptm0YDbKePJ9lxgfTDncGeP5Hr1BwnCtR5FVTA4zAPzQRze27nn2wHSQ0F9NCaLbeyKVcPp8lWJVksoNHI5mJZf2RoswgaJuqJvGZRR277JTOwz3jlemgeVGXcus4mh/wsHOmP1t+3dylDE5yphNc/JZRZGVCz24cRIFm2/fpqMMQpuzP4oDkjQi6dsRMvsZsLbVZ3VzwICUMApuGIH5SKUsaqajnMM9e14PdieM9qeMD6yONp8V5Fnl5CENuj3W786Nq7lufh68mPYjBisp/ZXEBjhu9Fk/M2Tz7JDAjeQp9fKYK6Lj5YM21ks0zStGk5zD0YzRpHAxUjWeUgx6NlGEXnpg3skv1Ribiv1wZB/+daMJA4/eiU7Jwut6Yvso9FgZJNSNZpqV7B/OyPKKWVaxMojxlLA6TKjrFq3t3Fvbu2NmWcXROGc0yemnEXXTEjtP2rAfM8srjsYZ06xiPMnR2nBm03Y6kyhAVntMJgXbe2O29yYkcUAah2xtDlCeYnPNp59aA+vgcMbhaEZRNniewvdsKnhrYPk2Fg0IvTV81cdmEDzt7C2/5OeuI7GdByflGwSvIvUvoCTEVwmCnVDY8yI8FZP6FxDEyllcbJadbHjeqZjX59mOx008WHldsz/JyMqaOPCJQ59BEuF7Co+7C3r3xOOh3ibr0YBJnTGuc0b1jKNqxlE9XdxbqR+xEQ7ZjOwnVL4zUq8/Z2XbcFTmVLrlbNLnkcEaT433uZZNaHzNuXTAWpQ4wypxxlTCWnTsSZmvizx/sW4ubQs954VcUhbMmoqr2QRBeGywzkP9FTxReCLkTc1hmXE1G9PzQ1I/pNGasi3wRSj1jaO48+QyxnlgRIQwCggCO8p9tD+lzO1gXJSEhLE1vjxfEYQeW+dWeOx151hZ75PPKvKs5LkPb/Psh7eZTnJW1/v0h87AmpUM13qsbfV5+DVnid2gpue7ScDd3G13SlO3zCYFh3tT8lmFbjVrWwNe/foLnH1wjaP9mfNoacYHs+d/w9wCP/A4/8Aa65t9O/BoIM8rdq6N2N0eUVcto1GG8oSVlZQkjchmJQf7U7bODnngoXVe9VFnCQIbFxqGHkFg7zNr8NqYUz9QxEmw8Dq8+rVnef0bHiSOA+cZs/MQ3Sl5W3A5v8yHJh/mdYPXMQgGjJsxH5p+mIvZRR7tPcpjvUcBKHVJrZvFo6LUJZN6Qq1rJs2UKI+odEmpSzajTR5KHuRcfI4VcAbWjGvFNa4V22wX24zqMa8bvBZffFQoi+QVlS6ZNRk7xQ4X88vsFruM6hHTZoYxhlkzYz1aZy1cYz1cw4TrxF7MtJlyOb/CXrlH2dp2tEajTct6uM7DvYfxlEdKQuD5t+zbCR6eRLZ/EjxAqAbMmm2m9RWm9VXS4AypKSj1GG0aJ9kL7DYSuOfZXAZuMLTYbK3GZf6bT7w+L6HdOrVYPvfEyeL/xyMgd9MrTQcJWw+sEYQ+B9dG7F2zBlZvEBPEAe0is+6SrOIEcwNLeYrpOGd/e0Q2tdK/4VoP9cgmw/U+k6MMP7D3bhj5aHdPVkWNKCEdxPRXUsL49iaJuLhRz8VPH7tN5NjgMoZxVnB574i2NRSVNa7j0CcJAzsVCnMP5/3jnhtYVVmzd3XE7tWjRc77U3fse0RxQJyGDNd6DNfSUycGnFuYTWUn6CxmpR2RmuQc7U852BnbyQb37Wc2zp0BUFLklc293ziJgj4OgPN8tTAA/MAjiHzixAbfDtd6DFZT164eK+s9Vjet0dUbJqT9mNi9TMI7sLhfjixb7lVp3bxFZoOas2nB+HDG+GDG0YE9r6ODGZOjjOkoW/Jm1YtAydbJP5gnEBCxI5m+IoyDxbWea22H7vyubvRZ2xqwutl3gdQJ6SAi7cdEcbDwMN5L2eBcp1uXNXvbY/avjZYeJjcnCDw2zq2weW4F3801cr/kjJOjjAMXPNo6qcid4PlqYcQmPeuJvV8BznlWkk2KxT2TTYpbnsMkDekNE3qDmKQXkaTRHc3aLoBSVmvd70Wc2RzSSyN6iU1bnsQ2biqOAjbXegS+YuhiFeLIZ3WYkMQBg35MFB7L6KLQZ2OtR1W3NiA2DggDz3pe3fp+GhEGHlUUEEfW47NMGPqsDFMQWcRaBYFHmoQM+zGDfkwcBQwHMWBsh8nPUcpKHfs9KxfspxFpEqKNlfJZI80G7seRTbCwtprajpNSRFGA7ynKuqGsGiLnHY7dcqWEXhqxqQ2B8ybkRWVfTJ5idZgQRc64cvexR+iyUN0cc4OBdf3rXXkDAq7PAiXO4FG3qPv64PYbpUTgUlNrTaMNu6MZH7y8y9E0Z6WXsNqLubA+JAkD7vZ2FyD1IhIvIvFCIhUs4vxa05K1FUVbMW0KG8DdlkyanMNqSj9I3LYhkRcQq2AhT2q1ptItWVNT6pbWuLlxlBB6PqHy7V/PI/Ssh2zOYr2y6wLl2eQWWlO0DVlTM61L96komobWuWbztmZSl65+u512OtO5nMtmzrT1qhPPMs9ThJG/6Lwf7k9p6pb+MKZpWjAwPsqpq9oOsmlDnNjJt5VSxGlEfyVhZb3P+taAsm8NsSvP7DE5yhCEsqjctWUhY+0PE1Y3+u59HNz1M7ZtrVRpNs5pm5Yg9OkNYuvF2hwsDNX9nQne8zDcbo2dkLVpbZKL6SRfSOvKsrF9EhezVpUNSRLStNr+XvsxW2eG9PqR9dYfZoSR/V33+pGV+Pr22YWx57rXj+m557xSisEwYXW9d9eTDbemJW9zRvWYvM2odUOla7I2Y9xMGNdjRrXNeFe0JRpNpEIiL7L3urGJB2IV0ff75NpDWoU2mlE9xndJY4bBEF95RComEN/9vjIKXVKbmtbFr9okBgpPPOtpUgGhCt2nIvFiG7vlpSQqJpAAbTR5mzNtZkzqMXmb44vPwB9QG5tK3mAY1SOUCFvhJrGKb5nq3cryGhd/VaFNRaNzK33WGYHu0eiBkzkfDzQfG1bzugVBEagekbeC4FG0h2hT2xgslM0aqPq0EuGrGE+CE6oBH8SmjNeLwbDTn5mnEaUhKxs2DfzAeY3EJU7pr6aEcUAQBaxuDXjgsTOsbg4IQtvfGaz1aOqW4Vpv0bdQys4fNxtnTEc5QRSQ9mMGayn91ZQoCRms9tg4t4puNUEULBRlQehz9qF1hms9oji45eTgc+bqizjwF7J53xPn2TXUbYs2ULctedlQNo2V1GtDPwkxxlA1S/LVOzprd8c973kVWcXjf/ws7/qdD1Lk1U3Lpf3ISQFWeM0bHiTtP3Dzk2tsRqP9q0fsXDniyrN7XH12j6P9KdNRzmxaUOY1VXHc4W9cRpS5YTX3Xs0rnM8jUVeN7cRnimxc4AUeh3uTRbaiMA6s7ntzwNpmn/MPbXD+kQ22zq8uAgJf6WTTgsOdCbtXj7j63D7XnttnfJQxPpwt5jewsksrvbRa73YxD8f8xzKPi5AWjFgdd9uI9TTktTPcMoJwng0qIE7t+e0NYrYurLF1fpVzD61z/uEN1s8O7Q/4HhsIxtiJ8WaTgsff8yzvefsT5Fl1HMN3grkyLB3EfOwnv5b+4HX0hgqWXNT3mr1rI977h0/y9AeuLmSvd+LNTtKQR157nkdfd44zD6yxeW7lvhlY01HOlWf2uPKs/Vx9Zv86D9JJzlxY5eHXnOWBx7Y488AaURLeUcIAUUIYeigV8eC5VesxqluCwBopvSQiSYJFjFFZNwuZXy8NOX9mhVZrotBmFfJcNsBeGvHwhXU21vpugl9FmlgjRXlCmoT4bqb5VhtnxF1/LqPQZ20lIU0CqqqlqptFXFgY+AwHsTUMnaE26MeU633qul1kNeqnEYN+TOBbw2xtmFpJpAt0n8dmDfsxg541HLWxsWFJHHJ2c7hofxwH9FMb05UmIYFvz8HGWp+maRdZE/u9yGZYuuv7937c+Leu0xgbrJxXNZf2jnjPU5e5ejDhwvqQ8+tDfE+xMUjpxXc/j8q8kxKrAAn7xF7IwE/YjIYcVBP2ygmTOmPS5OxVYy7n+wTKZy3oczZZ5Uy0ynrYt7E1oog8n7JtOSxzat0yrku73Lfrny8G6xnLmppRWXBY5i7ZRcZBkVHrlsTtczefMioLVqKYlTCmaGoiz2cY2oxgjdGkfkjPD1mLUmLv+neZ56mFNL7IK3YuH1IWNcPVHsrzKHJrQLROIQIQTe2gGAK9fkTi4guVssaa8hSinLFRVNepHjxPEYQ+cRra+dnuoLN1K7TWVGVNnpUYIHbZC+dGShj6xwN5pyTMuRvmxlWR11y+uM9zT+/SNDYTYttqJmOb/MNbmswcY/B8xdlzK7z+Yx5kMs7ZvTZm+8qR8175PPjwBg8/tsnqulo8v+4fc8+AoTU2O14gAZEKaU3LpJlaBZEurdw4UMTEeCh88Yi9Hg+lD3EhOc+szciaGbMmY9pM2S52GPgDDNDz+5yP7XmftRlFWxKrCLXkgRaEUEUo32Mj3MAYYw26MiKqQx5MH+TR9BGGwZBQhfjKpzGNm1drRqVrQhVyNj7L2egMRVtQ6pJpM2PcjBnXY3zxWQ/X8W/RHTampTbWoMqaHbJml7w5cGnZ7Zx+d4qSgNhbZxA+SKNzpvXlY68XPgbtkgPZMwDGGXV22gtfrDFb6wx0wfPNutpfSfE8z17XKMDzhDDyWdsaEsYB6SBZhM+sbg7or6TEiQ2P2Ty/ymA1JYpDwiRYSHgH6y11MXQDLTZkJIwDBqspfuCxujlw5e1zxWjD+tkVHv6ogv5qynC9jx94dzTg6nuKxHmi6qalavUicVXbanRhaJ0EUSk70JJXNaV75173Xr3PirR73vMqi5rnPrTNH/7m+5lNipuWG6ymnH1gjYdefYbhWo9HX3eeuShnblkaY2wsVdmwvz3m8tN7PPfkNk+9/wpPPX6FyWFGkVd3pZ9uWwN3uJkfeKys91jZ6HP42gl5VlFX1sAIQucF849vjpdzkgZjzCJeam6M7l0dcfW5fS49ucNTj1/l2SeuMR1lNn3tXZzbhWRF2ySl1C1Qn1rWehOt7OTCo5tceGTLpvLU1tjpDewcDHNv2D15ETpjsCxqLj65w7t/74NMjjJnKN5kG4GV9T4bZ4a8/o2PEKUhfvD8dc+3btbxfX+4N+GJP73Ie97+IfJZSZ6Vd/Qc7Q0TsmmJ79vOynAtBe5d8PYy2aTg2sV9PvS+S3z4fZf58PsuYfTNG/no686hWxs0O1hJuSOLEVAyl7NBmoRsbdxknowI+r3rpX2xCpaMomMPCUAS+yTxwBrcLjh2ETsoghdZr9itmMvs+ulx1qW5R2j5OZAmIakbPZt7UOeZEU8+L+br9VJdp3WoTAwrg4Tl5DNwHAOZxMp67sz16+e3rI0re3737/16Id1JvcYYitpmgrpyMOaDl3d5bveIWVnRas35tQF1+8JiaWxwvk0qIiKEymcQJMSeNdoao2lMS1FVzJrCpmI3LZMgpzYNrdYEymM17BMoj54fUrcttW45KHMwkHg+sfjQ2PebaIjEIxAPtO0QzK+NhxApj1A8FMq+E9uWvK4p28YlPzHWQ9bWiEA/iFBiPVujssBg8J2Uxq5T1Nq2yRpXVnoYe9d3BzzfI0ki4iSgyCu2Lx8SxgH9lYQw9tm5OqLYt8lWdKPxfOXirFo7OBn5+MGxl9TzvYUaoW1aWpfGHWxHaC4rj6Lgnkw2atw0B3VlYwqD0IYFzGM3fN+zbfTVPYv9bd17dTYt2Lk25uknd+wzLwkRJWSzktmsJE0j0l64GPj1PDvPlucrLj67zzMf3mF3x3pYRNlpJFacBztK7Px11/kslp4rLwTrX7EeI21sSvTWaAIVkHgJBivJ00ZT6QpffBIvtoaWePjKp+/3OBef5bHeo0ybGbN2xqXsMvvVAdNmSt7mgCF18VKNadgtdzj0D4lUeN0zSYkiFEWoAhoztG0UoXFJHs5EWzyUPsggsO+EWtcc1UdMmimzZkahCzzx6Ps9zsZnyNucoi1oTWtlic2Ys/FZ5wm6OcZl8Wu0TZNetiNaU6LEQ3HsabKT/sZLk/96i9hVJT6+igm9IYm/xSB4kEl9iVmzTdnaqS2UBC4pxqZN/25qu19T0OgSX0U2JbuxxkGNwpM7T24hIouYxmV6wxuToNh4x7Xrlt3MoTDvV85DcOSE6qi/ar1Z94LQ9+gnEWXdUFT2k8YBSRTQuNTteVWThAFxGFA32ia4cl731k10HHt2/WnZiO8VL1kMVlO3zJwUbZ4zf44NPLcGzNVn9rj8zN7Cs3Lt0gEH22Nmo5yqstby/Ua3mtxlSXpWtpmOcrYvHfDgq7Z44LEtti6scubC2sLKfznTuhfObJJz9bkDrj23z87lQ3auHLJ3deRkaTPKor7prPb3EoNBt1BXLYd7U9rWkE0Lti8fcubCKucf2eTCIxusbvRZcbKRF4rtRFt9epyENgbAZXe6qUFpwGhNmdvYtHm83sl5UF4oc+9gkdkELvMYwjsdpNLa3qtH+1Nmk7szkO+Uum6YTUqmo5yqqG/bxiD06Q1jm545CW6q6763tPZjWuaxPiIB9tF3HHRs74nnI7S4keuyY9665HXZAm9W11yxfyftud0+X8ZjPneMNoZZXrE7mjHKCqrm3t7bBsO4yRlVMyZNxqTOydrSrcNGhInibLzKmWjFjfAbtNHMmpJJk/FctsswSHkg2aAfhJxPh6xGySI7W1NbVYVXQTbLKXVOEBgejVfpqRAKzayxMlM/8OgRcCEY4CtFKj661agWwkb+f/be68mOK832++307viyKDh6trma1lyFFHFDr/qv9aBQSLqSrkajnmGzm00ShC9/XJ70mXvrYWcmCiCAqgIKJO8MFuMQJOpUerPX/ta3Frt2iDM2qZFseSEzN+jlg2VTUzQNtdIkKrQ1uZ+4DWXTtFlZEt+0CCyHwLJfkiaCnlgMBnowlm4KlmcbZrsjRpMQrzVpMAwBSiDaCR0/dAgih6rU/U9563Z5cUJPSYXTkqgX/UH6hrjJy9RoJY5e4JK2/V95a/iiFJRlTdbm+chG3kj/b1XWLBcp87OYsqzwPIdo4LGzpyMjzk7XnJ3E/UROByEEnu8wbv8/ilwWiynxMmO9TpFScXq8RinF1u4QZ/rCAAO0m6o2m3q/d7YhBI5h45setapZlAsa1eCZLjNXV5Bymbf5bjWOIWlacmIZNoHp45l+b/piCEP3VAkD1ToLvk3l8L7QOVkVWZMRVxtW1ZpGNpiYpHVGJStqVbXGF3VvpnHZlWcIs+0p7SR+UW+bLjBxzAGuMcRTBbVVYGBimxG2EWAKF4GBa46ZOF8SWbfwrRmOMWRgH2AJn1rlvZTQNkLtoCqM3i2wW1fX2wXQqIJGlgTW9qXS7l8CQjsoffAhcOA57E4GDHyXqtERLE5bEW6k0vmOdYPbugUXZcXeZEBVN9jt97o3a+Q7DMOrG+dcF78ewaob0lhLxvKsemnmWynVEoGKZ4/O+PN//oFHfz/i9GjF4nRNU8sLsrQPv61SKm2YkVXEy5RnD04Zb0WcH69YL3SPzKjVkP6Wq1eg07vzrGR5vuHHvzzjm//ygJNnC+bHay336I/th3dYAaCrHlQ1y9OY9XzD8ZNzHM9muj3kqz/dpSoq5Gc7fU/Re0OAYerZUi9wCIcBWVJSVU1bbXs9tMVwxWadEY18bM/GubpB0+VoJxbKvCJPtXNjlpTXOg+qUS3BiknW+QclWHXZkG5yTbCKNoD2LbAdi2joMxiHuL79C81FSFAlqtfGNyi89j59UYF8l2rO63CVRVx1Nb/xR8kvDqkUm7zgdLVhleR6RvKGlx9XKc+zOUf5nKN8wapMsAwLS5js+xMO/Bk77oiREzKyA03ZleKHzRH/z/x7TvIlt4MZEkVoO/iW3WeNKaUoW0OITZqxah34prtDdnfHoBR13pCS43oOHhAKm1t2pOWfwkJJhdEInMZg1464HY0xHaM1sjDoutmkUv16DSEw24tJ9yy0FdK2B8sUrw9Qtm2TMNL9sIuzDcfPFviRh+vbeJ7Dub9qB/gGQigtuQt0APCqTDXBSrUMUElFWWgjCykVbtuXe9GA4aYvd8MQrQxdvzOytHxB+JQmfGlSUBaVlgDfwDrLoma1SDg7iSmLGtez2d4d8flXewShy+OHLiC07L54oeoQAvxA94EORj4Hd6Zs4pwnj854/PAcJSWnJyvqWlvVT6ZhX9kW0Dslvy95MTBwDAe/rSzNywWWYeEaHjPHYlWtWFUrKln1vYRaRgi2sPDNAN/0sAyrX54lTAxeSA7VJdWi94FSikpWpLXuwVpXa9I6I2u0O2J3f3Q9XQMrwjEuJ1gCC1uYWKaHbUSEaucVcwUTQ5h66artlRLtvdG+Z1xzjN2aCInWyMcxI0Jr7yWrhReOra2pkKLfbj2H193Lui/LEG82A/pF8QuQK4CwDRBWsnuuvlBtcOFZ2ylEmm7yeSJBzQAAIABJREFUQSmM1hyjg9FKkz8UfjWCJRtJkVekSdFbf5dFjRCQJQVHT+YcP53z9395wuMfjjl5viRephTZ66VmHxpKKVTbb1QB60XC4aNzZKN6aeD+3Snj7QHDcfiz36+qhk1asEkKHNvEcXTDvGNb13JGetdtL3Ldo3Z+vObw8TnPH57y098Oef7TKatF0g6S68sX9sE2kjbzQ2eIlIWe6Xz8/TGykWxa85LdgymjmTYh6XBtmVP7fcMUeIHDaBKQxpkOzHuDlBG05KTINckeTkLCwc1K75RSmsQvEjZrfT6uS3KllGTpL1TBKmuSOO/DCi81CXEsgoHHYBS0kQcf/nGs5Bopj1AyRlesTIRwQNgIESGMEYZxUXL4btt01WvwKt+7+rL6/7qR5f3WIaVik+sK1jLJbryCBVDJmqzRvSUzZ8jY1lI/27CYOUO23SFjJyKyPHxTz64oFEPLZ+JEVLLGN12dKCYMTHFB+gsYDlgYVGmFQCsKDAWOYep+oY3ueTVM3VP3Qk7aym5aY4g8qxiOA7b2RgSO30tSeyv9V/pJL04gvO1nF2HZukcpGmpJ0nqZURUVjmPhRy5u2+Su2pDPIHIZzSIms4g8q6jrhvnpmp/+fsTJ4ZIiq1qTh4rdgwnT7YFe9kt487XakYi6bohXGZt1xtMHp5wfr1nNE46eLfACh/E0YjgJdM+XIRjPIuYna23KsUh5/OMJyToja+3l45U2wcCzfvZMklL3GVdV0/dPPX18zvnZhjQpOHy+wPV0ztRwHPQyKc+3WS4U8Trj7GSNH2pDnvn5hjwv+xDhbjK5yCsW84TlPNESUSEoioqToxXLRUIQOAwGfm92AQLbNvEDF8exkFKyiXOeP9HbMxj4BKGD3zr4et7VesUNYeCa2qCiUQ3LaolneozsEaERUsiCdbXWZ+qVimNnSGGIi8qA/gp7ycbmXXBRkK9UR9ZeXqIQWqromNp4wzVcDMtgy52x7W713zOFiWPYBGbAyB691eCiWy7oaq0pDFRbRbowPQfoAfubLmEtAXx1rGeAsHnxhLi4VHHxf1+3wN8MPtQ7RnUTRerl3e2zaVtlgK4rgtAylJcIs0D2zuOmoeXAjVT63kbRSAU0FGVNUdU4lkngObg30Lv+qxKsqnXVyTPdxO+2nvjrRaKrK//3A46fLTh+NmezyqjKDzdYvC6KvOL0aEUS561bkXZS+/yPt19LsIqq5vQ85vnxikHk9Q5jg5BfhGDlScFqkfLo+yO+/aeHPPjrc1at82LZGlf8VqCkdiNKNwXPfjplcRazmifayfCrjE+/3n+JYL0rDMPQrpHTiNVCW/a+dbuUoshK4tZJsb5piZKCvCVH+nq/PuHtqq3Ls42+Nj/AILRDVTWkccZmlVG8RSLYzS7Zjs570T0c9i9SoVFyQVN/j2xOEMIH4UErxRDmFiafgBHxm3pbfcRrIZUiyUtOVgnL5ENIBHUPVilrAsvjwA4Z2kFPsDxTN/q7hoV1QU4mEPiWy447whYmQzt47YBDoPt+tOGDdtvT4zY901q1tuLrZarldEWtLcot3ZDe1DqLKksLsrRk//a0N2HSVubiZ+t7E65ytVu2SThoCZYQpLF+B1u2qbMhPVsHg7akIhh4TLd0n+riLEbWktOjNct5ovtmWvnz9t6Ig/tb7OyPX/uufBOUlFRVQ54WHD2d8+ynM548OOHo2YLNOsM0Dcq8YrYzZLozYLo9ZLIVMdmK2pxFWM0TyuI5T9vqmWEa+nhXNUJ4PzsunR16sil4/nTO00fnPHl4xsnhkjyvMAxBnlXMtgfMtgYMBtpheDQOef50wfw8Idlod1Hfd3T2VlEjWlMaKZVW86QlTx6e8f13RxR51YYJS5KkIN0U3L43YzjymW4NdD+XaPthhMDxbKRUrNcZDx+csFwkbO8O2dkdMtseMpmF1yBYJp7hMbAiFuWCRblkYEVM7QlDe0BcrTGFiSEMhFKaUL3mavpgnZqiI2vqRQD7y99oiZNPaAVEdoRAcD+8x/3w3ov9RPTyRc/0MN+Qt/fG7bjw3zeHj++gVyGVaslQ24/Miyp8Hy7chm9bpib3Xc8n6O/VjX5uSCV7F92yaijrGqW0aQbAcpOxjDMGgcfuVPzXTbBUW7Goipoiq8iSHJSiqmqOny54+N0h3/35cV+5uCoB6CzCuya7vnTYVVvbZlA9G9a64L/DtEpTS5J1RhpnmJZBVeqH4nimLWl1SrzVV7eaRpJkJefLhKrtL0NoF7LgQpXiJmcCpJRaalnUnB2vOXx0zoNvn/PDN0/56btD6rJ5J2LVN/G3x9gwRD9IgLZC3h9nUKqzcL/6OlQr4ejs97uKp2x0KN5gop1tXN9552BRYbQVrGnI+bF3qWtVVwmMl7raddPkRSlFnpYs5xviVfrOBKvIStbLlHSTU5U6f+lV04X32cbu/FZFTbrRsQlv21bDNNpYBgcvdPECF+Mdz9m1t5cSJVdIeYYQviZZ6L4ZE1DGXv/Njy+43ya6ClAjJXFecLrefJAeLFCUsiapc1zTxhQGnulgGdqAQinIW6v2bma+s2b3TYdtb0RguYzs4KVB58XKUb+mVrZyMay9zCuSOGO9TChzbeXdudlKqbS1dxcAn1WMWstkpX7+bH3bvX7V54BlG/iBy3AcMJlFzHaHjKYhfuC28SoBs51hv+7Z9pDRLGIwCfp4k6R9BtVtDpyUiiB02bs9ZWt3iB+6yEYSjXx2bk0Yb0W4byADnfRH93M15HmpjZAit3dCk43O6+qee7atrdmHrTX7epkiG0Welb3NdBC5wIDRNOrlhBdXqtcp9TqzCoQgHHj63DhWfx6rSkd9uK2j6WDoEw086FseagzDIAhdHQ1jmUQDD9s2tYSybNo+sap3OhTo3qzBQNuvj8Y+bpsVpM05tIX7aBIyXKSYlqnjbLKKsmxomuatxkOvQl/zHgNrwKJcENdxW4k1icwQ13SxhEUjGqSQWOKFicMLvP36km3fYiUrnZlVxWRNRilL0rZ3ympz9WRrsNH1cVnCxhKmHh8obR+/rJZIJbEMC4EmiaEVElkRkRmiAN/08IwXvTZ6WWZrzHH1fNMX985NvSvEhX9/xKvQDoA1ZdXocGEhevfdppGaYEmlTb1MsyVQ3fc0AeuiTFDoaBff1UH1uVYq+K6FaZpkecVykyOEYFrfjCHHrx40rKQkzwpW86QNDNZE4MmDU9bLlLK4htmC0LNuTusWZNlm71xktNaQTaMf9kVeU7YDdinf4h532fYrbVetlCIY+Ex3Rnomb3vIZGfQz3QKIbBMA8c29UChzcsZRl4vAblpdEGLcVsR/Nv/94inD045O1pRl807m1gYpoFtW1itg6JtmxhmG2ioOlmFnjXQL7s2K6t+d+31ZpVx+PhcH8f2hbR/d8b+3Rnmqy/Fq+7HBYIVDvRL722QktbkIiVNCurqZrXkHcFavUcFq5MxKql6uVFdyTao82YuMtnoRn090Csp2sbx10EIdIh36BIMvNaq+WZzzd4GITyEMcVQxYW/raEPetSBjh9fcb9ddAPrqmnYZIU2uWh7sKwb1M8rpUjrgvMyppYN82JDYDkY6JnRl64QAZYw+CTc45NoF8902HKHjOyAyPLfaKNdlXXfxxmv9Cca+drUps14zNMS0zTwQxfX03EWSulBhGWZeIHLUCldmQkcTPNq9sbXhWkauJ7NeBbx9Z/uMtmK2N4fM5rpDJy921O8wO3dQINIy39t22K3DTDtDCT0O1ZPzuiq0gAv0DEIyjS499kOtmMxGgeMZz8PPAb9vLZtE0KX/TtTgtDlzqc7Wk1QNfpYeTZ+4OAHDkGkHWgNw2Bnf4xhiDbuQkuKTFsfz6bWhMz1bbb3Rq9dZxi53LozJYx0IHCa6uBix7NxXUuvs3Vc9H0HwzT47MtdhmMfFNjOiwwrHZSqjZb8wGE48vF8h7ufbBGEDnXdtFIz0UfMjKch01mEH7x4T3XGPLOtiN/98YBbBxM91jEMgsglGnjaKv8a70eDlmDZAwxhUjQFpVlitMTLNVxsw0a2hkGWYV8rbkDHiTet29+K8+KcwzZseFGuMIW2WV9Xa0bOiLE9YmTrP23Dwjd9PNMFAVmTcZQfUcmasTNmZA+JrBBbOAysARtrg2/5baDxMesq7rfDNV0iU5OwkT1k5Iwwfwt9TB/xEoqqZr5O9Xi5NajIi4pNXlBVTVtQ0dUr0zSwDENPPAhBVlQvfRzL5M7umNB3KauaOCn0c9a18R0L2zL7nsabwq9OsGQ7qFwvElbnG3767oinD044fbYgXqZXX1B7VCzb1JrjC0HAlmVi2iZNowf7RVZhGLnWc7fb8D5uGZu11oM7ns10Z9CHJo9mIVjdw7ANbnQsqrohL2ps26Qs9cvkQ5CsumpI1hlnRyse/PU5//y/f8/58apvOn5XmKbRBzO7vq1n7BwL27a0zKZuSWzb0J2lhc4ke4/m1u4YF5mePZZtWXhrb/TzWccroiNYw0lAEHlYV6hglXlFvPqwFazVecLmHStY3TZWxYUG7rrR1x83YXHfVp7LhrKoKFIt730jWgmLDuh2+2DCXw4uwpggVAkqB/LW8EKTLD5gw/VH3BC6qkUtibOSs3XCuq1g3SjBAtKmYF7ELKvkrd8VgGPoWfV9f8LUGeA5l8uwqrIh3RT6edb2EaWbgiwrSdOCZJOTpSXRwNMyvPYZq1prYdMy22gQi/FsoAfclvFB5gcM08AxDRzPYjwL+fof7rz0892DCbsHk9f+7s6tMTu3xq/92etw57Md7ny289bvdJNrnURx7/br1/06bO+P2N4fXf7FV9dpCCxDrzMIXW5dY52DocenX+xe+ft37s24c292jY3Tx2TS9r3dBExh4hku0hpgCpNCFhTyNQSrDQK2hfVSbtXl0L1TlaqYl3Mepo84zA45K+esqhWNqknqhLUTM60nFG6BKUxG9lBXsSwDt9aVqFzmHOXHnBVzps6EPW+PPW+XLXfG0B6wqWMC02ddxRzlx6TNi/FkZEVsOVO23C1MYTCwB9eUCX7EL4GirJmvEs6WCZ6jQ7fXSc58nVKUVR+TYraSW8s0epfAVZKzTnKSrCTJSyLfIfId7u5OKKuGONV+CGoU4rl2S7C40YH4r06w6qrh+OmCb//pIck647h1tEuT4vW/IMBxLGzXIhoGjKYh0UgP3vzQ68MEHdfCbPOpLlaw6qahLpteapG1GufNOmU9T1gtErJEzyZet8KTrHOePTjFcbRz0f6daZ+PJaUiLyrWcYZpmno20jT7weZNkqu6rRzNT9Z9PtHjH47JNgWyuRqZNNvZ0qCVVwzGAUHkEoQeXujgBy6ub7+oFL5SwepkE3WlXQu7Gdp0k5NuCk2o5wl528t01epWkZWcPF8ghCAa6dnO7Vtjglb7fh0IQ0tgRtNIE6xLKlhKKvK8JF6mZJsP04PVGVTEy/czHemI1maZsV6mWopyA5pi2fahJeuMdJNfegyE0Cnvw2lIOPSxHYuiqTlMY46SmMB2GDkeke0QtK5r/e++99Z20E2sigIlN1oqaAwwjBlCBLzcPn3NJbf3UtVINllB3H42eUFaVBRVTVk3vZShNxh4j27vUegxjXymg4BpFDAdXF/O0DSSWkrSomKVZqzTgiQvSYuSota9MnVb2ZdK9S8w2zTxHAvPsRj4HgPfJfIcQs/Bsy+cu2seznWas0wyNnmpJR1VTVE1FHXdSzxWac43j4+I84KqdYUq64bzdaKd1JTiaBEz8K9n7TkbBHy6N+XW1pBtd8TvR3dJa53hePE0VaqhkjVFU5E3JbVqepJ11Yqs7ZgEkctsZ4hpGmRpyXgWMhwHWJaJbVu6H7l12euer1oyrZ+TpqnfZ+HAw/GsD1Z8/a2Zo/wa2/NbOwYfGkIInXkF3A3uIhAEVsDMmWEKk4kz4b66R6VqQGEKE9/08U2fyIqYOFN80yW0dO+TKSxcA7bcGV+ozyhlya67i2M4TJ2pjg6wx2yahLzJcQ0X13TbHqpW5tcuq8voisyQe8FdHMPGwMQUBoEVMrKHDKwBvqnt1CMr4pZ3i8iKKGVJ0ZT9fl6sYEVWdKnJxUf8OuiMUWop2eQlm6ykarRcMPAcXNvCday+t0pJrXToxiWuY2MaBoFnE3gOtm1peWBREqe6KhanOZ5tsk41IbMsk7rRcQK9IPQdnwO/EYI117alWclmlZF12T+vgehmxAcee3em3Plsh/27M6a7Q2Y7Qz3j176Yuh6srj+o6x2RrSa6aWRfOTt5tuDJDyc8eXDC/CTu5YPXQRrnPP3pjLqS7N2ZUpU1ru9gCN0/kBUV601OGLg4ttsHHN545arWpOb8eM0P3zzl//3f/s56kVyLNFq27pmZbg+5/ek2t+5vsbU3YrY7IhzqbBTHtV7qxXq1B0sqhZJo2/GsZLNKOTtacXa85umPJzz+4ZiFVKisvDLByrOK0+dL0jhnvBWxtTfCtDW5uy7BuigRDAbeS5bBr4M2uah6k4v3kTy+afl5qg0q3rWCdRFlUROvUuJFqmUuP3PserdtLHJ9DNLNm+/TDkJoR63hOCQcaBKbNzUP1wv++fQ5237E3cGIvWCAEOIlgnWzkChVoFTyglwZW21P1vvdgAqomob5JuVwHvN8vuZwseZsnbLOcjZZQVk3uvdSvX8g6N3tMZ/vz/h8f4vP93k3giUlZd2wTDIeny54crbidLXhdJUQ5wVZUZFXdd9IbFumdldyHcahxzjyuTUdcTAbsjceaBtx+93P3ToreHK65HAZ6xddqomqPn5l+3ItWKX6eHbkr6obzuOUdVZwuIj5l4eHmNcMjvzy1hb/k/iCWzNNsBzTopb6ur54mtKmIK0L1lXKvIxZVxnuNfo3QDtpmpaB69oMJ4EOq7et3gBmPIuQUmK0blddT7GC3nUO9BXbVbM+4iNuCgZG3/N0L7jDjruNKUwCK2gJ1pjQCnur9S5g2BAGsg3oNoS2egd0n5OpXfwG1gCFxDXclmBNiKyIWlU0qqFRspfjml1/1Cs9UgJBaGmCtevt0uUWdiHHltCfjmA5hsOO2u63rd9PYWAKq13+datwH/GLoR1LNo0kL7XUz7ZMPMfGbSf6PMfu5YFFVVMkOnxYCIHnWJiereW4ro1jm+RlRdq+TyzTIE5yXNsiTnLWaY7n2lR129v6npLBX51gyUb1ltR1mwH0uoFr14waDv3WJWjI3t0pB/e32TmYMNkeMNke6P4rx3qrt303wFFKsVllxMuE4STED/XyDx+f4wcOq0VCGudvl0BdQFnWxIsEyzI5P1kzP9WBgn7k9lS8S7yW7Z9wM7NkFxuoN6uUk2dLHn1/xNOfTjl6Mm+rSW8fsJumoTNOAofJ1pDJ9oC921Nu3d9i786U6c6Qyc6QIHR7WeBV0DknpZtc2/huD9tz6XHydMH5yZrFqSa1RVG9Vb4oG0meltRVw9Hjc3789jnCELieTTjw9YDEuFqPjzB0dWUw0dU5y377/iipKPOSzbLrwbqZClZ3PXb7tl4kOsPqNa6ZnamIYbZ2o20/1OsG7GVrKR8vE6LhzYTpqdZEI25NNC4nWALX0zLMcKArWI2UrMuCozRmU5XEZcFxumHmhcy8AN+y8C0bz7TwLBvXNNtG63fo3WqzSMBC4KCECzggHF4NG77yMehstxVscj3oP1snPDlb8fRsydEi5ni5Yb5J22pWSd20jblK9vkdV4XR5t10fRuBa7MzisjLivoak0B9w2/VMI9TzuOEw0XMk7Mlz87XnMcJZ+uUJC/Jyoqi7giWwjYNHMvEdx2Ggcso8FhsMuZxytk05WCasTOKGAUuw8DD7CddrnZsV0nOTycLHhyds+6qgG0lcJNXpEVJXtY/sxiXSpFXNXlVE2dvUD1cAt+1WWeFboI2PVzTfsn+WVccFbksSesSz7TJm5J1lV1rPUIITFPnrtg2eLwyIeTCZVMg/XP+gqPzv7cqy0d8OAghdC+SgIExYGAPXvq5Z3p45tXfJd3wtKtyXYRpmtdaVgdb2DrDisGVvvdvCU1r7pAVFatNznqTtePJVodhCBzbZDoKmIzCa0uo63YiMC9rNmlBkhSMhj6TYYDbSqCv+riRrRV63UjipGCTFpRlTd00NLKtDgmB79mEnoPv2Xiu/nSwLZMocJkOA7Ki1DJB28L3HHzH7qOOjFZhUVQ1pqEdAK22qmW1H8e2CDwHyzQJPYfJIMA0BJ5rY5kGQft3w1BHIdzEU/VXJ1hKadcf1VoxyjcMroPI5db9LW7d3+b2J9scfLLFeGvAYOQTDry+cmWYxhsbjC+ic8LzAqcPJByOQw4+2ebx98c83h3y9MEJT386ozhaXW1fpOolccvTmMOHZwgh2Gqb7izLwHVshKEta8tKS4duGufHa7778yO+/9ennDxbUJV1Hx78NtiuxXRnyNbeiPtf7XP/q3229kYMxgHR0Nfyy8BpJYFXv3EN02irXR6maTAYBUy3B9z7Yo/Dx2c8+PY5D/9+xOIkZn667meP3wbZSE6eL3v7zvEsYrqj3RuNKxI/wxB4vo0QAUHoYTtasvmmCoPsK1g324PVkavOgjlepaTJz8mLMPTgzLLN3l0sSwqyVKFeM9AuC02w1ouE6c7whrZVV7DWy+xKMsleIjgJCYc/l2EepTGP4yWmMIhsh6HjshtE7AYRO0HEbjBg5gV4poVhWu/w0DMQ2LpSZSgMZSGEC6oClaN4t3Mo276g01XCX5+e8OPROYfzNc8XazaZltrlrTywC8QVQm9NI67uqGm05jidNM+1LSaRzyj0CD0H+5K+wYuoGskyyZnHKX9/fsbfn51yOF+zTHNWaU5WVuRlRVU3mgzKF2G1VRtiWktJWdWs04L5JuPR6ZLtYcj+ZMCdrTFf3triy4NtXNvCukZ1fplk/Hh0zrePjylawlTVDWXTUNWSqpVsfFAIPeNuvUEu5EgL33SpVYMpzsmbkuo1WTy/CD5yqo/4iH930P37FcdnMX99cMzfHx5T15K6lhiGfleMBj5/+t0Bf/q9d22CVVQN8SbndLHh0bNzfnp6zh++2Oc/fHnQE6yrQkpJUdakWcWDp2f89PSM+SolSUuKsm4NWQR720Nu747Z3x6xMxu8RLA812JnEhH5rrZbbxosQ/dZWabRBwd3odu1lEwGPnUtXziKC4Eh0BL31ijDNATD0MMQgsDT1TDbMpkMA3zHYuC7NzJx9asTLNCW52+SW2n3M4PRNOL2pzt8+Q93+KQd/Puh80720xe/32ndB+OAnYMJTd0wGAWt+5Bgs85ZtTbhbyJ/HZRSNI2iyEuW5xuePz7HC12GkwA7cPAcm0H4Sn/ADb6bm0a7950dLfnhm2f8+JdnLM83l1cZ2oF7OPDYuTXh3pe7/O4f7/O7f7zPeBZhmHrm/F1htg4vugqpZ6w6Z6nd2xNsW1vdAiRxph2n5NtlVFIq5idr1vOEcOBx74s9Du5v4Ucelm1daWAnhCbWlm3hh24v32kaiWp+vnKllHbFkhl5ol1sOoLXLe9doMMmG8qiJk9KknVOlpQ/Cxk2DNFKN22CSDfBd4TndZy0LOqWYKVXrsJevq30MslrSQQnWiJoO1q66xgmgeVwlqU8S9YkVYllGLimxd3BmHvRiLgsqKS2Yh04LpHtYIlOQiL6ys6Ldb3u+HcVrDZYWHSzqPKCi+D1UdW6GnS4WPPN4yP+5eEhp6uE0/VGy2baapNpCE02WgmDRLX2sqonaY3U/VCvPl+EAMc2CV3d4xR6DqHrsDuOmA0CBr6Ha13+CO/WkxcVZ6uEx6dLvnl0xD/98JSjZdxW1to+q+6FZBiYF7lbmz3SSMUmL5BZzslK36OjwGN3HHGy2mCbBtujiFHg4bs2dktWLrs38rLifJ1yvNroibYL175l6uOobD3AqOrmpcdmZ9/b6fCvMsF2EaFrY5tmO9v+ZkdJyzCxMHENHQyay5JaNtcOA38ffKxWfcRH/PtF02jSslin/PT0jH/+9il5UVEUNQr9LNyaREzHAX/88ha41yNFVeuud3wW87cHx/zzt0/xXYdP72yzdXV/FwDqRpJmFYtVysOn5/z5b884OY/ZpAV5UeteUsPgs7tbKKlwbOtn42PPsfEcm8ng51HMV30WXlQ9dL8R+g7br3xvENyMyucifhME622Y7AzZuTXmzue7fPHH23zy9T7TnWGrPb/5l40wBKNZxJ3PdymLWmf8FLXu1VokV3Lfk41kvUw5enzOZGvA/r0Z4Thgexa95KAWBi5ReDMnta6aNox3w+HjOWdHK9bLqw2so6HPeBaxf2/GF3+8zWd/OGD39hQ/dK4st7s2hEAYBoNxwP2v93FaV8KmNedIriDN7Fwg46W2cJ9sD9i7M9W2tMYVZ/Zbq1vbtQiHPuFAWybnWfnz77YOeqDJS9FalHeN6O+KpmpINprIZ0lB0zS8jnk7riao4dAnGvoEkUdVN2xW2WuJTlloIrReJjdIsPQEQrzQEsHmKhJB/4VE0LItHNPi/nCCIQRfTbZZFhmbsiRtKvJal/grJXkUL3mexLimxch1GTkeY9dn4gaMXY+R6zF03DY08g3XqKpQaoNSaZuDFV3YthDB9SUkjVScrHSv1XfPTnlytuR8nZAWpSYcocd04DMbhGwNA2ZRoHuYbBMUbRWo6Q0xjpcbjhZrVmlBI3WlyGl7ng5mI7462Obe9gTHNnEti+nAZ2sYMo0Coiv0HeZlxSYrOVys+cvjY755dMSTsxWrLEcqhWUa+JbJJPKZRgGBa+PYFnZrwmMI0RObpChZJhmrRFe80kJLCRebDNMw+It/TKMUn+5O+XRvxjS6Wt/frdmI//S7e9zbmeiq2cXMKKUlMHlZ8f3hGT8cnlG0151tmYwCryd5u+MBwTUHFfvTIfe2xwgB5+WGeRXngeF+AAAgAElEQVRTyZ/LqaVSNEgWxYazYkUldd/Ir1C/+oiP+Ih/h7Atk8B32N8e8Y9/uMNsHLJYpSxWKfP2cxPQtk9dBejdRtp5UfH8dMXj53NO5xvqWrI9HfDlJ7sMAm21LxBsTyN2twZsTweElxgUvetI9NealvrNE6zpzoDP20H/J1/vc/vTbW27bpkfJDtKCMF4FhGN/J4oJXGBQhGvUporEqx4kXD45JzdO1PKXNtJbk0jJqMXDelGayt5E6irhuVZzLOHZxw+Puf8eEXchipehmjks39vxme/P+Drf7zP13+6i22bWBeCkm8anURzMA7wA4ft/VFLEjfaBrxqLidYUiFVQ7xKef7ojGikZYw7B5MrJ1p0JiiOq41TwqGvGypfR7DQ51ZJHXrcETFPOO9FsOq6IY0LlvOOYL1ezmk7FuHAZzQNGU0iwqHHZp1hWq+XsHY9WOtFSnlTBEu2MsmuB+syow+hgzI7iaBtm3iWxSfDCQfRUEvApGRd5hynCcdZzFHrMPg8W3OSJqRVycTzmbg+dwdj7g+n3Im05XJo2SC6UM7XHgWU2oBKwAgRxujCpoUg3oVgSY6XG759cszfnp3w5HTJWZz2Fahh4HJ3e8JnezO+uDXj090Znq0bcgHqRpGVFUeLmKNFzF+eHFFUNWlZQa0D0G1L68TvbY/5T1/f4z9+druXVFjtc8M0jCsZOuRlzXmsK1f/+uiI//y3R7oXq24wBFiWReg5HExHfLI7YRIFDHwX37X7daWF7oM6W+vlPDVWLDZZ7/hX11KbYijFYpPRNJLtYcgk9K/0nD6YDok8h6yo+tyrDlLpytkyyUDA49PlC4JlGkwjn4PZiD/c3eUPd3eZRtcz/fAdm3HogYBFFfNjfEjS/Lyfq1YNtWxI64JFtaFuCdaNyhA+4iM+4iPegK49w9m2mI4D/vD5Ps+Olzw7WvHjkzO+++mYzZscuK+JTh120cDsOsiKisOTFd/9dMx6o51f97aH/MPXB3xyMGsDp1XvBOi5Nt4bQsb/a8VvkmAZptFnLO3fnXH/qz3ufLbDdHuIH1zPgve6uJi1Md4acOfTbfK0IE8Ljp8sruQcJxtFmhQsTuM+MLauGzZpwSYp+gvWdS1C3yW4pvvdRXQDkbKo+ryr4ydzkjh/67YKAVbrXrW9P+aTr2/x6e8P2D2YEN2A29xl6KpiltVZ6Rvs39/ii2WKEKJ3lLxUfqMg3eScPFsQRB7b+2Oqsn7JheuybQBdHYqGPoOR/0Zy1a9SQV3WpBsdDGqa13cwvAgdCJ2xPI1J3+L0aLs20chnNI0YzzTBOnm+fKN8s3MR1BWslyWH7yNnvKpEUDf1a+OUaOQThLoHyxAGnmXgYfcP2dB2cE2LyNF9WBPHZ9sP2fUT4rLAMkxsw0AqxUm6IasrjtKYoeMS2S4D22Xg6E9o2f33lapRKkWpGKSPEh7dfJZA6F6sa+y7Ulr6MI9Tfjpe8Ox8zTorkFLh2iaubXFna8zXt7f5Yn+L21sj9ieDtiKlH7dSKYqqxrFMIs+hrLXrkWkITtcJ53GKbF3+ut4nwxD4jo3v2FfKEeuNfFDMNyk/HJ7zl8fHPD1bsUpzLNPAa/u5bs2GHExH3JoOOZgOGQQugastcDt79qLS27gzjpgNQ25Nhzw+W/L4ZMEyyUkLbYxxHifUjeTWdMjhIib0XELPJnDffn/4rRNUE3TGvC8gpe790sfLfalaaQjRuhvaTEKf3dGA7VF45XMKWpvvWCYI1Wv5zdfcHwKzl+mGlocAdr0xtvGbfI1+xEd8xL8xGEJAa5TjOhahr9ikJetNoSfE3nPC3rZMwsBhexrx+b0tTFNw79YU33OuTbLqWrJJCxarDCEg8h2mo5DtScTO1qA3muuCtztDitfhfVRUv6as+jf5ZrBsk+EkYLI94OCTbe59saelX6/2L31ghAOPg0+2kVJx8myJZRlU5eUxUl14MkCyzqhK3Zh4dLrm2dGydzwZjwJu7Y7ei2CBHoAUecXp4ZIfv3nK8bMFRfb2gaMwDLzAIYhc9u7O+PyPB3z2+1tEow9Prl4H0zLYPZhgmgZ13XDyfMHxswVScqksM0sKTp4tsGyT+1/uUeSVDg22Ta7qBWO7FtHIJxoHrBeXl9mrSrsiJuvsvcgV6ApWss5YnMVkm/yNVUfH0TLG0SxiNIuIhp6Wcb7hoaR7sDLiRXrp9XBVdBLBTZcF9iaCJdrePsvA9R1tkhK6mK9U+gT6peGZFjMvILIdtv2QfFiR1fqT1hVxWbAuCxZFyjzPeJqsyOuaoqnZDwbshQNuRyPuDcbsh0MCy8YyHKAGlaHkGjB7e2EAaTQI4+rCcoW+t7Ule8bj0yXHy5isqDANQeS7jEOf+zsT/nh3j093pzofyrHb3ia9HANNCqaRT+DalHXTZk0ZNEpxHqf679qqzckq4XgZMxuEuLaFccVrWld+JKerhG+fnPAvj3SfmGoliAPf5d7OhH/89IA/3tvrM60c28QyzAtOgFoW2UhJWQ35ZGdKnBX866MjHMvkyemSo2XMKs2Js5Kyang+X/PkbEnkOa1s7+33iGkYuAJkf3lcqGBJRd3I1jjj1VBd0b6gdQOze6FSeFWIllBJwDMcRnaIa/58JlW067KFSWC5hKbHxInw/o05lX3ER3zEv084jsV44OM6FsOBz6d3tpiMAqJ3GHtLqbTJRV4yjDyGocd46BMGLp7TOrW2La9dpey6/bO/dfwmCZbjWEx2htz9fIeD+1vahn3r7ZacHwJe4LC1N6JpJNOdAX7o6gDO1tzgTVCyNUOoJVlStDlQFctlyvPjFZalBwMImI2vN9v6KppaUpU1yTrj/GjFs59OiVcZZfH2AbVpGkRDn9neiP27Mw4+0Xb3vxbbNwyD0SzCjzzOj1dMtvTxLvPq0sDdMq9Y1RLHtVmeb9isMkzTwDfcK7sdOk5XwQp0eOclqMqGJM7ZrDIG4+vnEF1EXTVs1jmLroL1BmdJu62yjach41lIOPDxAxfDfP05q6uaLFEkcU6eldRVW9l7h1murvolW4ng5hInRcMQ2LbZ2/77oYvrWT+7vjppn2OaOKZJpBwUuuemkg1FU7OpSg6TNRLFWZ4wL1IOk5hVWbBpiVdSlZSNDsctmoYtP2BLhZiyAFkgVArK4uKhNYQHvL1a+eoxqJuGoqpZpzknqw3LTU6jJK5lMfBcdkYRBzPd03MwG712OUKAYWg3o8h3tcSukWRlxeFiDXSEpmGTlczjlNN1iufYzNTVrjWloKhqsrLiZJXw8GTBw+MFZaMNIiLfZW8y4NO9KX+4u8t/++mtVnJ4tZ7Lsg0iLqqappHEecEyyXvJ4Okq4en5inHoE3oOO0RvXZ5hCIw3CHsbKbWyoI0muLh1ndTY6EmW0VcKrwspG31uhND5PcK48DG1XFKYuKZNYLr4pr5WV1WKWRvYhoVtdPk9Vw8f7tDdY42qKWRKIbMXs3kCHbMqDFzDxzF8DHG5LPli1bpSBUWTUqniZ6pGTTItDGFhCxfbcK68fIXOGKpVSSlzavninjKEiSlsLMPGEg62cf3JKL0PComkUTWNqpGqQaqmX7dqc1Bezq4R/T86DNrExMQQVpvdZCK4/nl63fZJ1dComlqVVKqkkVXfY2IbHq4RYPVyZEWtKp3/JCsa9L50P+vOsyEsLOFgCVtv/4VtvXjcu/V2x+XiJJJelt5XS+hzoPf7Znqru3OjJ58aZLsv/QeJas9P9w8XBtYvjNzbM9XupyGMNkS4O1/Wi2/eyHZLJBKpGkqZU8oXahkhDH2sDFtfu8Lu7wWlVLuPEnnxWmyX1V+HF9bVZXXp82e094TVXot6/7p9er/UpesegzYTtlFkeUlWVMgLWXu2ZTAZBYS+oye23oK6kXoZeUUjdQTR0dma+TIhTnIcW9utl2XNcp3iuS+e0b7rEPg29mticuqmoap0/6/+U/Y9ut1z32ht2R3H6g2R3seU7SbxmyNYQmhic+vujN//x/vs353h+b/ODKFhGtiudpgbTkJmeyMQaAJzSU+LkpIaXVlKNjnpJqeq6tZKUze825Z5JbnP25BnJet5wsmzJcvzDWlSaFv2S6o+tmOytT/m8z8esH93RhC676y1vREILRcUAqJRwPatMbsHExZnMYvT+K1VQ9UG0ZVFxWq+4eTZHNCV0KtmdXUVrMHYx72CDrgua9I47zPc3gdN1VWwNmSb4s0VrJZgjaYRo2lEOPTxQ/eNDxMpFXWlj0ueFGxWOa6vXTPNa9h7X1xeU+v+s560vcn90zLxI5fhOMQLHEzz6gOZsmkomoZlmXOeJRxnG57GK55slpxmCed5StE0TF2fg3DI0HEJbYdVmfPns0P+Oj/hi/GMz8dbTK2EodHgCQFKAhfuW9VcXo6+gEZK8lLnLWVtBpVspXimaTDwXXbHEcPAwzKvfnw9x25NMQL8V6xwaylJ29T5ogqvbFXeSMkyyXoDjTjLKZumJ+/bw5A/3t3j97d32B6GmMb13PcMIdgZhvzuzg55WXG4iHnGuv/5Ji94Pl8ziQJ2x28nV78VKBSbKuc4XyKVYmD7RJaHZzpElodtWDiGRSUbFuWGh1VKWuckTUFgumy7I6bugJEdMLSDK1fPX0XWbHiafcez9Lt2gKowhIElHDwzYN//nFv+ZzjiOmoDxbI84Wn2HefFc1Q78O1gGx6BNSSyxsycW0ydW7jm1ZZfyZJSZizKI47yhyzKw/5ngTViYE0Z2ltMnF0mzu41trnbck0kCpmS1EuSZk3WbMibhFJmVLKgacNqpar1IFWIdoBuYQkb1wzwjBDfGhCYQwJriGv4uMb7B40DZHJDUi9Zlaecl4esq7OWJBnsuPe4HXzF2N7t92VdnbOsTtjUC9J6Td4k/eDcFi6uGRCYA8bODiN7F8dwsQwH88KQrZIFpcyJ6wWr8oR1PaeUGWWj89mEEFjCxTNDfDNql7WDZwSYhvXSst4dqieI+pxs+nNTyJRK5pRN0YYJazKpCZfsqG97nLpz5WIbLp4R4JkRvhURmENCa4SJhSGun1v4OjQtscqamKP8J47yn6il7l1yDJ+Rs83I3mZobzGyZjjtvaBQlE1GLlPSZk1Sr8iamKLJKGTaTwB0pFIrNDRBtIWLY3j63FpDQnOEbw3wzQG2eD8VzDsdA6moqpokLfnh8Sk/PD4jzUrtRq1Ub3H++8/3+MPne8wmb36OZ3nJ9w9P+eHRKVmubdjPlwmPDxeczTekWcn5MuH4LObHJ2cvuQV+emeLrz7ZZXdroInSBcl1mpWczjeczjecLxLOlwllVdM0CmHoDC3fdbi1M2R/Z8R44Ld5Wh8J1msh2qb4/Xsz/vAfPyEc+rjvKcF6VxiGwHBagjUN2dob6cFqWl5KsKRU0Er30jjvQ1kNQ+dhObbV+/G/D4qsYn4ac/xsoQnWFayzQfdfbe+P+fI/3OHWvRlB5P165KqFaWlL/sE4YHt/ws7tFWXZsDzbvLUXSylQLcFaLxKOny60c9044JKJ8x6avAQMxgHOFQhWVekKVrK+nGxfhrrWPViLszVpkr+5guXYLcEKdQ/WwMcL3lylU20VpMwrsqQgWacgAm1Hf81tVKpdXi21RDDOyNLijefFskyC0NMB3r575aqZAkrZkNQlp+mGB+sFD9dzHq6XPIwXZHVFJRsGtsPtaMj9waSX7h1nG35cnrMsM5blHUBwP0xw3Bp9ShvgIhmuX5rtvQxNa04RZzrjqm4d/0BL3DTBGjAKPOxrESyL6SDQBOsVB7y6aUiKinVaUJT1le0UmtZs4vGpDj5eZ0WfxwWwM4r4w91dvr69wyTyr/0cMg3Bzjhi4LssNxnfPD566eebvOT5fM049Plif3atZf9akEqxqTXBMtrKVWR5+KbD2I7wTN0nuCgTHibHfBc/46xYc1asmToRn0X7fCJ3MRAMLP+dxoEKRdbEPE6+5Z+X/3NfCTCFjWv6DK0ZQphsu3dwjKsSLF05WFYnfB//Ew82f+5n4btSlm8OmDm32HIPIIKhvYV7aeyxRqUK0ibmuHjE3+L/i0fJN/3PZs4tdrx73PI+wzacdyJYXZUmbxIW1QnnxXNW1Snr6oy01mSrkCm1LKlV1VesTGHjGHpQO7BmDOwpY2eXqbOvB/iWwDG8G6kZ5M2GRXnMs/TvPEy+4TD/UVcphMVXw/+ekb3N2N7RlQ8a1tU5z7MfOS0eM28JWVeV8s2IyJowcfa4Lb/CMQIEYAqrv6YUikqWZM2GefGMp9nfOc4fsqlXJPUSAAMTzwwY2luMnR0O5Jc4oo0xUQZvED5cC1pt0FCrirRes6xOWFdnrKtz4vqctI7J6phCZpRKVzcbdNXHoK1SGVZf3fTMqN3/qT5mzrYm+4aPMERfDXpfNKqmlBnr6oyHyb/y7er/IJcJAKE54iD4klv+5ygUgTnAoSNYkkJmbOol8/KQ8+I5i+qIpFqyqReUsqCSOZIX+Xi2cLGEg29GhO2Ew9TdZ+rsM0ZiGy72q6HjvwBkm2m42mR8+8MR/+t/+YH5KunzWTtFQ1U33N4bX0KwKr5/dML/8n9+zzLOWiv2SledmgaxfJFJ1akOOvyP/91nRIHLMNLRSM6FSlaSlTw/XvHD41MePD7jwZMz0ryirGpM02Q88BkNff6bL2+9yAm1jJeytH5N/KYIluvZ+KHLdGfIaKqd/BzXfidJ002guwgM0yAIXcZbA1bzhIUdX3kZXWUFqZgOdb5WWTWUpR7svOqYdd3yd54WnB+tOH4yJ16ml5pCdBehHzqMZyE7BxNG0wjb+bl865fExXV7vsN4K2Jrb8TiZN1a/V0+tGxqSRLnnB+vme4Mqa5ANDvYjjZiGIwCnCvcnFWpe7A264zqHStY3bmqW7K2PEvIkvKtFaxw5DOchtp9MXTxAwfb0c5CUr7efbCpJemmYHG2wTBNnfl1zW1t6oY8q9isM/KsaoOr3xyYa1oGQeQymoZ4oYNhvCxv6cwtNnXJpizZVFrqF1cFyyJjVeRsqpK0LsnqmqHr8jtrG8c0cU2rDyTe9kJku8zTLGHseJxkOovqr4sThJLMnANm1k6/bUK4IFwMYwvDuHoAsx5MqPY4q5eqX4JWFtm6+13nVuoznF5TRZJtNEDVNDSvrPNtkFISZwVHi5j5JqWoaj1Ia7cv8hwmkc8w8HDtd7v3LdPEdyBwbTzbxrFMGqkzvoqqZpnkrJKMvHq/Cu8vBYUiqXNOihUmBk4r+UvqgqNsyZ4/Zt+fIpFkTUlcZYztkD1vgiUMatXwPJsTWh57/jVDY1p0s/qWYeMYHmWTU6sKqbSTrSUcyibrpUmdrOptqFRJJYuWiGRUquhn2PvvyJy0WRPXPkWTXpCsXY5aluRt1aKSOY26eL41iXHMQBOEKy+zIpcJeZMQV3Piek5cnbOuz4mrOVmzIW3itoKVU8mylWw1ehCnBIbQMrxSFtSqJpcJSb1iWZ4wsKcM7RnDlnhF1hTPDPqKynWhTWVkL2PU50zSiFpL0FoSuq7OWVfnHBcPOc5/YlGekNRL8ialkzgqpWhaySHoiuaOd4dt9y6BNWwJTclJ8YiT/DFnxTPm5XNW1RmFTCll3h550Q70NQlWKIomZcu9zZZ7m7Gz3YvXrnL/X5QlZk3Mpl72FZy0iUmbdUt4X64wFk3eShgrfd221dPu2jUak1qUVNKmkiV5k5I1CUm9ZFkdMy8OObY14RrZ24TWCLslzu+DTrLYyTu7412pkqJJyZqYssn76tymWhDXc5bVCcvyhLies6kXJPWaoknIm7Tdxwp5sddXNNRoCWelCvImIW1iltUJo1ITb10tmzGwpq1s/v2lq5fBEALb0tlTn9/bppGS82VCvMlZxjnzpa4YvcnV+CI81+b+wYz/4U8VWV6SFzWLVcqzkxXHZ2sCz8H3bIaRx2jov2TH/uUnO+xuDfFcG8s0UUoRJwWbtODJ4YJHz+ccna3xfYc/fHGLTl/a9RhLqVgnOd/8/TnLdcYX97ZxHeulEOJfC78tguXbjGYR090hw0mAH3ptGNmvW1oxDIEfuIxnEWcD71qW3LKRlGUNSjEbh4TjgNPzmJNzTdI6z6x33cM8LTk7WnL0ZK5d9y6RBhqGwG6rcqNZxM7BmGgYtLlivw24ns1ke8DW3ohnP51eebAqpSKNC85P1uy9IRvqTbDbHqxodLUKVl01rclFrgn0u55EBXXZkLSB1nlWvrGC1UkEh5OQaBTgBbq/yXZ1QLKq1WsDkpta52wtz2L8yGXcXF+y1dSylRmmFFmpnQ7fcqlZlkkw8BhNQ/zAeekeVkCjJJWULPKMw2TN8yTmabLi+eb/Z+/NnuQ4snS/n7vHHrlV1oICCJLdbPZMz2jGrkYPetGL/nI9SmYyXWns3rmzdJNskgAJ1J5rrL7owSOysoBasgCQwEzPaSur7kZWZGRkLP6d8y0LLqqCi6oglJJxlLCXpDzJhjzJBhwkOQdpzjiKSYKARAV+Nxxc1SXP8iEvVnO+mV/wL5en5MGIv9n7giBMca4AVyLkCCFGCDm8kYu1S/mGyNs4p9fu9KG3j7mnexqJ//s3/8y5u4OI7yvrnAdYsyWXnZ26EIKwoyfnScwoSxgm0c46xTcrkBIZCuIwJIkCkjCg1gZj9UanNi+8LuvfQzlgpUvOqjlKSPIgRglJZRpK0/A39nPGYY7FUpmGtan4PDvgr0fPWemSb5av+Km84Eky2ZnKeVspoYhkSqZG/v7gGrTT6I6K1zpPibPOdHqa+z6To7V+cV+ZNdo2NyZXfRlnqE3BSs+pbfmIya6jdX6SUpviDXAFgQw9NU8NCMXuQnnjNGs946o54aT6M6+r71m059SmoLbV9WL9Fp2P6D6adQYjNC1eY7PSMwLhdTWJyhiHR0yiQ54mv+NZqghl1IHAD9PQtR0dTtsWbWsKs+C0/oGfy2+4qH/msnlFYZZeh9W5mTq8FrDXy5VmyUX9E9rVpGqEkiHGtlS24HX1Pd+t/pFZc0plCxpbbmiS/cPIWg/GSuNpiLPmlNIs/TQ0nG70WDt/pm6auGgveF39mfP6BbP2jHl7RmsbD6Rsi0F3+3KtlesBWh8Z67+ra22dEF7DJ8WSlb7qaHWRp3eqnKfp1zxP/wqHYxBM3htg3VXOWVrnGxKtqzDO0JoVp/WPvK7+zEX9ExfNz9Sm2FybPbh3W3rA7e1pNK1rqOyalZgxa08JqpBhuM84POAo+ZLn6V/77xjVuZj+wgBLSSIhGMmUv/3dMZ8/3ePias3Z1ZIXr2b8y7evuZyvd9pWmoT8/stDjg9GnjpvLS9PZvzXf3qBMZb9vZz9Sc7zJxN+83yfo/1rT4Vh7qdXSewdcp2Dxari1emc73+64PufLrmYrfj6y0O+/uKQPI2JIkXTGE4uFpycLzm7WvH9T5dczguGeczx4Ygw8Frnj4kePimAlaQR08MhB8cTBmO/6P8UkuulFBur6V5PsmtZ49CNoa0NxpiNzLOvd1qTdw9v56AsGq7Olpy/nrFeVg92GsIwIB966tZw7MNf44+kcburoiRkNMmZHAxJsnjnc8AYS7GquDxZsJoX6Ecs7MIoIBsmDMZegyWEuHa5uaXaNzRY74KvjLbdZKihXNc+uNfYWxdnQnib9nzk9zHNI8IoIE5DsjwhTiNc0WDN25/ZGEuxrLg6XzE5GG7Ckh9TWhvKdc1y1gGsBxb7KlRkg4Tx/oAki28ArMZoXhcrToolJ8Wa03LVaavWXFYllWmRQpAFEftJxnE+5PPBhM+HYw7TAYdpziCM3kpzz8OIRPmA3B+WM07KFZdVSG10J3wPcMSAxKHBaRB25+9NCJ9BFQb9lOr6L62D1ljKRtPq+01w3iw/8fHmGfoNcN1b3fcGD7uWtW6TW7Uoqi16oD+n54WnD77LufBmvTifsaqazcIJ6PRpLWXTbo5Hf7g+hXv6/eUIpHcKzFTMsi25qJcsdeEDiIXYZGJlQczTdI/LOuBbXlGYmsZp3iUba8OYEIpIJuTBGG1bSrsG12IxaNt2mqeK1jWEIr7THKT/LI2tOp3PCu2aW/fNbmlSGlt1i0bzYCfd0U+w1lS22ACFvgIRdrSvYefqeX/1uqKVnnFaveCs/oGT6gdOqx9Y6Vk3AblunMnOxEHJ0O9rdzVvTycsBmNrHOXm75QOqUxBYXyGoBIBxjXkwYQ8GG8mie9tgIGjsSVLfYUQirPqBa/Kbzffh3W60yAlG9DY/7R0x0LOGIeH7MfPN9sr9IKz6gVn9UsKveh0Z2xoidtTGeM0DX4SWpolico5bD9nL3pC9E46NEdl11w1rzmpfthMdDx4unlubeuslAy2viOx/S1tgJjG3GT0IFDaG04IBGrjBOuIZeYnYB942mOxtLamMitW7awDjxUnlQfHs+aUWXuK6eiovZFIIILuObN9DtoN6NVOv3Xp1daDaOMMcac7y4MRmRoRvMMk9TElhUAqbx6UxCEH0wHDPCaJA5rG8OPPlztvKwwU00nOdMu0LQgUP/x0SZZGjAYJ+5Ocp0djfvt8n8+f3j3hN8YyX5b8+OqSk7MFTaNJ44jD6ZDffn7AaJAQRwFNo8mziCQOma9KLq5WKCk4v1oxX1UMssjbvn8ILuw71qcFsPKY/eMxR59NyIe/THfiXUqI66lPlDyOsmit9RqboqY4NZwsS5rWL8LSJOJd+xTOerpSVTbMLlZcni4o1/VbN7g3K0r8lPDgeEw2TH6xIOH3qTBSDMYpo73sUQYn1niK4OXpgtWjJ1iKbBCTD5POBMJT7u6i6/W0Pg+w3k2D1Taacl13tLsG3S/M33jLPs8rjgPyQUI2SDrzDkGcRgwnnnpqtKFtbgFYG4rgkierKXaHLLe3t2Eo1hWLq4KqbB+clAbbFMHsppX8um35b+ev+T9f/UChG7oAUk8AACAASURBVFprO0AV8vlwzDhKrn9i/zMKY4ZRQhaGxOr2rlQoJcMoZi9OiaSiNYZaX6LbGtNmCJGASLD2sptkTVHB1yB3m2IpKUmigEESk0RqQwV0zl/n66rhYlmwrBr0I4BL3WrmRcXslmlPICVpFDJMYuJw94aTc1A2mtm6ZFU2tB2l07swaf715RnrumWYvD/3/3yx5sfzuXcU7ACicw5rvW6tt3jvHZ8+1RJAHiTsxyMmUc7vBk85iEd4p8A1Uki/aOoWgN7pzC8ZpZA+e61zH3yf6p0CczWmVGukvt6ew6G77nqicpRQ94Zluw5grfWM0qzQ9vZ7lcPSugZpyi3jCO0F+g8oNvVmgrVG2zfO3057squQvzQrrprXnNc/bcwH/L4vvXnADYc8QSAjIpkSyRjVTac81c529MCK1tXobkrUPx897Wu5McWozJpFe86z9Osb2/oQip/SrLmof6LQC87rl8zaMwTeTCERAyT+ui47gwjTAXSH85/ZOpb6ivNuG95cwWuAGlNuAHko441rYm0LP7Hc+szaapwrNzTJy/A14/CAUMaoHad2HtAE3fFbszYLGlvdCq6Azgkx8DojmRB2LoYStXHe066hMSW1LT0Y3pqC9iC5tY6r5tRPWm2JImAQ7BGKCCEjxKNVxXeXcx5glXrFVfMKKRS1LTip/sxF/TO1XW+aD6pzZ4xURtw5ewokdN+dtu3GEdQ6/dYxamwNetbpBROMMzxNf0uUJASPJvL/xyjnHFeLgu9fXrAqGsajdDP92htlpInP+4oCxbOjMYM85vX5gigMqBvN1aLk7GIJbkCWRB/wzHh8fVIAK81i9o/GHD69G2BtrCWd23Swt39vXgcbnYd/KHY0HrbEduzWTRVCEESKNIuI4uBRFpDeyc1QFjVFUVE4S5KE/otX0gs336H70ju6VUXN4mrN7GLlqWUPNE6jJGAyzdl/MiYfelHhp9ZR7qdsveHEzhRBYynXFc5anz/WXnfDHvqMfUJ6PkiI05AgVGgNzppbp4JtFzR87SLorh2Vd3XLq729/mpeUpfN7cHQwgMsFUiiJCQdJKSd46PRhjgJNwCrWNXA2ynuWns64+xstZmSPba0tpSrmuVsvdMEKwi6CdY09/u7tbAuTcufZuf8Hy+/RQpBHkY8SQfsjVO+HO7x1WiPr0ZTJnFKEgREakcnSKkYhDGTOCUNuimkXWLMFcZESHmIVIc4e4oxr5DyCKkOgedbW7n7u1NSkIQBgyQiCcPNJMsDCMe6ajhfFCw6oKSNfYsueNNmGXCOomm5WhVcLgvKNwByGEjyJGKYxTtppTZ2+s5RNS2LomJdN+jOnl13dMNvX1/w7euLnY7ru1SvLfWaLP+DlB9MpP5LlECQqohpPOQwHvFZts9BNOKsXhB1WVeNNRstnuz+qr8SlOh0dO/5CSWeIpgHY5b66g279Gtzg8yMHjS6cK4HWHMqs9qaMPXfxLV9tnFt50JX0doKbVtCKeBeu3a36fbX5u0JlqfjeYrgXROsa6tv5ycz9Ut+Lv7Eq+o7XlXfsf1Q8/MCtXGeS1ROpkaegtiBDOdstyivKa13tmtE1VELe4c32y18CypbMGvPKPScSCVMoifEKkMKhXPvbw1emRUX9U+EMuayec1az8jVmDwYEasUJaLOmEN13wHXFvSdQ99Kz7ioX7IQ8Ub7U5oVFkMoE/JgQqoGG13TWs88ddJYTPd5LZ7KVpg5s/aUYbNHKGOGwf7OXd5+WuSco7VVR5NrOwZHd32LjTk+UQesEuWnM7HM3pqy1bakEAukUbS2pqXuJo+9Pb8BZ5i3Zyz1Ja2rmYSHHCVfgMpRHxiIuG6C1YP9xlZUds1Z9YJZe3I9kRMhoYiIVNo5Uw49MCfottHQ2oq1mYP22i67sdLvQK9r0KbZRA3UtiRWCfudsceu+rj/CLXNzJovSn78+QohBUf7Q54fT9gbZyRRgJIS53y0z2iQMswTxoMUpaQ37ViWnF2uyNLoUUySX6I+KYAVxgHDiRfx3+UcqK3l59WSn5dLlBAMoog8isjDiDwMCTqxeNE2nK7XnBdr1m3Lum3Jw5D9NGMvTRlFMcM43u2+Irw43C/CFY9pUPbOa9Y4glCShorJKOt+UtJ36CC7Lsh4vapYzUrqqvXC+x1OpjD0VLjRXrahwn1q1dvjx4kHOrsiLOccbWOAhrpufV5ZZ+e5yyaEEN5ePPO2/OWqorD1rcDHU/tqypXPOTPabgDzrlVXDfOrNYtZQX2HE6Gnp/ocqTSPCUJ5w4knTiOGexn5KGV2cTtf2uieIrikXNXvBLBMayhW1xTBh8xUVOg1WKPpwE+wto5LqgK+nuzzv3/2FWkQshcn7CUZB0nGfpqxn2QMo5hIqUcLzqWARAX8drTH//b0S34/XLGXlkgZItUxUh3jnEXalTe76LqNu6wwBN6MIgp9SPDz/QnOwWxd0mrDbO0pSEfjnIORt1TfG6SMs/St8886R1l7Ct2Pp1f8y8tT/u2nMy6W/jtUUhIowTCNORrnPNsbMUqTna3Ue3DTaOPB1Ud6zvhGl6dByt6r5tO75dwoAcyaNf+6eEmmYn4qL6hsw+vyCvALgNfVFa01rHXJZb1k3q5Z64rGaox7P9qlEMpPsIKJz7va6sH2mqrSrGi6rvj95TaLvNKs0E537nI5icqpTUll11vAyNG6mrVekKkxQgwJHnA46ydYlb3WYPWLUG9GkBLLpJsu3baHtqMYrjlvXnJS/ZnT+kfWes42uApFRKqGpMGwM6fYJ1NDEpURyXST49WbRfSmAt7AY0mhFyz0JYvmnLWZ3aTQmZKFvuRV+R2SgMP4cw6Tz0lkxvuesLUtmLWnxDInURnP0z9sLOtTNeiAnHd59HS7E66a0w19EfBarOZnFAGVXdPamkyNOIg/YxjsMwoPyIMRvUX9vDnjsn3FvPFui0t9tdlWaxvWes6ivWAcHrG73s6XQJCoAdP4KaVdsWgvuubEsPs+/LkVy8zbksuUUMYEMt5kevUTLNc5ENa2pDYlK90bmvjfpVltvbPDOUNjSmbtKSfV90yjp4QiRu3YhNulfCRA2U2L2+668dPQQETeHCU8YBBMNlbrkUy6bDpPWfQNC4NxLZVZU5oVy86af9le+s9ri8179i6MEsmivfB6QRluHAj/Uso5HzFStz6geFU0OAfnVyu/Zh4mbw04HI5//sbrxfI0oqq80cZ2g/1j1ScFsKI4YDjJGO/ld2YRaWv5abHg/3v9M6FSPMkHHOZe+K6EIA58l3fdtvwwn/HHi3POioLzouAgy/h6us9vJxMYjhhE0U6LdyH8oj+IvJnAY0CJcw6jDdZYVKwIk4jJKOXJwZBhnhA+wjDjeptQlTXzixXLeUFTtXdS2d6sIFTko5ThJPMg9hNc7EjlHbziJCLoaVE7GAk656l7RhuaSqMbf9wl0q+8Hyrh3e/SPGa8l+M6m/3bAJZuLdY2FGtvcmG03QTf7Xp61GXL/HLN4mp9p9W7lHJDA0zzeJMV1u9vnHq9Wj5K7zQqMdqyXnmAVaxrb1DxyOo1WIuZpwjeZcTRl59gxVsmF9c3xSQI+f3kgEgqJnHKYZozjGJC2dGspPSNEvG4eUfvHpaogK/GU6QQHMZLJskSqQKk+gylPsO5Fc6eIUSEB1i2+33/ewkBgZLEYcDeIOP5/piqaalaTVm3zNYly6pmb5gyGaQEXfbXME18b3dr89Y61nXD1dJrof75xQnfvLrgauVBmpKCKAg6gDXg2XREEgU7Uex6Ew5tHW0XvvwxnzM96+Ah+vKnUH3v/apZMW/9AqixmtZqXldXnNeLrtOssc6yMhUXzZKlLlnrmsa8P8CSQnZd8XFHO7pJEdyYSnSmBvfVNUVw3tHPWqRQZGrIODxkKa7QbbNlstBptozXCO2ShdVP1LaBmu/wB4QyIlYpkUo76tTt+1iaFfP2vKMGfs9p/ePbei4ZMwim7MdPeZr8jqfp78iDEaFMuhDfrW6/257MaZbtJQvtjRle8m80VQVUW7lFhmV7wSsUtSkQCMbhodf5PHgE7q/alGjbkAVjjuIveZJ8yVHif2dqhHdE01w1r7lsXvOT/CP1lj4MPMBqbYVAYPD0tIP4Oc+zP3AYP2cvOmYYXOtaLpqfOK32eS3/7D//FsDSrmVt5szbCw5t8U7XZRrk7EXHNN0+tbZi2lngT8IjRuEBw3BKLDNilaH6UOcOAG6qM7nwE8eGs/oFZ/ULTqrvN+fV5qXdf2pbMmvOeK2+J5Ax4/Dw0ft/X1lMp0P0799ff865LmrgmGfp1xzEz5lGTxkEk26q2lHX3wiDbmzVabi+50Xxr/5NWp9Z1h9741oKM0e7mkV7zkrPvKulUg82OP4jVf+saFrDumw4OV9wOV8TKEUQSN/EvuXviqqhKFsCJX3jsvLa34/9xPk0AFbXjY9iT4HKhglhfPuuWee4LAu+m12RqGBDA1w3DefFmieDAcf5gNYYZlXFyXqFEIKDLCMNAmZVycuFJA8jng6Gt77HbTsoO7H5Yyl1zvlUa5wjUJIwDqlqzcn5gtmyJI1DkiQk7WiD/QLqXmGxddRly3JWsF6Wj7IjV6GnOubDlCgOHrWA/bXKT2f8xdT/SClu1Se9Wa4LfjXaoFuf/h0KHuSY98dbBd7GfDzNqauW5by49fWuS0DXjbcvL1YVSRb5xoDcDTTXlc/tWlytqe+wepdSkGQRo4mn2qngWocjYDPBGozSO0OVrbFURcNiVlB2QdSmp6/tOHEz2lJsmVzcNS3tJ2u9ZnEwSj3Nc+t9Qqk4SDIC4TVTkzghCbqGSk8T6F7bU83uq+1PIDunPN9wkeQKsqAC1+LsHIsEV4FIOxfBkF27DP1xD5TkcJzz158dYp3dACxtDFWjOZmt+NPPZ9St5my+5uX5nKAzqgB/D2u0YbYqma8r/vjzGS/O51ytChptCZXkaDzgaDLgq+N9jsYDsjgiULtfrb1WyNqb1NVQSUKlGGUx4yy5kTnyS9QXhxMORtm1Xe6nd7vZlBSCSZTzRXbIvC1obIt2lkB4rcXGpn/jhuZIVcxSl9SmZRCkZEHMIEjf6766TRGMZHKTIuh6St6yA1j3T7C2AVbVdeI9tW7AODrE4TbmF7YDhq2tvd12uCJ3kzu32//WrqGyq44uphH4UORYpUQy7aYWb98T++vaA4BLTqo/c16/ZNUtPvvqA1rH0RHHyW94kvyGw/hz9uNnnQ4t9Fq0O8o62wG9zH8vzhHKuJsUvd5Yh3tzjUusM0yjp8zbM+/oqDKiRzggvvX+WHAOgWAYTjlOv2I/eso4PCRReXcM/DM8kBGFmXNa/4hqg446Zq9t+Tf5XgnDYMph/Hk3xZqSBdfrGQ8a/bly1Zzc2B/j2o1DYWvvzjJ8s7bXJLH0AEsgSdWAYTBlHB4wCg8YhfsMgglZMCbsgoPvYyI4dw2EvcFM6CmcZo12NbWtbpwP2raszYxZc8J+9AzD7uufXcsfc9v/D2KZMQz3GIcHPE2+4mnyFXvRMaNwn1QNN9f7m+s259wmZLl3YBRd/lc/GevvJT6by09bl/piQ3uF7IN/vk+xNkThLgrFGEsQSMZDTwOMQkUUBvc2sPcnOV883eNof8ggi3dmfPxS9UkALCkEQkm/KMsi0iy+0wrdOseiqXm1XJKGIXkUIYXgp+WC1lr+7vCIYRShraXQnhr4++k+X+9NWTYNP8xn/LiYczwYPM5Kt1uMPppSt2XpHASKOA647BKplZTsjTOmk5wnh0OiMCDaYXHunNss/n2w8O5ueYGSJFlENowJ4/tP1o9dm8lhqGgbibO3C2lvK2MsbatpW/0o10elOnOG/QHLeXm/oYnz71OVDcuZB2JBGLArW6GpGhZXa5az4t4JVpJFjKYZ2SBGBVv7IwRJEnrb9nsAlrF2Q+vbACxtIFDsamKqtaFcVdcTrDuuHSl9WHQUB6RZTDbwsQbbNzolBYOOAhhK/7Ndu4CqG9XrKbv/HkrFOEpIVIB0S0KnsfYK3BXWfAcECBEjxAhE0v3l7heCkpLjyZBASaxzXK0r5uuKVVXTmobLZYE2lleXSwZp3Gm2AuIw8A9c46l7RdNS1A2zdcXVqqBqDUJAHAZ8fjDm77485g+fHXE4zgnVYybntx87JQVZHDJIYr46nvL10wPG+S9rJjQdZDzfnxAo1U0kP91SQnKc7JHIiLWpqW2DdpZYBsTymlFhnKWxmsZq1rpkpStA8CSZMAgTDuLRexldbEwuggmxepsiqG1DqVc0pnw4r6rXYJk5pVljbEsgQ1I1YBweoG3TBaRWtDSdwL+fYPnXP1Rt5yLYAz6Bz77K1Ijkgfwr/3k08/aMl+Ufuah/2gS+9pWonFFvZZ39gc/Sr0nUoANXwYOaN4EglhkyCJBCkqiMYTjl+/U/sdJXnWGUwThDZQqss8zaUy6an1AiYMwhkXx3gCXx07xYZozDQ57EvyENBjeoX7Kj3SkRMAoPfLitTDbW5/2xClAkMmMQ7DGODplGxwyD6Vv7l6icSfSEonMN3K7eMbLubPvfxfEyURl7HJGpIQfxM2pTejqgSjszi5hQRjvbwAsESigGodeF9cHSrWtYtOe0ttqa9mhKvWIhLqg6w4lfulI14Enym25y9RkH8XNSNSCSDzdTVHcMRuEBSihimdG6movmZy8h2TJvcc5nlc2bczI1Jg/Gv/hn++TK9WALxsOUP3z1hK8+P2A8TBgNUtQ9TeEkDhnmCaM8YTiIN03Nj1UfH2BtLaKjOCBOuynAHcfQ4ai1YdX4m451XrR9VhScrlccpBl/va8xzr+uNoZpkvI/HT7hp+WC72dXXBRrirZl1xuLN8PwQJBHdmG3F4tSCAKlqBrN+dUausWWEDDIY1ptrqdkD2y0rlpW84JiVT3KLc9ar1Mq1w2LyzVBoB5l2vFr1uXZkqpo/CGXu9EE+/Kf09METbQ7ZaenCE72B1yczB8EZ9ZY6qJmOS8I44BssPuC1U+winspgqKfYO3lG4rg5t/wE6xRp8G6iyLorKPpplZlUVMVDW2jNxbg99Wmy9yanSZYMpBEsc/n6n/eeg2CuKMCNsawaCqf87Q9IfAOEPfumz8GnQ4zjAi7zAspvLtYHkYYnWB06IOR7Rrn1gh1hBQThJwgSHhs7o0Ugr1hxjCNWVcNJ7Mli6LidL6i0YZ11bAsa36mMygR3n0wiULfVTaG1vgOne7c9ZSUJGFAugFA+/z9l8d8ebjHdJC9c1bVdgdFdhTqPIn4/GDCf/nNU55MHp+J9piKw5C9PCF4ZPjyxyiBYC8aMIkGNFZTdeLzREUk6lqvaqylti2lrnlRnlOYhkgGHMUTDuIRozB7r86pn2Al5Mp2uo7bNVi1fTt3avO6firAtf16//qQhFhlDIN9KlOQqgGVWXvHW9d0objXE6/b36Dv8ms/ZTAFra022VyhTMiCkQc24namhMOinaa2BfP2nLPqRxbtBa27adSTBkOm8VOeJF9uJliPKSHEZpISyphcjUnUgKW+5LT+ATQ0nQFG62q0aTd0xUimJCpnwO2TvF3KO0xGJCpnGOyxFx0jhbxxTISQxColVh5YJ2pAJBO/vukAlt9WQNJNjIbBlGF4c3LVV9Rp3oaBp+n1uqBrV766A8TtO9Go+mM54JqW+K7tk2tGhuocJwe+KdDOqMyK1lYs2vMNwLL4c2alZ9SmwL0nJffefeu0hFkw4ij+nM+zP2wCgQP5sLmGN/zw9MFcjEhVTiBjzpuXpGrgvxG7NS3Da/aW+pKxPugA8F9YietMyTSJ+ezJhD/87glP9kc8ORjeC5r88rwzWnmEXOOXqo8OsIQQhHFAmkbEaegXEvccFCEEwyjiaDDgKMv4w/4h0zRDCMGirlBSYh1dh9112oeO4ie6HBv56wS5bVcv3mu14WBvwHjohe9hoIijgChUNK1GSkEUKGRw9yTL4WjrlvWyoirucJ+7o2YXS/71H3/k8nRBOojJ8uSTNLoAWC9LvvuXn72Jh7bXo8AdyhrbUQQ1sdndZUiqToO17wHNQ5b8G/rdVUE2SB6lb6rLniJYUN9h9S6VIE09wMry5K0JVq/BGowSgjsmWMBmkurfs2A1LxmMxZ1TrzdLa+st5efekOMugBXHPi8uH6X30nwL3VLqlperOT8uZ1xUBYVuqYzuANb9s0rf9BAEQvI/Hz7lHw6fMU3eplIIOUQFz5FyjHMN0CJEjhAZQg68dfs7lPKCLI73hvwvX33GKEv4px9fo423ay/rFmMtfT6NNpaybvEMJU8XSqKAQEryNGaYxkwHKUfjAcd7Q377ZMrz/QnjPCG6515w67Hp73fS0wEDJTHW0jurGmuJAsU4T9gf5g9u730qUJIk2t0J9FMoAQRCEisPiAN5swsvhSAUCoKYJ/GEWHqK2iBIyIOEWO1OO731/bsGAd0kKOi2b11nte+8a999EyyfmeUnS9e2656OJEU3YQpG5GZMHkw6S2+fvdTairVebChMt2/fortFetNZuns6G517nJ9gxfdMsFrbUJgFs/aUtZ5R2xLdUan89+Cd6IbBlKfJVzyJf0Om3q+j34OdVA3ZC59wHP+WS/GKq+ZkC6w61nrOWf2CROXsRU/e6z2VCK+t6mW8cdm7+/UBicxI5GDjstc3m5QISNWAUbhPonKvL761vCuhEgGBCDdToZ4OaVzb0UIN7zLB+qUrkgnDcJ8984RFe8G1VpbOgr/pgpXftj7/kBV3AHsSHjGOjvxxl9mjzZegX/grAhGRqTGT6AmiFZhWb869fkK9PRH+S6m+OaqkJIoCsjRGKUHdaJarmulIb/793u14Kssn8cz5JABWFPnOf5xENxeQt5TsOtZP8pwvRhP+cHDINE1Z1BUv5nMCITZceejC1DokK7sFR6jkrz616TU7bWs4nA44mA5QUlBULVXTEgY+mdo/AB6aKnQW3x3A0nr3CdbsfMVyVvLNP73coPxPlbfjrEO32mvMHnkPtdaiG41u9KNAz8bkYjogyf0Ffu/7dABrebVmsj94lENfXbUsLtcsHzC5SDJvupEOYpTammAJiJNrF8EHwZJz1GXDYrZmOS/vdOp8++/8BKvqAJZuzZ0UwSgOGI4zBuOMKL4d2BrnKHXLrK744+yc//vkBd/OL5nVJfOm6oSu3PvgFF3DJFIKi+Pr8f7tAEsMECoD1X8v2zo++YAF9d0lpZdsH+8N2RtkHO8N0cby+mrprbG18V3JbujdWkOjjd/vromShCF5EnE4znkyGfLFwZjfPT3gd8dT8sRTCwMl32ka0k8neyt52zlf2E6XFQWKcZawP/rl+f2fagPnvlJCooTkNtNDgSCUAQHe6fQgGXckU9F9V+9Hhew1TEqFGwMHKQJcp1HRdtvk4vYFmHWWxtZ+oWauc6367fcAKzOehlToBZVdUxpHY/0Eq7xh636znDM0rgdw1Q2ak6cIxuRq1Nly336Nadew0jOumpPNNGJ7WtMljDEMphwnX3GUfPleVD1gY0aQqgGT8AnHyVdYZ7xGraMmOhyFmWNrQx6M+cz8/r3es59eZcFwk1V1XykREHfW9rUtbhA3PFgbMtws9G8/tr1ZixIBgYwIRETvbOecRdP6c4JPcwEfyoRRuE9t1pyqH/09pDsIFoe27SY8+ZcEWJFKGYZTxuEhk/CQUXiwObaPL39GhzIiC0bsRU86veOSZisEu3WNjz24Z0L9H7WEEN7YKwy8zbqxNI1muapoWtP9+7+f58nHB1j0Dn3eJeQhE4keKAVSsmpqvr265NUq5NVqRWMMr1Yr/vvJCa01nK7XaGtYtw2XZcmsqijaltbYB13QPnQFSjLoFu7jUUqeRV2StiSK1CaEMwx2sPp2PlurKhqaun0UgLDWYRtN+x988uysQ2uL0bvZ1/ellCQdJEz2B2Q7TLCM9WHPi6uCqqgfPK98fpnx2q2iplzXVGV7J81zY3Ix7U0ubu5PEHpb+TSLiZOQMAowxt56TjigKj2oW80LxnsPTy9068OLy6KmrlraxtybtxYlIYNJxnDUmajcci03RvPTesE3swt+XM6otGYQRowjP006KZacFCviIORJOmAUJ55WZw2LpmZWVwgBT7IBx9mQz/IR8Z3CtxbnSnAWIVIQKc7NcHYGQnqaoBhtvX4HvcDWZ1pXDa9nK74/ueT11YJlWaOk5HCUe/A0ypkOs81ETuKv896NMAkDRlnCJE84GOUbwPaujaB+36TAbztNWFcN68pt7G9XZU3V6O4+6DyN8ROlCf+addu5euvZIK5/3bXAfb8duV4ghzLa5AfVzgOQ3kWwsSWGmx38fuFn3TWNqrHlhkbVL7pDmZCqAZkakasxS3VFoCMcbBZ9lVmh7c1Ihv4YWSytKSnMktZU3shh8xrZUQTH92qwtGspzIJFe+EpiltmBRJFrDJimZEHYxKVv2348S6HtjczEgF5MGY/fsZCXxDUN5tNrW2ANaVedSC16Mw0Hs6ie7MUqrOrT/zfc3/TQaJQIiSQUWc7v/VvwmdL9VSzuxb6G9qdEF0YbtDp4/wcyGeF2Q2VtD+HdgUOv7SaUglv9BKrDCWjN97Nm8z4jDC7+Sw9NexDVtLp5sbhAXEf7P2OdU2F7L/DYXdOb997XRe+3G6mjX8ptf3smoxSfvPZlKt5wbKo+e7lBVkadYYXMXEUoJT061nrqOqWqvF6+zyNSOPwPymCAIgu8yVQSKV2ukD6UeJ5WbA+aRFCsGoaKq15sZhzURZY51g2tV+U1TWn6zWXZcGqaaiNQbteRvfrVBAoRsOEp0cjwjAgDBQISEVI3GU99TqvhxZVDr/wrauGptaYHS3a/5KqBzJam0eFzalAkeXe5CLN4p00WN6hb+3pmg+AXef8FLOpGsp10wGXu4N7ZWdKMtobkA2SWwGWbNzupQAAIABJREFUVB6EJakPwm4bTXPbfjj8BOtqzWpe0jQ7CNgbTbmuKVZ1d67Zew0oojjsJlgpUXT7BKs2mhfLGf/P6Usq48f+nw3GPM2H7McZ/3j+M4217MUp/3D4lC9HexRtw7pt+GE547v5JUII/n7/mL/fP+b3k32y8I6MHVfhzAUOg5T7CJHi3BXGfAd0E3M54LFGF31drUr+9eUp/+PHE749ueRyWbA3yDgaD/jN0R5/8/yIr5/tb6iC/eKqn2Qp6V0Pw0ARhwFpFJKEwXsHgAvhQ5HHWcyijGhaTasNdeu/w3XdULUeZIVCftS0+/+suysUMakakMgc41pa09DaGvB21XdRBL1JwKqj3hXdQq0j3QlFJBISOSBTQ7Jg7E0X2gg6jRc4Krv2lD3sW1373iih0AsaW9/QwdygCHYarNtK25ZSe8c0r6W5vq/0UybvjjfqwIm3+v4QJVFkgW+snNUv3soaMk7jrKW2646uVWz0cI8FF1KoTgOW3Gv40ZcHRcEmM+rmfksCGROrjECGD+5LT7OUMkC6PoriOsL3U41O8Dq+aJNv9mZ5t7k+QNl/jh6+fMiKVc44PGQY7hPJD2MI5Knt3tXSTzTfMHlynsLZh2L/pZUQguk446vPD/heXPDi1RUn5wuGeczeOONwOmA89A64WnvZzdWi4GpeksQBR/tDwlChuqiXj1kfH2DhdSZBqHbKmPIarJjjfMhVVVIbv0hIw4BhFHmNgbNIYBjFKOlpG1dVybppCJVikniHsV+TGyeEIAwUSRfu2+swlJKPz8Jy3tWtrjRto3/1ady/h+otqu0DgODN6sHKaJKTbHKnxJ3b2KYIlkXz4DTRGu/ot1qUPkOr0vdq6HqK4GgvI80i1LbJhRAo5c+hKAlJc+/aV6wq2ub2kL26aplfFiznBe0d1vDb1TaeilqsfN7XQ9PAKAkZTlIG47s1WK21nFdrvp1fMI4TnuUjng/G/Ga4x5NswHlV8KfZBdMk5Xfjff5+/5i19gBrEMYoIWmt5SgbMIxikiC4m0bnKu8gSIsTCYIx1i6w5gREgnSP11f0ToDaWM4Xa757fckffzrjZL6iqFs+2w/58mjC335+xN9+8YS/ena4oSn/WnQ5KQR5ErI/zFkUNauyxtV+eq+NZVX6DK75qGKYxYTq04ZY4q0lvi/PfHQY6z56qOSHqu1P2euFEjXoKGyd65j1QKi1DcbqzjThWr/cu7B5h0A/werd7K4NH5KOujYiVdeudj24aEzl84BsgxLBjYWudYbalhR60ZlbbE+wrjVeniJ4h7tpF+K6ar3+artb37utDcPpZt8+5LRQdtuXoeq0URGiM4LoJySmp1laHxTbA8fHlhCe8hnu+BkEPhZA3gIo/bbCDqyFPNyiF4gu2Hd7W70ddj/B2uCsT4R95Y9BiJJh56J5m0lKn41lu//24edqkUwYBHtd6Pf70VP72kyRRYwS4VvPBK+RM7fq48ouRLdqNFobmtbw6mzOq1OfF1WUDXVnovbnlxfkabzR+qdJSJZGXWSIQhtDWbdUtZdhtFpzOS84u1xxerlkVdQY65gvS168ugLcRt+bJiFpEhGFiiBQH9StTwjBZJjyxdM96kZzMVuzWFVcztf88NMFi1XJaNABrM4sar6qWKwqxsOEQR4ztRlO3CR499jAWC9RKLV3Q1adLCcNAtIgxDpH3WnBIxUQ7zj4ua0+OsASQiCkRAUKuYMVcSAlz0cjAiVZNQ1l22KcI1aKOAg27mPaWlpjvfbB+CmWw/G8Cxg+yvNf1SPfOu/ktiqaTedaKUUYSOSOuUl9OTxwaGvvkuf+c4J1e73DYZFSbkKukywijENUIP3k5hZwYa29QRF8aJpojaVYVVydLVgvqnv1c0IKVCBJ0ojhOOs0YbffyMJQkY8SRns5xnq3wLeb2+7mBGsHgNXUmtWiZL2saJuHXx8l2xqsuxZW3uTiqi55kg35erzP7ycH7CcZeRgxCCOUkEQqYBwnPMkGNNbQGkPS/X9n5Zp12/BfT18iBRxnQwbh2w9A5xqcW+BchZAjnKvAFd5N0O8Nj51eOQdF7Z0CX89W/Hy54PVsybryvNuDUc4fnh/xh+dHHAzzR4VPf6iSUjBMY473hszWJefLa+trB8yLihfnMwZJxHMxZpB8umGWnvrjrrO0bnxXHlx9CoHKv0SFIuoMEnJW2n9HvROcdi2NLalt6QHT1hTGOE1l117b1IEXr+3JunwdnxETymhjwOCNNfrteyOB2hRd4HCvpbqmCPaBxI2rNvoroNOZbJlc3DEf7WmMhfEg7SYVUXWOem+HLX+I6he5PRgMZUwgwo6WdX3jNK6lMmvWek4gYrJ3eKjIDjB5S/ldP0fngnbHfgcixIds7ML42W5NXL++B5N9KPOnFKLQX+VvBrS/Xe6N3x+2tq8/JXY3y7q/uqliNw29pW3UTRffnjB6kHHJycWS+bJkviqZLysWy5LLecHlfE3dGP7pjz+zKmqSjko3HqZ8+dmU3zybMshjhlnCumh48XrGz6czruYFV4uS5apiua6YLUpOLpa0reHbF+dY55iMUlRHbf/i2R5fPJ0ynWSMBynBrnruXY6OgOHAm69p4ydUWRphjOPf/nzqzw157RLYs76Ukjg7oT7SG7bIdlnnKLWmaFteLue8WM6ojCYNQoZRzOfDMV8MJ1S65bRc0xjNYTrgMMvf+cr46AALtiZYSvDQfTQQkmfDEU8HQyqtWbcNxjqyKCQLo82F2VpL2basmoZvri745vKSPAx5PhpxPBgyTdNfF2BZS91o1kW9CR2NIoeU4eO/BOeDX9tGe8OBR1Dg/mLqHQ+JlIIoCTttk6fcqUBtuuRvljGOqqhZXHmK4EMTLGMsxarm8nRJsax8HtUt1Ys5g1CRZN6ZL0mjOwWeQaTIhymjaUZZ1N1C9Ob+ui2K4HJe0Db6Vn3FdjVVy2pe+kDr5mEzlTj2GqzBOL0TYFlnKbVmVlckQcDvxvv87fRJN1V25GGEkpJYKkZRwmF6rRWbxClPsiHfzi/4v17/yP979hPH+ZD/cvD01vdyrsHZJc6tcHaKkwXOlV6XRQAddeoxZZ2jqFsulgUnsyWvrhaczFabrewPMv7q2QG/f3aA+kj25FIIhmnC070hp/MV8fnN72JelPx4dsUwjRnlyQ279nft1t03QXqvyZ3oTEXE24tO59jkihljNw6U7/2en0iFMiYLhiTBgKDtF3iucxtraWxFY0okklC9AbBMp8EyfoLls5hSEjXwGUXIjoI49KBrA9D89lvbUtuC0qw8rVAmm2PvKYKlB1idPXtf2yYa91EEjTM+8Fb7bdwEabKzqh+9ZVX/IcrTtEIg7MBpTCCjTSbWzeO4Zq0XZGrkz61HnlY9KPKA7mGA5WnEdBOnm28mhF+YX0/0dtVMyTuW8h+u3r7+byMg7vaOPe1vAwI/UgVdAyKWGYrwZpP1Zp/Hg1Tx5vd1u65TCB83fFvjoKc/3tYtupoX/OmHM/74/SmvzxacXCy66ZPBmOt737/9+YRvfzwnCHwT/+nRmKppGWTexTJNItZlw8vXV/yPP73i5cmMl69nFKU3TdPadoZIlh9/vuTn0xlBR2XPs4h/+JvnG9+AJApJk7fBZ8/S2jaa638eYhsMspjBlkQjDBTf/HDGtz+eMV9Wfj+N7cKHFft7OdNJzjCPaVrdUfJvHnvjLEXbcFVXfDu/5L+dvWLZNIzimIM0I5CSp/mQddvwar1g3bZESnGQZjtMim+vTwJg9YtJrz26/4M4YN14utBFWXC6XrNqGgIpOztdX8b5CZZ2llgpfre3xyhOmCQJ4zghCYJftV9jjGNdNojZ2qNtKciziL1RRryjVfZ2OeenWNY+jgL3n7VjCQ+0BuOUwShhvaww+m1nkGsNVrETwLqeYC1ZL0t0e/vrg8gDvNEkI8kiZN98uOOkDcOAfJQyng6YX6zvXFxWVbs1wXpYg9VPsIqdJ1jbFME7On7dIll2v71r4DWPXglB2AGT1hpKowm7MX6kFKMo9hlXzjKvK0rtp9i3v1WEkCOwDueWGP0tjhapniLlHkK8nSGzS2njDSPaLY1fT0hYVjU/Xy6Y5CmjLGGYxptcj1+rlJTsDVK+PNrjbLHmu5NLokBhrKdIXK1Kvn19SaAUWRIySMKNc+G78tatc9Stpm61t4gPOh68FO/Fhd9IwzsToDgKCGu1yRFbVzUXizWLsvYaM+s+ytTwl6igM7lIZN4BgusyrvUTJrvqMnnyrX/b1mD5CVYkAhKVkwYDQhEDAtUtIBM1uHX7pVmxNnM/kdr6t40Gyyw34KjXd/WApbeYv2v65Dq78NY2b2nJts041B05Wh+qpFAE0lP4jNA31vO9Hka7BvOugbaio+m9kX31rtUtzT+piRPQZaK1tLaisaWnl7oWbZuNaUOvK7KY7nc3rXHXYMpPUP221nrOafXiVwkTvq36c8PWgtl6jS7XXnaiPOsqCCXOOopVTbGqGO3ljKf57g69j6zpJOcPXz1hOs5YdNMmY/w93dprs5J+jamkRCrBeOApd4fTAYPMB/DmWcSXz6ZEYcBvn+8zW5Y0rdf0244N4Jzr1ubXDa5ASaajjBCJrjVN3VLXwQYPVmVDWbasFxVPpgP+17//kskoZTxM2d/LCQNFVbVeJ98ZLVljkUoSxwFRFGCNxRiHEoKDvQGBkkyGKV8+m1LVLXWrsdYRKLkxtsizmKP94cah+83HbaU1L5cL/jg7pzWG34z2KHXLqm1YNy2NMTigNJrzsmRRVxxng/eC9x8dYIm+O6lkN/a7//XWOVZtw3lR8ON8xp9nV5yt1x5tbx2K/uQIleIfjp/yNweH7KUpYQfEfm3xm7GWomxoZutNF7ZpU9IkYvTgX79dzvYA6+N2eP6jlgDixBs25MOEptZUxS0Aq6MIOucoi/pBk4t+gnV1tuhA2+0PjjBU5MOE4V5GkkaoB+izQRQwGKWMpzlJFt352rpsWACrHTVYTd2ynnuKoN4FYHUmF8N7KIKbDt7GkawLF8Z11AmfbyUQtMZQ6RaCAIUHWFLEZEGIsY5ZXVFqfadtvBAxQo5xrsXZFc6dIOQEpZ4h5D5CPh5guY6CXLXaT062upoOWJY1ry6XjPMU5xxJGHSOgOpXWxL1ACsJA366XDDOPGe9aTXGGq5WJVWjEQL2Bin7w4yjsSONgnd2FLTOUTYti6ImChRpHBKHAQLF+1L0++dEqBRJGBApRW29M+KqbmDpj3utNdpaAumXoP/eKxBRN2F6m6JkOopdadbEKuca4nsA1Guwars9wfIUwZ4OGIjQg66t/+96+y2VWVHoBbkas/2c8RTBknJLg9XrZnrHvEgmBCK6Ewh4GqKm3YCXm9N0JUI/WRLhW1qkD1kSPxEKRITkZsixxaGdRtumow4+/lnbG02IDwCwNlpEobrtfTplXEtjC9Z6wUpfstIzKrPeZDr1eWzatRirMWis0946vncE7KY3FrsBWd5h8uPozPtzw9SC2dmKxXlJECrCUBElIUkaYazl4vWci5MFn/32gDiNiJK3tVUfovYnGXka8dXn+2jt9bT+mHHz1LxhqARKKdI4IIl91qySkkEW8+VnU44PR2htaLXd0uVtba/blnN+vWO0ZbUoWS2qDmBpqqrd7MPVVcHV5YrWWI73hvzm2ZQkCUmSkEB5plpde0fitjXeqVgbbwQ3SgkC5Y3AWuMdefdyDqc5X342pWm9i/GGtdWtpVUHtOJQbT7jm1VpzcvVnH88ecVXkylfT6Y0xvDHq3NOi7UHWM5Rac1FUXBZFawm72e3/dEBVl/96PChMs5yWZZ8d3XJRVlgrCUNwxvUkO2KAq/Z2EtSxvGHcYF5l3LW0bSapvRmF8FjjS3e3J7z2/QXxO5/pwJJGAUEnYvhp9YF+1CVDmLCONjZmbKv/rVOuG4a4zOmVovy1tc767yhhHU0Vet1ca3ZNA3eLGMs5ari8mzpQctdACsKyEeZz+PK4g3n+K4KI8VgnHSvj+60+tetoaKhXNeUZUNdtajAu3jeVjc1WHd3EfsJdJyGZIOEJIvuPMcFglgpBmGERFC0Dau27oSmcqOzEgJOyxXfzC+YxinTJKO1ltpoLuuSyrQPq6dEgpR7gMDZCJxCyn2kOkCICT5o+HHXgMBfw1kckcXeBTToLWOdnw598/qCxhheXy05GGUEUnWZVndsUVxP8lVniBMFijQKyeKQJAo9tVg+rFMFfy9NwpBQKY4n3tFwUVSczleczlc02j/UXl8t+ebVOYGSPJuOuFqV5LEXL4dKbfZno3TYytLS1j/gW+O3VTaa+bpkVlQcjQc8m46YDjL/ed7Dp/DaWluSxxHTYUbVauz6emLmHLy6WvCnn8/RxjJKY/IkRombuSn9c8L2WWtdFzSNQ9I7XC8/ZoX3Tpj0RiOl7QSgW6RaWtdQ29KHBVuvP1bSg6lMjTaBt14TFF2DIpFg8Ite7VrKTn80Dg9v0OPepAi6TuMVbSiIMVKoB7RTno7XZ2jdfIz5fVMy9GDiF51giWuN1Bv767qFvnEt1pl3bGX21Fb5zlSjG1u7RZv1a5dxGm1bWldTm8IDfb2kMEsKs2Ct5xRmTm1Kalt4KmtnmLIJPO6+++tp1rZtvO1cAq+nMh+jpPDGMM4ImtI/C8PQr9+CqqVY1zjrWSzOOYy2NFVLU2n/mvdc571ZQglkLInjkJEK7oknuVltH1ekC2Ln/y6U3vhikO1m3tE0mmJds1pVFA50qylWcCUFZVGjtZ9IrZYVq2XpI4gCRTRIiJQiVh44LWY1dd0ipY9lMsaDNiE1RhvW64q60tR1S5JGTKc5w1HKIHs/oyjrHGXbMqtLJHCQ5jTG8P1iRmvtJijddGuMUnsDvfc5/z4ZgLVrGes4Wa/45/NTIqV4Ohiyl6TdTfLtA+9NMcbEdywgf63qLz7bGh+snESkXZDoO22PN7oMO1YUBQwnPrT2fa2gP+Wa7A9I85gwVA9mWd1VcQewBqOUyztonM552l/rnO/kdKAlioNb39ca102weg3W7Z25MA4Yjj3lL75nIrV5/YYimJOk0Z3PcWtdZ/HfUq5q1svKuxPeMSFr6vZBiqAQYvMwidOIJIuIk/CG4+F2KSHIgohpnCGFZNZUnJcFsQrIgpA8jDhKc9Ztw/eLGYum5svhhC+HexTac6h/WF6xbhvyMOqmWrd/YCESkPsokePkIdCASBEiRYgYePyiWgrIYx8QPB3mDNOYOAxotQ8TPl+sMdby8nxGFkekUbDhq98G5mT30AiUJAoCHwKcJ4yyhKPxgM+mI44mA7I4REV3f7dvb9cbCB2OB/zdF8dIIfjvP7zmfOEtsS0wW3ub+fPFmuO9IU/3hkyHGXt5yjCNCbv9gWu3vtb4z1nWDUXTsixq5kXFoqhZlBXLsubvvjwmVIo8jnwkxQcoKQXDLObp3pCq0ZSND2lvtcXalh9OrwiV4mS24vn+mOPJkCj05keILrphCxT635ZBEnG8N/w0AZaIyToXQU8DvC7jvEaqMusucNVT2rZpWrUp/AIW202rBhvbc+ipeL5LH8uUNBhQG69R3NAMzdybUGxPsJyhMdUNF8FIRiQyI1OjTq/1EN3fU4Ptxo76DYgltqhwv+hjqnPZu2XC5MH4NQh8twnWtgvmgy2h3bb5kR/brW0ozZJle8lF8zMX9U8UZs5aL6htQWsbtKvRtgdTGoN3xuvt1a+t1rv/bDrF/Zn2ccEVsDGjkHgqoNF2M82pq9Y/v4VfKxwcj0nSiKZpKYua9J4m47tWbw5lcUzjdGeAVRvNq2LJT+s50yRjP84Yhp4Jsitjoak1lxcrzs+XFEVDUTRAw3rtp7513VJXXZi58E1igLrRjIYJepiyWlWcni5YrSrG44zROPOarC63dD5bU9easmyoypZpR/fr1ygPxebcW50hRiAlcbfOCKQm/AUzIP/dASzrLFdVyffzGc8GQ/bTjL+a7vssmf+fvff+jSNLswXPtWHTMUnKlFSue6a7Z96b2fewwAP2/wcWWGAfsDNve6ZtdZU8Xbrw18T+8N0IkhIpGkmlqur9GqoWqpLJyMjMiHvucVfs7jIAiVJQd0zq+9jT9yEm0pFWncyHApzzG4MG3jt3fHiUaCwOJ9g7mJCO+CPGa/6UZv/RHPk0horkPV8juwSw1Ht8ct73gO/RtQZNFVghwaEuKG6G99hZh6posD4t3htyobREPktHwHTTSC1uJRHsPS2Su8aiKhqU2xqCM0SxxlUqHNNalNsQcmGuAVicQSo5dnFFsYK+zn8Fkq9NdYQH6QSpUuicQ2E6dJ6a2icqwsN0ghflBm+qHV6WWzSWvDVb0+KkLnFUF+i8w36ShtTB6wBWFIDU7MZzeNthjCGJFARnWOTks8oijRIdOuuwqRpsquYOz0fsjJIcsSa2an+SYX+a4suDOenN+x7LSUrepsAsvS+k57xkkY2hG5wzbKoGP5ys0XYGrXUomw5F0+H56QYHZzkOphkezHM8mOVY5CliLREpBQQZinUOrXVojMGubrGtWqyKCifbCquiRtl2qJoOkZL49cMlvlhOP1qNhOAM8zTGk+UMRdNhVVAJpfcezgMvz7Zj+Mi2bFA0HRItkWoFMNqcGwIxOmvRhQ6V5SRFGmkczvKbD+JHHsk1YuSIeRpi1BmGRT4xWDUBLE9SFgcL23cjY2D6c8mbYGosF1ahpHaQmUmmoEWCREzgew/Tt6M8q7JbdD11Y/VBBzR4sGpXwPUGPTw4k4hFilRMwvPf5rp7NUsxAJGPIau7aUYp1RWhEoHDCuzKh3yOPw6wGp7pcwxtynj0vUPtdtiYE5y2L/Cy/hNe1H9GZTeo3Ba2P/f2nssj2fh3YFjnkNRxFDqy85+5CLCGTqjPMSHvDxdLjL3v0Vs33u+H5OF8mkBqAWc8utZcK5G/7YyFAb2H9RQxvukavKl36AFEQmKuz/2/9Dh/yY8sGPmwamtw0hT4bneG2hn4nmoIbE+PHzqjOAtxKFdtthqL7bbG8dGWakqsD14pD2Pc6L2KYoUk0Yish7UOdd3BWYe+B9brCq9errDbUWpoklJwV++BpumwXlXYbErUtUFdk0/r8MEU3vXg/MPANgOtPRQXkOH+OKgZnPdoLLF8jbOB8X//PfY287MDWACD5gJZiFacRTFmcRwYrKsTuxS/f479xxrGQIY8RebsomigJEee3a9bgSRo7Ebp2Nszmaf49reP8PVvHkFFEjq6ezP9z2H2DqfYfzhHNomv7WN63zDgkkTwfQBrmK4974xSWiDGOTAaJJ3WOOrNWld04bnGs6U1MVjzZY7ktgzWJME0SApvYu2ssah2DbZnJXREYO7q12RujGkXgiHJNGZ7GdI8upa5Gl8bF3icTfEv+w8x1RGWcYpFnCAWChwM+0mG3ywOIDhHYx1eVVv8cX2M58UaXaDvOWNYRim+ne7hy8k8JBD+iBN06olWeDDP8cVyiterHerWXOsHu/65gtfDeTTdeZnzEAV/tCnw3Zsz/MPjffzj433MswR5EiFWt3vNkZKY5wme7s/wL18/ghQcPxyv8exkjU3ZwDiSR5RNBwag6QikpJo08wPL3oM0+IM0cJDnVa1B2XSoOwNj3egEGhZVH2sE5zic5/jtk0O01uFsV2FXtwEwOTTGjsC2NRYvzrZQko8dX+PN1NGCZfAufH24wMPF/cJOPvVwiDEwgsIj1MgEkAerHguBqZ6kQ+V2QRp42T8gA8DK5CwwWOfvjWACMc+QyTls3xFw8hT1PsaoUywFXO9g+hamp/ACks71IQY+CwxZdIv7SlhgM0EA60KQwejFCc/9KWdYxPaB6XvrCC/IB2+f2vdLHA+Hym5RuS1O2ud403yP0/YFNuYEpV2HNMl3C6eHP4rHUExDcgXBVGCGxNjhNoSAMMYxVBG0vsZZ+wpn3at33psfc4QUSNIIk2kCYyxM58jXFOR1bW1w9HKNvYMJksMIcRJ9uA0keH0ra3DWVDhrK5w0JY6bErGQWEQJAIxAadM2OGoKrNtzO8NMx9iLUtjeo3P0/dp2Dax3OKoLKC4QC4lllGIvTpFKjVgo6Ct6EcN+HRhjpISxDgzkF9eRRJJoTN3g4zpXbRlYlEWL3gNlCOWQkmSOWUqpf1XToW0tGGdIEk1e7kmPvWWGNNWQ8urExbsMZwyRkJjoCJuuxX+cHqMwLZ4XW6zaGn/ZnEEJjtoYGO8x0RF1YH3Ad/5nB7AYACUEUqUx0RGmUYRpFF97CoZd3M99WWQsBHkoCescutJCKYGuI//AnYkrxkYN611e3HSR4pvfPsa//h+/RpLq0d/zS5vBV3SbbrUrh10IubglwKJS3hp10SDL3/L7hdRH0znUZYfdpkbXmGt3988ZrOCpuuEljAzWghisQf55XcKkNQ7lrsFmVSKfJdcWCF9OEbyabeOCI8kizPZIlink+y+EkRB4nE2oL0cIJFIhVxqxILB/kGRIpILxDs93G+y6Ds93G9JOcz4CtK8nC/z3g8cEsOSPK+8a5LmJliTjW85QtQZHm+LOKiKSdvXwjm6orWGoOoMzVuHV2RZKCuzlKerWEBsDAk13AVgqMOZSCBzMcvzff36OsjWoOwvfGzgLAkmBATqXNF5g1fvh/85voD360Xs2/LuL8yGa+bdHCo7DWY4s0tjVLb4/WuHNukDfE3M4pDoWdYfX6x1F5OPy7x96EvvwfFJwOO/xT0/vXjj9Y8ywsNc8oa4mrgFvQhmpHWWAricwZXqSbtWugOnfAlhcIRETZHIOxS7fM3noyMrkDLXbgTMeQi4qVHYH41u6hoH6sSisoBuB3XCssUiRyinULSSClDoYPC69h7vAzgHD58xdG1n9sYaYGXclmBtKegXkLRm5X+743qNyW5y2L/Gi/hPEGAqiAAAgAElEQVR+KH+Pk+4Fear84KMLFQnhvY14glROkYnZWGiteYKIJxBMXQJbgweOQ4yf78Ks0Pcea/MG7oMYxA8bKTniVCOfJaMfWYTUO+/7kAxMcnupSc0hb7gP3jRDMW5lDV5VO3y3O8NZW2Hd1lhECZ7m5Lt0fY/OOZy2Jf68OcEPxWr8FD/JZvhmskQkJDpPIQ6brsFpU8L2FMWuuMC3kz36vsVkq9FXembDhtkAsAwFUygtEUXk6xeCo65INmhMqM4ISddta9C1Fs56SElhFGmm4XYexlh0nQUPcsDhufb2cqQhrv1D7yOccURCItcRtl2L358eYdu1eFVssWpq/GV9il3XIpESinPsJ9mtJZjXzc8OYF2UY2/aBt+tV+icgxJ8lAFevnFwzGJiutQVqPzHGt/3cMbCNQjU40Wq/O5DHUkk8bsLjck4h1AcOpKI0wjZNA7x+Hcf5zxM+NKYxqBrDbigC1GU6BBjKuCsg+ksRXFyPkoTuQxfmiCfNC2FRDDGwCWHkBxCCAjJxyjPtu5QbipURYM4i5CkEXSsoWP6KG9XJXZnJaJUI83jS8BIBJ/QbV+vjvW5RPAWLJjpbIhrbd+R09lAoZe7Gm3dwYU0nOsW46MHazl4qt7/Hg+dWTpWSMJrt51DF8772zMArO1ZieWD6SXWZVjse0+G3TbIHq/zi3FOAGu+zInBuoE9I4lgjKEjQ3IywGpBKXvUnB7hi3yKf14+QCwlNm2DdVeTfppLHKQZfjM/wFfTBRZRAvkJddTDmMCSVK3B6/UOb1Y7vDjd4NnJGqe7En3fY54l0EqQLPlCTPn7xl9gVgY2ZpDa1cZSoEPf429HK2SxhvM9skiP5cC3+WxwMCRaYTlJoYRA3RkIzvDybIZVUWNTNcHTZNFaAip2iP8l5DT+LhECTZTgkEIgkgKRkoiCHC+JFH735BCHswxJCOf4GMMYQ6TIz/Z0f45//foR0kjjeFPgeFuOnqzOUOlwZ0wAwv2YWslDdLEUHJGUSCOFLNajz+ynNgMLKPiQADhBgwLWmXOA5UtYT7Is64l9alwJF6RaAzugWIxIpIh4GvxclxmsiKfI5Rw7cwoOAYMWnW/Q+hKdb2F7C4TkwtZXgSG7KEeSiHh2SYJ402sTTEEyBc8cWH+xNpaiuk3fwcF+UhbLw8F6M7Jxl44R4Ri5DsWwf3/jA5PY+gqr7jVe1H/CUfMDtvYUravG90YyFVIvc2RyjkwSqErFFLHIEPN03ChQPArFyyKEoYQ/gcEaQjQYOCKe4nMzh4yx0QPU9z1MZ8dQIqkEposM00WG+f6EUn8lB/vAexJds2hDcaZjPExyGG+xbit03sIFFcWma3DSFDhrKgjGsR/nkIySAjUXOG4K+L7HtqN+TM3ofisYh2S0bnZ9jx8KCnvQXCCV79oSlBaYzVM479GF9EARmCitxXh+muBFvxjgNcTFW+sDkOI4OJwiz2n9ycCQ5wYsyPKG58rzGHESEhk/8CMQCYGHWY7f7R2gNB0qayA5h+89UqUwj5IxDG+mI+wnGRZx8kF+x58fwOrPFyTHVYn2jcNfV2fItEau9DsJO0oIfLvYQxoStT7XeN+jaSxqY5ElGmkyeLDu0dfCiDWQikpw78JAeedhjUPXWsTp9Qv824yzDtWuQbGusFuX2K1KqEhicTjDfJ+kakJw8vHsapjWUoKhluTT4QqME8virUO9a7DbVGManU40opguVsT+WGzPCrz46xGOn59h+XCO5cMZpssJJowkbsfPz/DDH15ivj/F4dM9ZNM0yE9A7IqIr/QaXTWjB2uWQN+KwaLzUZctrLl8ozbGotw22K0rtE1HjNF7zr3SEvk8xWxJIRc3fUiIISW6Pk4jTOYputbAeX8lwDLGodrV2K4KtFV3icHqA/1PYRgWbWMCQL76gIXgSNIIs2WONItvlAgKximcIkh3WQioEWHTQXCOiDE8zqZIpcZvFvtoHC38OWdQjFivWRRjqiNEQkJ+oHzgNmOcw6akJL5///41/tf3r/BmU2BbUf9SpIjNWkwSLCcZJrFGpCgk4iqj/sD2DJK7prPYNW2Ied/ilfNwrUEPSst7drJGa+n3PNmf4cF8cqdrh+AMeUyBHFJwfLE3xdG6wIuzLV6dbXGyK3G6rUJQRYeqNbAhIbAfkvxCVLqWAmmskUUK0zTGPEuwlyc4mOU4mGV4spzh8d4MWazvHfv+9jAgJDEyPNmfIVICT/bn+NvRGb57s8LptsTJrsSuaglswYbEQzpuKaibK1YSsVKYZTFmaYxH8wmy+NP01nysERj8TVMKn/DVKKFqfDWGXNjeoLFl8GURwCKJm4LmESKeIOIx2FvFvZxJxDxFJubQPAFjHN47WLRofQ3jG9i+g+89mgDgLnpt6PecM1hvSxCvGgYOySQUjwIYPGewhrCOzjfB4/UJAVbviJXr23cBVmDY7lrs+0saD5KE1m6H0/YlnlX/iY05RuPKS++L4jFSMcUyeoxH8bc4jL9EzDPEIoPk+i1ARbLAgRG5GADCGIP1g4+whuL6p3HWg43OWYeuCWCAk1d7fjDBYn+CJIuQZJpAwwceNAcgGUcqFR6mE8yiGA49jpvyAhPfY9VW+G57Bus9pjrG42yGREjEUuJVtcXfdius2hqSUUVRpjQmKsJERZjqGIpzfL9b42+7FVzfYxlnWF5xPFGksL8/wWQSU1eW82CcwNCgmGGMNt7H0uMAAof7fB8SaBkD4kQhjsmznecx5ROwc/8wY5RVoCP5Ub52sZB4MplhHsVYtTVWDf3ZixOUpiNgFcXYixMs4xTzKEGu9QfVffzsABZjDFoIpFph17bYNA2qrsMkilBpM5aXDqOFwIMsv9RV8zlm0KV630NKHkAWJWzdlcViYCFEQQZG5g4AK8SKm44iMe9zVmxnYTqLumqxC+Dq7PUaZ683iDMNqSSSLBoT9uqqRbGu0NUduCDZ3mSRYrLIoYZSucDwVNsa3vdUOpdqzJcT6FiNwLAqGpy+WuPFX9+Q0TPViLMIzsVAD+xWJV5/fwJrHKJUk9+ic3DOYX4whdRy9K3ddN51RN1S5ONSZMZ8Tyy+aSk4oioa2LfkdKZzKHc1dpsKbW2ule5dvGineTwGbNz0ERmBihJIMioorosGbW2u7LsaJYJn1djjNYzve9jOoqkNuqYLn5Xr5RkkEdTkF8tvlggOWujr6HcBBsGAeZRgHlGXlAtlxDzs6n2o+fQuM0R7l02HV6st/vL6DL9/9gb/z99ekW+JMaSRwiJP8GQ5w8Esw8EsxzSJkWg5ptgB5/eJi7Hn1nsY60OHFAVkaCFgncdZUVNSnvM43VUomg5fHSywrVoYSzIVKW53LgTnEJojBjE3jxYTPFxMsJym2J+kY4T7umywrVuUTYcusFnDx0NwHpL5xFhMPM8S7E0S7E8zPFxM8HA+wSSh/6ZvKWO8zYxAnAN7eYpJEmFvkiGLNdJI42hNx7+palSD/DEwcAPAGqLvE00Aa54l+PJgjukto4o/1wwdVpmcovUVGHhgsBq0roLtiU2yvkPjC2K1AmgRTCHiKSKRnssM3xoOgUhkyOUMEU8oNQ09XG9hfIuuJ6Dle0u9Rq4eGbLLxxgYLHazB2soJY54CuM7MFSXGCzbd2h8CePbS96ejzEX48BdbynUw5vQdXXhGEHHqEUS+rj+/sYH1rKwa6zNMU7bF6jd7lKwPgML4OoRHsbf4En6j3gYfzt6r+7qn+kYeSnPge3nncFPZI0bVTp9T0CBcYZ8muDwi/n4mf8YsuhB4aGFhBYScyR4WW6huID1bkjBQGk6HNUFtJB4kE7wOJ0iUwqp1Nh2DXZdi6O6wEzHmOmEalB0jP04wzLOoDjHi3KD46ZArjRad7XXWoX+rywP18oLPVnnJ+qtf/dWN9fwHy6enr6XGFvMr3muj3E+lRDYEwn24gR5o5EpjamOsNdRsEWuNCZaI1cRcq2Ryqu9aHeZnx3A4oxhESf4ejZHFSQgIoCuYcF28b1QXCBV6k4g5FOMEBxJJKBjif1FjoNljvk0RRzfwzvCSO4WxRpaqztJ/HrvYY0dtbD3mXLXYHW0QbmpR6aj3NbYnhWwNhnlgLtVgbNAJXeNQdt0lLJXtnj09QE450gnSQBPFjYsiLYrYsO44Pj6d48x3ctDSISHDxc56p6iHZShoPoiZulagyKAmWJdoioaPP2Hh8SqBX0vu2FhKpWgZLw0QpwoKC3hrIO95ryRB4sYrLclgqYLDNaqQtuYa4Et6ZkVktAlpbUEv4OWm3NGcr39HMWmxm5zdX/XKBFcldThcWEDwrseTW2wW1doanMlA3bpdwr6nbNldiuJ4H2GsyGN6sffQ/aBYTorKvzhxTH+519f4MXJBmVIy9ufZni0mOAfvzjAPz7exySJkcVUsiuDHO3qo+5DcASBAGM9WmtRtwZ5HCGJFH44WuHF2RanuwomFCEWTYttVWNbN0gjDSnuzr6QvIXi5h/OJ8gijUd7U5RtRzLBUKJMCX0XU04xSuyGrq5YUVdXGinkcYQ80YikvLf0+DbDGQGmPNZ4upwhjzXKB5SI2BqKbqfzRWeZB4mg4BwyBF/ESiLWErM0wTK/OuTlpzI8SPhSMUXB12BgxCz4Bq1vgrzNB6ahHCWCDAyax8jkjJgEdvX9hkIuUmTynMEapkePzlMku4dD7Qq0vnon2U1cShG82YMlmAzBGjN6/iAXB4hVal2N0mzQRvU7wOdDZ0inI5bsvAD3bSA3BneEZMTPno/+Gcb4DoVZY929Qe22IbI+rO6BMahioR/gq+yf8SD6GnN9CM0TCCbv5YCnTTV75XvyOcZah6psUO4apHmMvcMp2pq81KP3dEj3+ZGHyrA9ZE/XOcU5BBuK1lmQ255vDHMwkhCyITmQ7k/DS7j1XPVa3/53tz0ft3mujziJVNiLgFQq7MUkKdfBptA6h9O6wgmA/STFfpLd+1B+dgBLMIZFkuCr2XxMRXnfSM6RKnVtjPOPNYJz8iVNIuzv5Xh4MEWW3m8xygBIKRAlKpTp3v45vO9hOwfTGEqwu4d5uNrVePPDKbZnBVREx1BuabHe94Dp6Lm3ZyXWx1tYS9RvWxucvdng7PUGYAzTZQ6pBAGsANSc89itSjz702s46zDdy/DVbx4R1exDAphxMC2BsaHglm5856/FtBblpoZ3JY5errA62iJKI+x/sYckjUZJ3ftm6HZKMj2e6x49mPNXnjbyYDWoinclgrZzKLY1SQRrc+V5Z4xBaYkkj5BmEeJE3zkBcQRYyxyr4921BcLW2DHkoqkvJ995T143Aqgd3DXSwGGE4IjD76SQi4+/4/h2WMGPOUP309mOANb/9cdnY9T3LIvxeG+K3z45xH/79jH+2zePIYV4h7G6zQxn2XuPRA/SQmDXdDjdVRSN6yjtb1MRyyQER4Z7ACxgZN7SSOHBkKJ3IQTids9z+YX+WO8QYySfyWPyon2xP7vTsbML/7xCvfmTG1roJ0jkFMpEYIwT49J7dL6G9RSVbnx3ScJ3CWDxHOIagDWGXPRzaJGEAmKavvcwvkHltvC9Q+PK8Xe+c4ycJILE9tzgxWQSsSCAVbkNmLkI6uh1lXaN1tXvSPc+fHrY3qD1NcXZ++4dRu78GM9lj58/LuvHH+M7FHaFtTlCZXcXANbloJKFfoCv0n/GQfwlJJPgH7C8JGaRyq6px+3zjjV+7I1cPpji6a8eYLMqYe0x2roDgk2VfQaQNYRhUJIn9TxRojYdSB8UGON7Nmw0DUBsiJ8fgNhnP9uffmIhr00eflnucFJXKE0HxTmWcXrvjZWfHcDijGGiIzzKJ7Dv6VdpnMWmadBYC+uvXhD/mMM5I39MrLHaVDhbl5jmMR4dznCwvGNEcFiID4vwmyRZF8cah7JosNvUmC7ze50XaxzqskXXGEz3cuw/XsB2Dm3dEesSKfR9j6busD0r4b2HVCQF5IIhySMoTYtw01k0VYemalFua1S7GuW2QlNRf8vAnghJAQ4UoKEQJSShm8wzpJMYUgkYZ8fXE2cR9h7OwDkns7510JEkBsy6cM6uBwIXF/NSCaR5jOkiRbGpYTt3pcTPdBR9XhftFRJB8qENHqyrfycQpxqzvRz5bJAG3lE+yskPNV/m43m5aqz1qMs2sFQdvPOjNnoIE9kFgHVTj9GYIrjMkebxjZ/H1lmc1hVOm4rkvlIhkQqpIlp+mKJrcdbWFFHb1DhtKN1OCYGpivAom+BhOhl3nsQn8mHVrcGqrHG8HWLBbdCYEwP0eG+Krw8XWOQJmXnvyZaPP8WoZ2uRUcfW2wEMBPiow8nfU/p8VV/g+V8+/yKy7ymlyhiHNpimTShpH/plBj3/sDkjFSVaDaEitNlj0RlHjJumTjwXuluSRCFJI/R9j7rq6HsQNnL84BUAscpaifEm651H1zkYY8+fK40wn6fIJ/F1L+mD5qL87nyhHxjQ4CHqPHViVW5H0e3eAOwcYCXyfQCLQ/EIscgQ8YRCHSBCMpy/wGB5tK4KEkE7Hptg8jzpMKTC3TSSKaRyipnax9ac0k56+Di7AOS27BSV26ILLB0Pxa8fOq6nyPGtPUVh10FieeF8QFDwh0gooEFkkEz/XQKsHg7Gt2hd/Y7vjoWEy0ikiEU2hlcM3Vf3Hdsb1G5H8e+uwQeZxT/CCMkRpxGSrENVtHj+3RGtW+qO1BUsXB5+7I8Hoyj2p/kCrbM4bkoUpqN7Ipc4aQqkSuNhOoEMO8o708KXPVZtjVQqcMZRmBYHcY79OEMs3q+q+tgbnZ9i49T3PYx3pGK448+umhpHVYHSGDzIPqwb8WcJsKaRRiLlJQ3w27NuGpRdh9oaGP/puzRuGsYYtKSugOcvV3j26gyLWQqt5Z0BFmPkD0pDwspdWDAKN2jGxfN9zos1FnXZoOsskkmMh18t0TYd6rIBFxwqUuh9j7ZqsV1RbHWUakoEFAJp8DQBwbe0rbFbl6hCh1S5qdFW3RhugR4QioOLQa5HKYXpJMFkkSGdJBSmEVrEewBJFmP/0QJKS3RNh67pEMWa5F7G3Sp2fRipZABYGWxH0jpcsbAdAFZVNldKBIttg+36eokgYxRROl9mBLCiuy8kuGCIgx8qmySQ6urPxuBn260rNFU3di8xxs4lgpv6lhLBEHIxxLTf8HnsnMPLcos/rI4xCT1YRMOzSwBrZzp8v13jz5sT/Gl9ij+tTwIjrfEkn+K/H3yBWEpMVBR24+58um41VWtwvC1xsi2xq1sY60eAncUaj5cBYGXJR7pZMCRKYZ7FmCTROwDL98SoGefgPlKJ709xOuNQVy22mxqrsxJV2SGfxphMYtoI8P2FgssOaUrMr1TE/HnfoyxbVEUDHZGRWmmJriPZ8t4yg1ISvu+xWVdYnZUjYHJhU4YxhjSPkGXRmGRlOtqkKouWnquzWO5PICX/ZACLM4HoUgT68B0LRaS9QesbNL5EbXcXJIKA4gkBLDGB5Fdf9zgIYPXooXkMySiUwPXkFx0YrL73IVnwMsDSPEYk4rDAvp1XSXKNTMwwVfuIxfNLjJfvSYpo+w6V3aALv48xifdtjN12fO9QuS3O2lco7OqdzjDBJBTXiHhCQQ08G6VUf29Dn68uvAeXA0d46LrKxAwRJxAq8OFhINTnth37tT43pyKlCOm8EaqiwdnRFj7cL7NJDNyxLudjDQPDPErwZT7Hm2qHV9UWZyHQQnGBSEpkUiOXERpnUVuDbddi1dakxgk+r1QqHCY5lvGHR5P/FKZHj9Y5VKa7VLx8m1m1Nd5UBSpjUJrFB332fvJn0noP5/1ocOZjbC0D76//RPd9j8oYrOoaVX6P8s+PPkOxJcnahl6a+5j1GWO0YJglSPK7FdrZ4BParkq0jbnXxhDntBtsOvJNFZsaTdnCdJQS2Pc9+cSkgI41rCG/17DbLhWFc0gpqB8hyNGaqkNbdWMAxxgqEX4nOD0nlxyMswD0WmK2kgsyqT74p7IIUaIQZzGiWINLjt7TDvVdPg5SCWQTAljlrrl2EW1aKtSrr5AIUorgwGBdc94ZIwZrmWMyS+8EAocZItNnywmyyfWJfr33MB3onNfkjUuyCEoJkgg2HYpNjbbprmVJSGbJQuS/RjaJEcXqRsmqCSWHf1gfh501jomOSOYwhD70Hid1ib9sTvH7syMc1yUqa8AYQ+MsFOP4IV5joiM8yaaIhRxrGj72tNZiV1G6Xxsi04fRUmKaxJjnCWKtPp5FI5in3w7tCf9p9BT9EkvCh3HOB/bKoK47VGVLi31jx/PiA9N1eYPAo2kM2sbCh3uHsw67HRnnh6LQOFaYLTx671GVLdarEtYSsOKSQ2sJJXlI0Tz/PntPFQZCMJjOYretEScaxnxsGdv5iDHlbwrN4kv3DZIGNkEaSH861xAgGSWCc8TiegaLMQ4BDskUNI8RixSax2h9HxgsSpHr+x6db8d0P4CCCGKeUfw7U7cONBgZLL9Pr4vHIamQCn9tb+CdpXCF7g3JCcXs0ibMXYcKhUl+uDNnOGmfYWdOYfr24tlAJBJkco5c7oUUvB+3Z++nNEMR83Wlz0MNAAcHY/ySf+9Ov+dC8EjjS2zNCVbdG9Ru90l70G4zw8ZsWxuUuwbFpiJJf0SM+rAJ+amvx8MaclgXMQCp1DiIMzjvUdoOtbWj33SqIuxFKbSQqEyH0nZonUXrLIz3cCE4ai9KsYyzwGB9GCwYjq33IZzKXz7mH2OMd3hd7fCqKtCjH+WQt5ln2w1elTsY70POw/2P+icPsIxzqC2lA8Yh1aN1FmX3ftB0Vtc4Kku8Lgs8nc5gP3OK4LDbWtcdFvMUy0WG6STGcpHd+bkYY4gSihAnGdjt30ZjyAu0OQvhBve4cEWJxiywbpvTAsWmwmlIEcznKZZBmpfPUxw+2UOxqVDtGnStGfsQhOBQMTFdA6tmDe3Ij4bRK4fAkbMem9MCL/7yBl3TYf/R4rKpfqDsP8K2kpRiZLBWx7trJWDd4MG6KqZ9SBFcl+iaq5lDii4leV9+b4DFSK60nyObJtd+NnpKV4BzHk1FYCpONVgew/sebWOos6u5nsESkkNHJLOKQ/u6UDenYhrvcdpU+G67guQCT/M5ZNCM9wBqZ6hcuNzgD+tj/GVzisM0x/9++AWMp+sBwHBUF2iOLPxBj/0kQ6o+TdS28x6toeCHtxmjIWxBCfHR4sgBwFgfkvDMO1JowanDaQjR+KWO9542ZvqeCi0jYp+apqP0RCUo0TBWmEYpskmMPI/Q1AbbTYPtpsJimWNvL0NddTg7LbDbEUjrPRVfDtLYNmyOWOfgrMdsnmK5nyPNIqxOy5Hd6vsecaKwXOaYzlK8fLFC29r71W3cYUTwSF1V4uv7QcK3Qe12aH0VIscteGCXMjFD8p6Qi2EYGBSPkMopSruhElk4WN+idgUB3JHNIAZLcY1EThCL/MbnvziSaaRiBq8ccrVAIiaBKWlGn49Hj509w6vmr2CM40H8DVI5vd9JxCB3M6h9gbV5g9fNd9iYYypSHs8BkIoZ9vUTLPSD0MP09zsMxFRxiCskkhQWYnwLB0Ol0B8wvrewvUVpqdD4uH2G0m3Q4/My9aaz2KxKnLzZwIZU3b6n8AupBEx3dfLex56+p2JhFwALAERcgKsILGPIVISv8m5c+8RCIpEKkjEY72G8g+2JtPB9P6rASKavkUn1wQxW3wfW03m0xqEzNhAl/bi2+9RQq3YW/+/qCP++egPGgFxHtwaOR1WB57stIiFQW/tB6tSfPMBqncWubYORkox5ZWdwUlETNRXTvftzx1WJN2WB10WJXdd99iSavu/RGQfXGDw6nOLR4QxZGt2vhJMRyJkuMmSTZPQz3WZMYJw2ZwWaqh13F4Db774MAMsah/XxBqujLcpdjXJbU6S695BKIJ9lUFpBKhmS/yy4pP4uFSnoSMFZB/T9WEonQjO4Dql9QopL7y9jDEJySMXR1i1OX6+plHeeIQn+Hx0pSCnBOD9/vBaQkkqOh56F245UJGucLt5f+jvI7urA5l0Er0PC4G5zPYPFAoM138sxCR6suw7nDHEWYeb793qwgHAhtCSx2q2rkYHyjgqGi20AWNdsTghJfWVJHo0hINeFalwc6x3WbYNnuw32kwwePaQQEIwSjypjcNqUeFls8bftCi/LHb6d7eF/O3iM2hqc1CVOmhKnTYW/bVd4kGT4573DO5+r284QckGSvLfOBaNF6dv9e/eZ4fPi+x6tMdhVDcqmg7mQWslAXVBR6HL6WCW+P8Xxjtgq8m5S+l/ZGJRFAykF4kSB5xEmkcRiL0OaRSFCmNJNi6LFweEUe/sTrE4LvH61wWZdhWAchra1MMYR41V3qKp2lAcu9nLMFxnm8wzFtkGxI9kv+RRTxInG4cMZiqLB8dF2VFZ8qqEUwQSJmEDz6FKPVQ+HztUo7SYk/NWjp0gwknClcorkPQzW+QSAJaaIRU4dW87A9BSe0aOH9WYEQQCDZBESMUEssls8//kILpHwHIwx5HIPuZzD+Aaud+G5aRlW2BXeNH+DYBKpmGKuDkLpLx/P+fvuXfS9Im6EQkBKFGaFVfcGx+2zIKccNsQYOBPI5Az70RdY6IeIRfp36b0aZmCoBBOXwk+AIY2R6gKs7wiQ924sDL7NXGSuBvnpzpzirHuF0+4lrG8/u8VjSN1dnxZQSkBKSeEvLbFa1vgQdHG3tdT7hs4tgaKB/bHhc8qC6YtdiHFPVYTDZDIew8BwXRcQdX7ewz3sHsc9VJj4C75V6yiVrzUOVdOh7qjqwzhH6qHx6D7dFLbDH06P8T9PX0IJgYM0Ra5uV8WxbhucNTWmOrqXh+vi/OQB1qZp8LfNmkzsnEEJju83a/zb0Ws43yNVV2fVn9UVXhY7rNsatf38EsFht8O2BmXdYSH8+eIAACAASURBVFs0YAxIYn3nJEE+enVoIa4j+U5M+XVjWovdusLqeIdqR0yLUpJYmVt+t6JEY3E4gY4lZsscB1/soWstTGuQThMcfrGHbJogSjSscYhTjckiQ9cYKqUTHHsPpogSjd57HD5dIgpmc4RwjHrXQEiBh1/tX2pET/IYX3xziCihCHMVKUwXGcnbtMThkz0AwOJgiiSLIKXA8uEcSktkUyoNjhJ1p2CQixLBKNXXFjt752EZgSkTfB50HWToWoO6JPmg6a6WEjF+LhHM7wmwGGchBCBGGiSSSks4d3XhsO97NFWHzarEdEHnZ2SwtjW6xlwbcqE09YRN5ymi5PZlkD2Iwm+cDRIHhVxqKC7Q98BpU+HPm1OcNCUypfHtbIGvp/THeIfDJMOzYoNd1+GkWaEw5s4667uMFByxlohDQe/FaTqD012Jo/UOy0mKSN3cWXbdUFS7Q2MsXq12+NPLE/xwvMaubkdgpaRAFmtMkghZrN/xZ/2SpmkM1qsKVUkbQc758Fk8v1YxkCyWyi5pwT0ECiklUFUdXr9coSpJ6honKiwkgKbpcPRmA2s9ttsaxpDnSggOId6VXxLIo+vsZl0BAFanJbqWpIj3UQPcdhgoqU2xCIrHJN9jelzQVm6HVfcGld2M0j0GBsEENI+RiAkinkKwm68pisdIJTFehVVo0MN4in/v4eG8HQEWebwipGKCmN9PSseZwFwd4mn6W0iu4Zu/ofPnwQaNq7DujiGZhmIRXG8xVUtM5BKaRwFsvf970Poara+x6Y5x2r3ESfsMJ+1z6tgCJbBxcMjgu5qpfexHTzBXh9B/5wwW+f+ya9lT07eA67E1ZzjrXhEzKQlw32YIoFFAy1n3Cmfdq5FZJND26aS3tx3GiTFP0giL/RzzZY6mNticFSOb/rEDBBtncdbWYH6DwrYoTYeTusRURUikwuQawDDkKd/uWNgIwu4zbWdRNh22VYOTLRXVl02HsunQdAatpaAiNzBYuGsW/P3G8R67uMMX2RSHkxxfTeeUBniLeVls8Zf1GQAg1x9Wcv2TB1jrtsH3mzViKbGXJJhEEb7frPF/Pn9GrdMJtS2/Pbuuw+tih9IYVG/5Jj7H+L6Hsw6uZaiqDruogRQcUgjE0d1uSowRS8EEx2SeQkUqLAZu9haZLgCskwJlkOV574ntueVHKUopPnyyyOk1WY+xE2NI61KCupX6HrMlPc67fizElVpAagn0wOFTieXD+SjdGfS6jDHo+HKHWZJFePztIQ6fLkdEKYJ8iAuOwydLLA5ngQkjudry0Rzzg+kI7obW8dvOwGDN9gKDdR3A8j360NE1gCweerq61qIu2nGxeNWMKYLLHPn0fhJB8udJKCWQZBHiWENpgb7r4a+4T/W+R1O12J4VKA8m4+ehawzKLRUV+2ti2gm0JpjMM0Sxwm0v04PPqnG0EEylQqY0tBDwfU8Aa32K47pCpjQepDm+me7h6+kC6IHKGkgu8J+rY5zWJUrbfdKwB8k5YqUQKfWOJK/pLE63Fd6sC0RKYm+S4r63K+97tNahbDq8Xu3wp1cn+P54RQCLkW8z1hJ5rDFNIuRx9Nn7/T7lNHWHzZoAlpRUqE7XkIvx8ASohBTggo3eNaUFtBaoqxavWzPKU+JYUeUDgKY2OHq9hTEWu20Daz2k5BChDP3ta8TQoQUA63WF3a7BblujC/19n/IOQ2CJghc0j0JiH21Q+d4SwDJvULotbPBeMUayrosA66YEPsYYNIuQBQZLMBWYn3ZksHwoHz6XCN6PwRpGQGKuD0c2ZGtOsTWn405368rAbFlKMfQ1HiW/CgW2AuoGpqRHH1iRMxy1P+BZ9R94XX+H0m1GgEWvneSUqZhipg4IYOlDSPZppMc/lxnkqYmcQnGqCBg+7OT/a2FhsLNnOGtfIeIJ9ardAWDVjjxXL+s/41n1H1iZI5Qh3fFzs1dASIEOyc0Hj+Z48u0BtoEN71pLyg0iSj8aymqdxVlToerWOK4LHNUFYiEx1TEOk/xagIU7HMKHHmprLM6KCi9Pt/jzixP8+eUpTnclznYVqpbUL84Hdu/ST37a91RHEl/+aoGnv9rDb/cP8Lu9AzzObyct/tPqBIwxFF2LXF2vWLrN/OQBVqY0DrMMOmhJGcjzkITFzqN8gr0keefnVk0D6z1EXSOWd4+7/tgz0K+cM3TWYRcWDUmsL+183uo4GfmCWMyQZDEm0wT5NEHbGJKfvWec88SmFA22qwKnrzfwzhPjFN+O1aEdXg6pevS9GsHQwNa8PfKCXvid3hzGIKRGHwVw2PeB+r76uYQUECEcYwBkA2hjnEHHHPqt8mYtOHA7dvjKkVIgCx6sONXvDSbpe8A5h66hAI4heawpKXHsunJnzlnYIdOYzBKkdwwvGWY4F+BAFCtk0xjZJAF29TvR8QBGtmq3rlCX7QiE2wCwbsNgTeYpAaw7fMUotObcd+VCMp4HMVjPijU67/EwzfHlZI7DJB/N7eTHpEtXG+QIn/JynWiFvTzB3iRBFmsowUfz7q5u8bejFZTkqDsDYx3SWCNW1GPFOZmNSRJPNLMPf4Zeq846tMaiqFusyhqnoW/r9Wo3xsILwbGcpHi4mODx3hR5ck958Y80qxCrv+va0VD9IM3xIKX3kXN2o+k4STRJ/1JNAIqzMYRCCA6lBeJEI5/EiII8lTEGrQRms3QMsxmvr4Mn88L1aPBzJolGZyxJVSXH3jJHHBPTPZkmePhoBgR26yKojSKJyTTBfHHP0vhbDgsZ0JwJKB4jETkaV4wMVu12WHdvUNltSNvjAVjl0DyGYjowPTd9SVlgsEhSKFmQQvUdaleCUgtJwueDRFAxjVRMwuNvfw6GY+GMIxE5oIAiWmFjTkJ64Ja6t+Dhe4/a7bDqXodYeoPGFUjFFJFIoBjJJgcJ2yA5c72F9QaFXaGwa5y2L3DSPsfWnsL6Dh5+lMAlIsdSP8Yyoj+pmIbn/el+z36MobRHitNP5Qyax3C9GUMv6H8OW3OK181fYfsWhV1hZg5ChL+i8IvwfvcIYUa9gesNSTbtGjt7ijfN9zjtXsH6DhFPEfEUpu9gA6C/2MH1Y44QHHGikeQRvO+xXVeoigYuVM+MAZMfcZkpGEciJXIRwYbd0UxpzHSMRZQie8tzPP7qa+SAwDmsufiIO8sCvceu7lDULV6ebfHD0Qo/HK3x/HiDZydrbMsG24oCoX7MYIuLkzmNXGj8w3yJb2cLPMwmWMTv4oSr5mE2wbezBkXXYREnv2wG6yDNgjyQYxpFEIxhGaf4Zr7ALIrwD3vLK7PqX5cFIiHww3Ydfu7zXiRZMMNDCyrTLRsoyTGfJgOmuNNwQTuUSaYx3csx359gsyrRtea9LFbve9oFbAzWJwVefn8KMEL80T0WCONu8g3Hf5sv8RhKcctzMYAqhB/7VHPuwUrfy2AN451H2xpURTMu8K4KvhiGhR14pSXiNEI2jRFnetwtv+/oSCKfpZjMUxhjURXtO4+hFEeDYlOjLlvYEEHeXQq5uJ7ByqcJposUUXK7aGYgfBcYRyQEOAa5oIHrBZz3OGsqvCi2yJTGMk7xq9kSyziBYOyCFJCAmb+wWP5Uk0YKB7Mch7Mc0zRGpCSMdeh6h3VZ40+vjrGtGyr/rVoczDIsJ+kYsT4ALc44pVF5D+M86tag6gw2ZY1VUeN4U+LlaotXZ1scbQqc7io0wfcTa4FHiyn+y1cP8dXhAnn8095Vf1MV+PfT1/h+u8aqrVGYFv/j4VP8jwdP8SDNEUHiCmX3pZnOUyhF18vB4+bD94kFH5WUxJhrLUdvlY4UFssMWR6db9oAb11khw0d+gyNPXAhuTGK1Qjslvs5kpTONw8bJsOqYZAt6kgF/9enHUoFJIap5rtQ+Fujtjs4b2H6Bs6bS6W/WiTg7HYKhXPJ33RkpMh31Y4BBrRA9qN0S/EohFzcj8Fi4NA8AVcSS/cYTVKCgeFN+z0lF4aTbfsOhVmh803wZX2HROSIRY6Yp5BMQ3IdktYohbDz1NlVh/Ll2u1QuwLGN2N5MWcckmnkco6H8Tf4Mvsn7OmHiERyCRj8vY5kGpmcw/UOuZwjFimsb2HQjSwmAOzsKWzdYW2Og4RzgUikF9IlKb6dgJIJ70eB2hWo3Ba13aFyO9Ruh0TkmKkDRCJFaTco3Qatq9BfCFf5MUcERUg6iVEWDbZnJVk+rEOS0vf+Y39KYiGxiFI8jGmDsXUWknNEXCJ6T1HudTNuNrEL/qx7EA/O9zjdlvjhaI0/vzzBH54f44fjNYq6Rdl06IxDZ91nVY1JxnGY5vjd3gEeTabI1O2vS1Md4ZsZ9YrtJ9kvm8GaxTFm8Xm3SOsslmmCXy32sJ+k+PXeEg/zdwHWNIpQGwMwYB4rMEZfah602r638HCUjMPkraNl7zv9hb8YS6bFprOwN3QMXTUXWYoki7A4mGD5YEZSl1V544LT+x5da7A62eH5X48QJQqzvRzZ9G4GzfFxHwVc3Q0o3fXxHzJCUvT5ZJYiDosuxti159k7AihV0Y7ep6porgVYPPimkixCklHXl76jbPSq0ZHCZE4AqNzVVz6m90AbAi3qsqPQEbCQIjgwWFe/Th1JZNM4MFj61u8FZwyJlJjpGD0QANUGghEzdFSX2HYtck0A62k+wyyijikfomVJdtBT/cgn/gzEmrxXB9MMD2Y5HswnAUw1qDuD5sxiW7Uw1qFqDR4tJngwn2CWxYgVpf1xxsA5ASzjPDprUbYGZdPhdFfiZFPi9XqH56cbvDzdkma9p3jZOJJYTlJ8dTDH754c4slyhjTS733d1F1EYM729P8MQCzpxvypGf11V+O7zRn+19kR3pQF1m2NgzjDPy0OsYxTKP7+axRjDFlG/VOXUkUvMN/XDfmvEvT5qGMaf/biz739vNc952SaYDJNrv25m47n4w6DYnFgblYQTsLDofU1jG9B22cemsWIeYpczhHxhNirWx0jAbhUTBHzPHiqetjAlNEMu+H92J+VBongdT1b7/2NjFgwBY2ZOghltgy2N6gsyfhM38H3Fk1fjhHeDIykazwfS24Vj9D35Kqiclx6vPEtunB+huEQkEwhFjlSMcEy+gIP4q/xOPkHRKE0+VOvC34OI5kEFzk8PGZqH3P1AH3fo7SbEHtPOxUDWNqZM2zMMZLAaiYih+IaHBIEsDp6b90Wld2GYJYKnW8gmYJgCqmYYj96gkzOsepeAR0oDMt3cPjxAZaUHOkkgjEOm5Ni9NCrSCFKNaX1fuTaDMkF8hCzToqdy/e6PqwlGWMY9nzPL0ssCCb6cVOK9ppIeTHEsyshIAUn8IV+BF1XvQ4KsfBoOovXqx3++PwY//HsCH98foyXZ9t3Hs/Y5TqRi8/5qa+WaaSwTFI8mcywl6bj8VvvYb2D5AKS8yvVSJGUWMQJnPfI1O03jq+anzzAensE49hPQympUsj01QvRTGk8nc0QK4FlKuD6NVqXQPMcjAk0boPGraHFBLGYgbPb0Yf3He9Jmtd5B60FIiWhBIf4wHjfJGiCH321RFnUOHq+wm30rdY4nL7Z4rv/fIV8luDR0z34/Rzsjv6kv4fhgjpx4lQjTjTiRKGOJKyxV7I7LqTwDaDKdg510Qbw8u4MIRqL/QmSLL5z6Ml1oyOJyTzFdJHh7Gh35WMGtmoXGCxjHATno4y06wz6G0MusiDLvN3nRnGOvTjF19M9OO/xb6ev8cf1KXgArS/KDXKt8SCZ4CDJMI8SJEKCgcE4hyL0eQDUAaK5+KQgiwdp2CJP8JsnB7De40+vSG9eNOSpa43Fm02Bzjq8Wu0wiTViTSl/gvNR8jre4DxJA7sAyqq2w65usa1I2swZo/OUJ/hiOcNXhwv87ukDfHkwD2Ea76d/XN9j01Ea0rqtsW4bCM7x7XSBb6aLT3eyhunPd0mHTpbR+3gfKc2HvL/v+9n7Pu9nukQyxs4ZI5OCj6EVffASBS8sk6E3igAWw+2uKcRgkUQwvhTr/rbUpx99XoprxCIPIRoftjEUiQRzdTguECORYNW9xln7GrXbBR+WG4/I+g4NSti+A2cSgslgpO9DvHwH23fvSMs4OCKRIuYpltEXOIie0p/4KbFhXN36nP3yhzg8xSIs9Rf4Nv9XvK4neN18h7U5GqV7w7jeoXUVfG/R+gqlXV9KffRw8L0j0Nu3o/yPQyCXe5ipfRzGX+Fx8iukYgrOOMkEe0My1f5dJcanHqkkskkCKSWyPMbe4QQAJRRHscJklnySe1Afwn2s8zDOjdfSHqC0PuepUzWsGQZFhxAckgtYR/cY58m7ysFQNB3KpoWSArMswSTRo1xdhMoRKd59MTbcq1ZFjR+O1vj9szd4dkQhTG8PAyCFQKLleB+U4hzQfOo15iyNMUkjiAtqI+Md1k2DVVtjHsWYR8loNbg4nXPYdi0658AZR6ruH3TxMwRYDAdphmWSvpfiTJXCl9MZDtMEPdvA9hu0zkAwDQ6Fxq2xMc+R94dQPIHCpwZYPZrWoGg9pnmCJNLBuP1hF/Eki3DweI7tusSbF2e3/uBa43B2tEXXWRx+sUBVtPCuBwcxY///nA/nDDySiBONKNWIEgqO8M7Duyt8TY4kmNT9RWmC9XskglIKZNME89C7c1NR721HxwrTeTpK+K6avu/PGawqHKMEuoYkhd77axkspUUIubibRFByQTLf6QLPig3+7eQ1dh1dpBljyJXGREV4mBLAWkTnOujOOxRdh8oQwEqUghIC/BOueEnSyLDIU/z2ySEmSQTne7xe7dAYi663aIzF0brA8aYIcrbzjZNzbTzeMfsOO4f9uMtIf9fhprk/zfDbJ4f4L18+xNcPFvjqcIFI3pxU6HqPdVvjWbHG890Wz4sNtBCIhcDX08WPig94kISS5+6zYZNfxAwSQWKwzlMBBxZhGBGS33I5J/ndrZkYBsXoGvRurPu71wEWHp+ICSKR3Sql8H0T8RRax0hkjkikmKolfih/j9YNDF0/SvsAwPYGNqSRDkd08Xivi4RmTCDiKSZqDw/jr/F19i84iJ4iEsnffe/VVUP9aBr70WMkIgcHR+lIukeFsucAy8Oi8QSuhvfj4j8vg/Xzv0smMZF7eBh/g8fJr/E4+TVikcH0LQq7Ru12EDeEtHyqIVZcIp8kIxMEDLbOT7Mp3QevrvMerbVoOgvJGaSktN3GGLTGItEKiSYPtHUeve+hlQBXLGzgUdXHsNm3Lmscb4oAfASSSNFmn3FQ8vo+R+s8iqbDybbE90cr/McPb3C6rd6RAg7rciUEsjjCNI0QBSXH+WbjRz9dl2aSRMiTywy08R6rtsaz3Rq+nyFTGvEVEKhzDtu2RePMnaSFV83PDmD1AGpjUFsqI922LWpDMewXv7YumMh7OOxnPQ4yBdt32HTPg/m1g+IJJI9xU8TrxxitJA6nER5PYySxQppoAlqx+qAvZ5xo7B1OUWxrzJcTxJlGW3fkpXlPubL3FIcOAEcvVvj+j68htcDewRSLg8m9j+eXOMP7w4PRdTpPiZEy/krQ5EOQSFW0aOsOTU1/t7dhsPLozimH1w1JBInBejv4YzzWEHJRbCoCWUULHcvQ+fP+6On7hlxEXOBRNsV/3XeY6gipVFi3DXyQKDxIchymOX49W2IvSi/R+L7vYTztLB2mOX67OMCDdHJlVcPHmuG90FJglsbo+x7/9auHUILjzbrAqqyxqRrUrUHddeisg7Eky/Oh0HF8LrAx7EZyYrCVFNBCINJyvFnOshiz/4+993qS48rSPH/3XtciZGpIklUkq5rV2zM9ZrNru/MwL/u0f+++rrC1sRnrHqtpVVVsFglCpQwdruU+XI/ITCABJAlBsJrHDAaQGenpEenu937nfMJzOBr1+GR/xL2dAaPA1WDyFs6BTduyLHKeR2tOkzWzLCUwLYobGgLvo3Zdn6/GB4wcj6gsyKqSr8b7DG0XUxqoH3B9/9h74U3f976O+z5LXDGhcF4DaJQwcKSP3wGsHzKN0ZsSE1Pa2NLDkT5VN0G4PA+JIU1s6WBKp6N23cZE4w3vTwgEClNYBEYfKQR1U2FLj2V5QVwtSeoVRZNSNBllU1C3JXVbd6YLTfcpCW16ISQS7b5odu6LOk8s2Fq979p3GVha72OIt1uP/xJr83mIVmvlMAS7zn2qtqJnjImqBVG1uPydtFcMKbb7MtFNsyVSKCRqS+m0pYejPFzVY8e+w459l5F1gGuE2+s4MAasyslbA/gf/yF0wOEDBrtvHPpUut5OmDzbxJeCtoU0L1klGUuRXVsjhQBTae1vXtWkeYkQgmHg0ve1wVALJHnByXzFIk7JioqsKBkGLgfDkL7vdtS+y9//pon4/emMyTImK6ptLqSSAs+28ByTceiz0/cZBK4GOo4eJpjdBGurtX+P5VgG93YGmFd07FVTM89Snq5XeKbFwQ3eDaBdik/jNVFZEJg2R/6PMEno6mcHsJq2JSoLpmnC8WrFk9WSSZJsNQubaludUm1Kyd8cDNjxhjTtilV5TFFH+MYunrGD2fHT33c5tsHuXp+9+yPdSegybSzzLTt+rsVoLyRPC4Y7AV7g6NC3png5FPVKtU1LmWtXu4vjOd/96Rhl6CyZXwDWzSWE0ABr5LNepiRxDjdIm+qmJc+qbejw5k9d3ky1M0w9CdIUwXc4weoCmMOh/0oDkw1FMFrpoOgkymganV+24X2/qrRNu3MJsG57Xsrgjt9jYDkMLJee5TDLU+pOJ3QvHHA/HGynV1eraVvKtsGQkgMvxDVMDr0Q6y3T529ThpKEru7GWYbi7k6fk9mKp5Mlx/MV01XMZJUQZVrsm5UVVc01neWG4rEJC7ZMg8C28B2Lge8wDj3GPZ+DQcjBMGQUePQ83Y2zjduBK9Cf0yrPOY5XnCcR6yLHEIKq2dDI3u8Ct+8FuKbJbypNqazbhr7tMLAcLKVe68T5S726tDugjWf0XptrpTqKYGAMsNUPmWBp8KSnjpam0SmfrOYazU4KqXVenUuhkkbn4Pdufq9SGLgqxJQOtvTZse+yLqfMyzMWxRnrasa6nGv9Th3roFu0zlprUnRumCEsDKE/L9/oERojeuYOPXNMzxjTM8c4ytdGDNL6hRb4mhIIDKndKHfte/iqx559j2lxwqw4Zl3OWFdz0nq91VS1NDRtjRAShaZwGtLqnAn7+EafnjFmYO3Rt/a6388IW/pYUmeeWdLFV32cW8QM/CVVVlZMs4SyXbEBqC1sY32SvGS+TsmrirzUE0Sj01QZ3RpTVg15WeHYBr5j4piGbtIJwTorWKX5lvqX5CX3dvq4tonv2BjqutNrVpSczdc8Op0xXSfX1jVDSfq+w27f54t7e/zm3h4Hox6ebeJYxlaLpYHq+3/2SykIXRvzSk5kWTcs8oxn6yV7XkD5Cv+DuCw4idfMs4xDP3wrF8SfJcCapynfLxZcxBGLLCPrgoRvci1RAuqmompyGhGT1UuKeo2lfFqqbcr7+y6lJGHgsDcO32mHzDQVynDojwPG+30O7o24OFkwv2ioO53Kq6quG+q6YT5Z8+TPZ9o2PrDpj3xsV+uNfkgg74esjdB8AwI2k5ZN7tT76EIKKbA9HWw8v1i/0ka92WqwcuJVShxlr51gqQ1FcDfEC5xrtNHLCdKL1+ib36PlmAT9Lgj4Va5zbUtZ6IdzvM6IlunWyv9V4EopqbnnrqWNOTrjj9uWEoKeZRNaNgidM7UqMurOpezI73En6OMb1jUONejXuobBwHbwTJODJmTfC7Dk+194ldQUC8tQ2KZiJ/QZ+A49z2EUukxWCZNVfA1glVV9HWDJ6wDLNgx8xyJwLAa+2wEsj4NByP4gwLMtPem6JejeXC9127Iuc07jNfMspWxqeqb9wZydAssmsN6/q96/tdIUQZfA6DO09tm3H6CuMDDqRmv8/HpEs/RZLFtyEbMQ5yj0lFlbTps4joVtG1idxT1cmVYgtrblmasd+PIm2ToJKmniSA+nc3t713bmetJhY2JjS5fQGBEYA1wjxFMh83SCWU6YZzPy9ZymSglCAy80kFIikShpYggTQ9j4Rg/P6BPIIYEa4bR92pXNOrVZNRVtu+x+rp4u9/oevR8Q9m50OrSeMWbXucfV5/XQOmRg7m5t399UprTx1YChtQ+0Ou+s+9yH1gGhOcaS7q2mbaa0unO6T94kW20UgGf0CY3hrcG3EGILkjQADvCM/haEr80Z63K2BVg6u0wDLPkCwNo4VQbGgNAcMzD36Ju7OMrrqKb6emybFlcFDMxdEntF3qT4SucZKWnSN3e7nLIftm0XQmIIU4dKW3scuJ9Q1Lpbmlc1iyhlHqeslMnKrghEiWUYWO9gP7SJUPCNHgNzj33n4fY9ISSu8nFVgF3uICqLtKj0Xq3ReqvA1ZqgOCtYxBlFVVFUWp9lmwamobY0vbK+dPQrynobD1JUNWmhKYZ5qemHeVmRd3qtm5pweVkzWyc8n65YxZluiArti+DZFkfjHr86GvPlvX1+e3+f/WGgP7MfETfzttW2LXX3JylysqriJF5zEq85jSNO4hXHcUjV3VdsqProoOHzJCYqCtKqfKtYgJ8dwKqbhrM44g+T860e69Ph8NKt5IXXS9Ey8jKKdgL1uuvCOFRNTlxeIIWJ1Ya8vwST91xdR8B2TPbvDvn8r+9hmIo0zsmS1wOsTUXLlOPvp9CC7ZoYhsH+3SH7d4co4+PdJDVNs3XpqzuzCdNSPyqg9zYlpZ5g9Ye+Fry+BmBtNFjRKu0s0F/tImiYimBrcmHrwNTrR3xBYyG6TusbFtcrNu22a3aZU9dFQDq3q6HtTC2W84iyrMjTm/PUhBCYnR7N9bXboTJ/3ERCAKFpcyfosVP722ZHaNm4StPIXryjPdNij4C+5XSLd0vPdD4IwLpavA6vRwAAIABJREFUSkqEIRj4LkpKRqGnbdfzjiLYCZCbztRi+547ioQUYsuJ13orhWMauLamCPqdSYaS8o2xAC9Wi35Orouc8yQiKosP/vn8Uu+nNgBLCMmR+2t8Y9BZmevSms+SeNawPBYcn06osxlVqp8XUghcz+LgaMDB0YCd3R47u+EWYF2twBxy3/8tQ+tg6/x2eR6aImgIi6G1jy3fn4ZZoCdSlnTpmztYuBhZH1WOSS/Oyb8/Jc8zHvz2kM/vHmzz0CQSIRRKKEyh6WiiNmkLg3TV8uTPE558syDPq23zyzAUtm3w29/d46/++h79W64lrgoQlsCSDgNrj9j/avvkclSAr/p4Rg9PvZkd4qoe+85DQnNIWsddwPPmaz59c5fAGGAI+43yBkcF3PF+jW/0t7lTm9RAS9js2HcxhPWDpwr6d6J1bANzD1t6jJsjiialbDe0zWrLJNIrlrykCHa/k01otqP8S4rmlXORQuEb/W3Y8Y59l6JJadFGJTv2Hf3Z/8DpqRIKS7r0zB0eel8xMHepOuA5WcX8/vg5x98953kacNgUmHXMKPCwbjBF+KGlhEFgDFDCxFUhe859iibbfl3HDZg0uUdp+GTCZNFlS9mWQejZCAFRpo2RDCWwTYVlGFuAVdeaoi4bfc+3aOAYpTnrVDvgZnmFUgLftvBsC1oYhx6e3a07L6zpVV2zTnOm64Q41wwpQ+pG4Sj0+NXRDv/xy/vsDwOGoYtlKNQNZhkfolq0liqrS86TmNN4zZPVku8WMyZpzKPFHENIBluGjAZjTdtyFkdM0hgl5Fs3JH9+AKttuEgS/nU64Sjo8eV4l89HY805vUGH0VKRNU/J6jkNWde5cGjakqSeYtUhvvH6cN6PuTYbNtsx2TsaUpU1aZxz8mTKcvpmy3bQk4t4nVHkJZZjopQCAb2hj2kZ1/Om+HAahBfPfUtZ6zatVVlRFjV1pbUuWmxqYZrGe2FACSFwPE0R9ELnlQDrqotgvEpZL+JtiO9NpTVYrqZ4+vZLxicaXOnsmU03RQiFaNUV8fDL7jxaIyUINgBLCWhe/ly1WQckUc5qFlMWFXl6MzgXQmu7/NDB8+1r3e/b1tVzDDeTrFuWZ5jbwOGfqnRIskBJGBguA//9GuS8qq5a72rxP9u/07pimWecpzFFXdO3bOq2oWxq8rpG8Op4CNV18a8ah7x4z29/dmfK8SoGweX3d/RIcXnU1z1Hrl6jDfp+b2gvqSZXzUG2Kg/YgIhNs62FrT73aujlpsMrN4Ykbzifa++5+7tpN5/ADe+XS73d5thXj/7j9V9SGzHgEhgDDt1Pr309jjKiNuNxOuH594/50z89ZbVMWa9Smka7i4V9ly9+c0RV1RhK0eu7eP7L92BgDAiMwY86z3dZortmbOViKxdfjBAMoFxzMfEovhHkScH43l/x172vtg22mz7iNC2Is4zVas7jbxb8t//vG9brlCLXYMA0DVzXwrZNPv3VHv3Bmw0vhBA4ysdRPgNr763fr2eEeMa7oem7KsB1Aw7dz97J8Talp14SpQxs5dJn96XXtG1L3TmmCiFQXcbcpm5zDyhhaGBq9BjZh+/s/JUwtucemiPu85vt1x4VM/559c+cfCs4ET7HbkFgpbiWRd9/Nz/bNwb4xoAd+84rXxdnBQuZMq0TlnFGkhekuUVWVEihKXtpXhJ4No5l4tk64N5QkqyoaIpy+4yjs3SP85I4L0mykrKusU0b3zE7J0LFOPRwLROlXraNKuuGdZozWyckmWaN2YY2yRiFLp8djvnbX9/FMY13piP/sdW2LUVTk5Ql50nEN/Mp3y1nHEcrZlnCk7WibOptWLMOvtY27nldkZblrYOJX1c/O4AFAkspPNMisCz6ts7JUkK+RCcCaJGouoeSu7SUXaejoWxSyibVKeN/Abxrw1T0R/ruP38+5+DuaEtTS+Pb2ZpmacHp05k2wMgKolXK/p0ho70e/ZGPYRqY1ofthLeN3rjlSUGaFNup0HqZsF4kRMsEx7MZ7YYMO4MOx/3hHbnblOgmWL2hjx84rwQWmwlWvD3XTYjvywBLCIFpGnihQ3/k4/jWDRMsvV2r24yyiajbnLataKkxpI8hfJR0UMJCcEkFlFKAUliWsc3xKrKSPCtutJfP0oLZxRonym8MJd5+BtdA5s/wEfIXUnldM89T5nnKMs9Y5ClxWZJVJYsi439cnLDMte172dQI4P9+9oiTeP3axe9BOOA3o13uBP1X3kUtsCwyVnnGWRLxLFoxzZJXHlMJwRfDXb4Y7tC3nWtA61VVd/ldJ/Gaf11MOUvWPOwNedAbklcVs+59r4ucqMzxDIvAtNhxfe4GPcauxyxLmWYJ0zRhksXEZYkpJaZUHPohR37I0HFxlHmjZe/VSquKpCpYFjnTNGaaJSRVSVpVVE2zzZGxpG729SyHge0wtF1GjsfQcd/DU+l6LRYJz5/MePp4wnqVYpiKh5/t0eu5mKZunDmOyf7hgP3DAYORh/WeJv4fpIR+JomrEQCvKcPQRkXjnZC/+t09fN9mPotZzGOW84TlIiG9JfPjl3p9lXXNo7M5j85mDH2Xh/tDdvvBB1Dg/GWUoSS+o/cyppL0fIfQtRkG7hY4DXwX21RbXbChFNAyXSekZblt/kjJlpa+PwhwTYOmpZt8qY7+LrTW1zRu/B01jaYZZoUGZ20LjmWy0/M5GPa2tugfg7xWCIGtFJgW+15I3bRYUrsNJ2XJvhfwoDeg1zV3u779tSywvuVwN+y/lUPxz+7JqhcwiW+ahLZN37bp2c4rO5Bt22DIEKPRUwCJoqEmree0VYsU5jvljv9UpQxFbxTg91zOns/Zv3dBtExpmuWtAVaeFpw9nTG/WBMvExaTNQ+/OOTT39zBsk1cDwzz5dHxe6tW39RN3ZCscxbTNZPTJafPZpw9m3F+vODieM7O4YDPf3ePT38DjmvS7tzsDvO2JcUlRfBNE6w8K4gjbRwRLZMbTS424XumpV0E+6MAwzJeaWRQNRl5PaOoF1RtQt1mOGoXR+1gMUBIiRTWteMrJTAtA8+36Q081suEsqhutJfPkoL5xRrTMkii7KWvb47puFqH5r/mM/il3n8VdcV5EvFoNefJesHj9YJJEnfAJ2dZZCyLXIeClgWrIuckifi7s2evPe7/evSAnuVw5Pf0VPiG12gTjYxn0Yp/nJzy92fP+GYxfeUxTan4Pz75kl3XxzctxAvd7JuqahqyuubxesH/9fRb/ml6xn+68xAltGbvu6V+36fJmpM4Ytf12XN9vhzuYkhBaNmcJWv+vJjxzWLCv84nXKQxrmHimiZ/s3PI3+4d6SmWLd4IsLK6ZJalPIuWfD2f8OfFlFmWMMtT8rqibvXiHJga6N0N+twPBzzsD0EIBl1H9H0+PZeLhMePLnj+dMZ6lWKaioef7vLbr+7idaHNUgocR+f5uZ71wZtm77KuTSLfjK9QSuG6Uj9zA4fPfr3P2emSk+dznj6e8t03pzx7MvsQp/4XX2XV8O3JlP/nn7/j4f6QwLXY6fmvfKb8UtfLVArlCFzLpOfbHNba3MnoNFZ9z6Gq660r7WYaX1Q1WVExWydshNQb23THNHAHIQeDcDtluvoc1jlYN++Hm7alrGqyvKKqa2hbHMtk3PfZH4UdwPqA+8PXlAAspTC78/FME9cwSaqS8zTmwA+43xtcM9ESQueEuaZJYNr6OW5Zb2XI9NEDrHWesy7yreNHVpXMs4yybojynOfrlRaNd38uKVNdiQZDpRiqRIqGhoqms3Td8navmCR8DBfHjykpBZZtgG2we9jnky+OqEvNtk7WGfVGbP8axmBTa+v2PCs4e66oqoYyr8mSgsV0TW/oa8ME18KyDUxr80fpzb0UN5tMbM0o9DSqbTpaWtNQVw11pWl+VVVr7nBRUxYVRVHpiUtaslrErOYx84s109Mlk7Mls/M184sVCMHR/TFFXmp7+vf0GV+d3rwOXFRlTbzSAEXrrwoNal4I7DVMrRdzfRvHs7AcE3njA2rz2ZXUTUrdZrRtg0DRUlO3KXXrYLTX6Sybjq5hKtxAT8iqSoce36QHy5KC6dkKw5SvBVj2Zor3C8D6SWtDU6s7K/i2bbWJgZDbha7ZiHi7hdSQ8o2W9q9KuL9aAk0TMjvTkcCy6Vn2lioYlQVRmW+nO0IIpllC0dQvRWq8/v01JFXJWRrzaDXnwA/ZcX2yquQkXjPNEuZZyqrIqJqaVZ7R0hJaFk3b8u1yxnfLGc+jFasiJ6lKorKgThp8Qy+6TQuf9QV923npHOqmIe2mVI/Xcw1mVwueRkueRyuyuiKvNxMsfdbrIietSqqmIeqAbVrp140cl7HjbV0v3/Vqk6cli3nMep0ihKDXd9nZDTm8MyQIna05kFQCKSWGIV+Ze/PRltAOqX5gs7vf59NfFRR5xXgn7NaeV3+rlAJkFxBrm/QH3jaqYjGPseyfXo2ddRSuuqqxOxe2utE23QIdei6lIC8q8qLCNCSuY2EairKqKcuaqtZREXWXY9i2Lb5nE7jWD6Z0/9DSutOGrCyZrnVmkmuZJPnPV4rxU5SmaSuUbLEMdc12QgjBqy5VpSQ9z2Hc87XBRd1stVt2RyG8Gvex2fu+ePyXqnu2N82Gjg6mIfFsk9C19ORL/LTUwE1pQxa9/3ENvSZWTcO9sM8yz3jQG3In6F175suO0u0aBoFp4RjmW7vdfvQAa5omfL+Ysy702L6oa56tV0RFoSkkbcvj5RLfMnVnFK5ZQUrRMvYzdvwMQ1Vax9LlZVyqCDb0jp/+wngXNdrrdWYXkiwtmJ4tyZOCJi1uJdprW63LquuGJMo4ez5n8E/PGB/02Tno0x8HGmwNPYKeS9BzMSwD01QYpkIZCmVcfpZN29DUOpG8rpptTlSRa61PlhRkaUGWaGOOaLUxh0hYL/XfeVp2mVIFady9NtXHaOrX5zW9q9oArDdNsMqi0rqrJKfMq25i1Lz02Zu2zpEK+lojpZS8QTiwuUZrWiqatuyE7iFS2ghk1zAoaHmFS6GSeIHDYCckjXMWr+hQZUnO7HyJEILsVSYX8uoUr6Md/VI/SaluMejbDmVTY0idDVbUNesi5+v5Besip0Vr14aOy/2wz71g8NpN6BfDXQaO85Ju6GoJIQhNi8YLqNsWRxl82htSNA1lXfMsWvL9as55GhOXBWXzas3Xbatqao6jFf9wcYwhFU3TYAhJz9LnGpcFkyyhXbSYUjHNEk6TiJN4TdO2jF2PnmVzmkScJRFP1kuaVk/KepbN/d7LeqOyaZhlKedJxD9OT/kfFyc8j1aUTU3dtgSmxZ7rY0qFFFwBlx2VMEs5jtdcpDEn8Yqvxge4Y/O9xQpUVU2aFtRVQxA49IceYc/FcU0dpbB5BonLPLYfaqLyU5eUAte1dLfdNBjvhNRNw85u+JJ+9edYcVpwerEiSQvGQ5/xwCcvKtKs1BtGW2tm5suE2TIm8Gz2d3qEvk2SFqzjjDgtSNKCrKgoy5qmabh7MMA6GL5/gNW0XcBtuTViSIuC+h08A/4t123vUiUFg8DFMhV1B64NKXFtE8tQV7KofujxxZX9tS4pBJahDTaMj/TeUx1dsG/Z3A817f3ADznww2tBwhstruoo5DeZ5v3Q+ugB1rooOInWTFNtoVk3Das8BwFJWfJ8tWKaJPRsm55tv0QVNGSLkCWBU2BR0rQVLQ1KmKjO3lPXVfnzz7t6Qx/Hs2lpmZwsOXs2YzmNtPlCUb02gHhTWaKBz2ISIeUEyzbZuzNk72jA+KDPaL/HaLdHfxwwGAdYtoFlm5iWwrAMjCt2pk3d6glaN62qyuYKWMpJ1hnxOt2abazmMYtpxGIasZzFLKdRN/G6+bzb5vV5Te+qhBBYjqVHzr6tDUCk2HaFN1VXTadhej0107K1jXowcLEd61r+1VV79qYtqducps1p0LahUpiYwqfpgNfrShkKL7AZ7IQsptErLb+1A9nrjyU3Rh9DT0+w3jG9qG1bPTGoqytjfqWnMh9Jd+xd1CYwuewmOk3booSeLtm33HwrKfEMi6HtYEpJaDkUjc4vWxeaIvjtckYLuIbJ2PH4rD/mdzv7r20mHfoh/Q60vKoE4JqmnohJbZu/LgqKuiKva/ypRVqVJJXm678bgNVqndcCdhyPsesxclxCy2an8Xm0mnGexKSVbg5Ms4S8O5+x43IU9FBCUjQ1Z0m01VA5hsGXo92XTXWAoqk4TyO+WUz4w/Scf5ycMs9Txo7Hjuuz7wUc+iGeoZ236qbhIo07QLXmPEs4TyOiMmeSxniGxf2wj2/qCAL1FvT0sqi2DngbrepiHrNepaRpgefbGIairhriKN/qLqUS2LaJZRvbjVa76Uw3LVVZU1V1998Nl0km7ZadoMGNbqjJzgSpbdpt9IdmKrTb6UnbXuppLUthmgYtetpf1zVtZ76zmeobhrwmlG/blqpq9DOqi5Vo2xbLNtjdC3UIvGN+EP1H002FqqrZMi1sx8SxzW2syU33TlM3lGVNWVbb5WIDEq82qrKsZDKPWK5Smo7SWVUNRVlpC/ru2Mso5WyyJu9V9HsunmuRpAWzRUKcFqS5BllxWpAXFb5nc7Db2/6cq9d71TRUXTj6xoHu8jWXgbPGNmZCYRrXJ90bm++s0JlKk1XMbK1zAVeJNke4WMbXwmtBU+FcSzvgbaqs6i5HsOkMGOQ2JuMmCn1Raavxsm70mmEofX9Jee2aKKuaom6o67oz4Gi3X99kR+kA3eba97UdUyAvtSV6Xlaacmdd2qLf9HtvWw02i6q+jJIRXbh853b5pvqha56SOq8xdG9nHnXr44tNjqOgaTbB0ZexIx9rtqGSEoV2IN7xfKQQDB2XsePi3GCYVbfd/d108QJ/yRRBxzA67nr3oKXFsyx2PI+2bbf0QEcpbMN4aeNgyJbQrnCUjaWabhJAZ+EqMaWDFJvv+zgvkB9aUkpMy2C4E/Cr391BKsF3fzzm2z8cs5prl7i6uv2GRy9uNat5TF03rBYJZ89muL6D41nbHCRl6HwkqfSfzSrSdgv1ZsFu6m4RL2uqoqIo9CSq7CyGs87QYgPy9CL/YfJ7XldC6AUR28Tu9AuOa1EW1Sst2F9XtmvSH/r0Bj7WjUG9LU1bUdRLimZOWa/19LWtyOsZebPEUWNsNcKUPeQrMlaUIfEDh+FOwPkzG/kWWR5CdhTBLU3y3T5Cqrbh68WEf5qeYkrFvbDPoddjYGvDAPUXco8Wdc1xsuIkXhFX2pjCNy0+7Y34pDe61TH09MbWC0ZTU9Q1VdvQtA3zLOOPMx1l0QK2UvQsm0M/5NeDndd+iqFlX+vsvaqUkKDAtzRYCEx7Gyo8yWL6KwdHGe+MgrZ5Qkuh4zl+Nz7g0A/15rBtsE8UsyxlniVMs4S6bfm0P+LT/ogDL2DseNvck7yuWRUZ66Jgmessxbpttzz8pm2pWt3M+24557+dPeMsibCUwaf9Eb8d7fHlcJdeR420lEIgaNB6t7gsNSibnXMaR1RNw5P1kqdrTS80pGRgOW+VFTa5WPPo23POTpeaEVBUPH085enjKVmqmQCTixXnp0u+/uPxdhPvBzaf/mqfT3+9j+NaWJahjY3SgiTOuThfMblYE60zTRnPK+hAkmUbOI5Jb+Cxf9hn/6CvwYVjkWcly0XCaqkBXpoUFHlJ3oEiDY5K7twdc+feiKZpOD9bMp1EGngUFbt7Pe7eH7Oz38PtdGJVR3ubXqx5/N0Fz57OtkCO7noI+y6ff3nI518eXWNPvI/K84okzplNI54+nvL8yZRffXHIr784oD/0tdD/BnvqLCs5fj7n+NmlxqvX9zi6O2Rvv3/5wu5bi6rmfLpmuU4Z9X3GA4/AszE7lzZDyS31XuuVG+K0YLqMcWyTvXFIWdWcXayYLmKkuHLwF2oRpZzOIy5WEYs4YxGl+l5uGiT6Z1mmwdB3GQQue32f/WFIz7W39OQnFwu+PZ1yvoyJs5x5lPGvzyfkZcXz2Yr/918e8e3plA1g29TBIOSrBwd8cefSifB0EfHHp2dMVjGHox5Hox4D32XgOzjWy8+ms3nEvzw942y+5u7OgLs7fQa+S7+jxbXoz+dkseZ4qkPhF0lGnBVbHdIocNnt+0RZwSrJUEJupxhlXbNMMoqq5tHZjO/P5hwMQ35zb487Y924uQn4VU3D8WzF08mCrGsMuLbJvZ0B93b6b7V5/9ClhMAyDVzLBMotNb2qG8qq/ugnlE3bktcV6zLHMy3qV+wps6ramkP1bJu+9TJ1/Lb1swBYfce5tkiPr1gCi+6h8SqTCyWgZ9W4qsZUXBlY6e83hNOlg/98LvQ3lVQCqRSDccivv7rLeE8/vKdnK/K01LlRPwhg6U7jah6zXiZaJ7QRSMrN5949NIW43qG6Yqe8+czb7qBt1xVttxqt7u9t17PddjY/llKGDn21HQvH09qptm1/HMByzI5q6Wv6zg3VtCVlsyKpTmjbCmhpKDs3wRRThlhqgCn7r5xKGIbC63K2vMC5dWjtTSUEl06K70GDVTcNXy8u+D8f/wnXMPkPe3dpxi1SoB90fyG3adHUHMfaIGKaJSyLlF3Xx1Xm7QGWlIS2TWBZbIaoTdtQty0TK2bkuCghtwArNG0OvZBf9Uev7TZqG/o3XyNKCJ0xJBW+YW7t0mnhWbSkZzk475g6stkM7bkBf71zwJejXd2JbhtmWcK/TM+4SCMmWUJaVfz7vSP+l4N73A36hJZNXBV6AS2ybSbKqshI64qqbTCQ0FH9yrphVeZ8t5rxd2fPMKQitGw+7Y/4nw/u878dPdAh0EJuDRY2Nu4NsOtqV9e6aXkaLTmJVzyNljxdLwlMC0uqtwNY5yv+6feP+eM/PyeOM+I4J89K8qykblqkXOtgayVR6nIaNN4N+U//uWJnv4/oQqybWk+55rOI7/58xjdfn3B+umK1SPT0q5twBYFNr+9ydHfEb353Vz8LWrBMQ09eLtacPJ+znGtnvmidEUU5cZQTRxlxnPE3f/sJoCdAX//hOd99e64bamnBr788pGlabMfsTIVMqkq7sp6dLPkf//17fv/3jygKHdEBoJRg/2iAaSo++/wA9Z5dgYu8ZLVMePZ4yt//12/5/d99x3/+379id69HELoIU954BllW8uzxlH/8/ePt/uXo7hDXta4DLPS1VFY1qygjSQu+/GyfOwcDRgMfhDZSUkp29/wm+64lSXNmi5g7+wP2xiGi+7mLTpN3U7XAPEr59nTCN8cTnlwseTpZdJOXSlOsTIPAtbm3M+D+zoAv7+4RdFOSjR3744s5/+VPj/nudMoqyVmnOVlRkZU1z6dLJqsY44a156/u7xM4Np8f7W6B19lizX/9+gnfHE/464eH/PUnh9zbaXFt82aAtYz4r18/4V+enPG3n93Zgr7NZGxzjqfzNf/0+IRvT2Y8my6YLGN9f0jJw70hvz7awTIUyyTbGkew+V0kOfMo5e///Iz/8sfHfHV/n77nsN8PEIa40W2urlueT1f8/rtjlonWNQ99F0NK7ox6vMVS/MFLSj15cyyTqm7IRUXTtNsw4/oWzKifshpasrpiXRb06+qVcpm0KpmkCVldIYXQFPQf+TM/eoDlmyZ7nk/P7uwU25a4LEnKUi/spuaVvlhl3ZCWJUVT6ptECBpK6qag7jaqtKCkjd32fnY89NfV5kG6yVcSQvDwi0PyrOTpt+ecPJkyPVtRdjqo21bTtNC01K/J0Lk8CV5rqPFzrO0CJbR+yu85BH2Xum5uHep8tWzHpDfSWrabxdUtAokUNqYMO46wQUOJ0SypmgRThkhhdU2Cm2ujwRruhLiB/VYAS0qJ41mEAw/3NVb1P7Y2AYFRqfWCWWcgcFtjhJ9PXcncqMtLu+/29o2Pq0LeTTWt0Ja0SumsGgGi1S0odcXkQr6lc+rVzZrucb3AHNh2f9+dslXnDRn0LYeeZeObFp5hdtcGBKb+f64yKZsaU0oC02LcWaTbyqBB66b6HfgDoW3sax0OjdLhpmldMcuSjp6esCpyDryQO36Ph70h+15Az7Kv5Vy9WGPH427Q1zbxWUJZNyzzjNNkza7rMXLenLH0ugr7Lg8+2UUqSdbFL5yfrjg7XVDkFY6rJ+y9nkPYc1Hdvdrru9y9P8bzLExTi92bRtP8pNTmD0Hgwj6Mx0G3cdLrpaa4aZ3XybM5bdvy8JNdbMfUm9i6Ic9LZrOY42czTMug13cJey6TixVlVbOYx3z9h+MtxfrwzrADZAl11TC5WOOHDlIKen1PayJMg/7Q4+Fne9R10wG3jNUiYbFISDojoQ9RhqHwPBvX1zqwsqyJ1pk+7w6AGsHlc3HTPCzyivk85tnTKcORz2gcEoYu1os06w4wKSkIPFtPrQyDKM5QUmCZmloWJwXrOEcKwTrSXyurBikERVmxXKW0tKRZqamaL7yPpmmJ8oI4K3g2XfL4fMFsnRK4Fr+9t781pdos5DonyddmCZam4G2ufSlgtxfwxZ1dAsdiEWfM1gkn8zXHsxWjwOX+7kC7CMK1Z9b9nSF7g+vOv1XdkOYlcVaQlSVlVb+WybJ5fdSBurLb8LetDthdRCnzOOXx+ZynF0uSvGAn9NnrB5gdpdCxjA5IZazTnKIzBmvp1tBujTaVom4aoqxgsoo5X0Z6WuZfTjo2WXlV07CMU55NljRNy07fZ+C7ONaHobO+yzKUoufZjHuaPZbkBUVVs4oz5lFKWpQf9RpdNTXLPOc4WhOaNgf+zW7TSVlyGq9ZlwW+YXLohzeH6t2ifgYAy9KC5m7jUTUNZ3FMUpbYhmLsefTtl7uAcVFykcQU+SYLoKVqc/J6Rdlc5rWY0qVR4w/zZj5wSSW1M53SACsceAx3eximoirrzrK7fj8Too/3PnsnZVnaoCIceD8KXAE8J48tAAAgAElEQVRbN77ewMNyXrwVu0eVkJjSB3aRwkQJm5aaollRNRG2GiJ5PZ1LGVJrsHa7IOMfCbCE0NeU7VqEAx8vsH9xEfylPlhJcWnWEVo2ZjcZkx0N0lIKz9BmR2VT43b/9i1rS1WUCGxl4BsWljSQQmiji7Yhb2p9LClJKx1Q+SxaMM9TiromsCwe9AZ80hsydJw3ag580+LQD7lIY75fLWg7+uBZHHHohdwP385VbWe3x+/+ncFnnx9sKXP//A9P+cffPyZaZwxHPuOdgLsPxty7v4PjdhtEU9Ef+oTdBFo7lzaaBmYb9AceB0cDhBgQBA6ua20ZCyfHc549mbGcx5wczzk/W2Iaiv3DS4OQpm5ZLRNOns+5e1/TAYPQ4cljDUiTOOcP//yM4Sjg4We7PPx0j7PTBecnS6SSzKcRhiHp9Vzu3Gu145802T8Y4LoWn3y2x3SyZjqJ+P7bc/71T8cfRIO7Kds2kUoyGgWEPQfXsyiKisnFCj+wtxbwm9owM4qy0vT6kyX9vsfObsj+Qf+lkOfNFNhQil7o0At0ftp8qbVVGuAYrKKM5TqlbVsW6wSlBFVdY5mKvKg4m641pT/OqJum015f111pauCaJxcLnk4W5GXFl3f2+Pzubuc2JzV4KTTIMZTC6FzqzA6wbzR493cH9DybeZQy6477939+xnQVczTq8Z/+6hP+6v5BN+29vHd8R9u3vy/AkRcVp4s1j85mPDqbcTxb4dkmvzra4cHuUGdBmQYXy4jn0yWzKGWd5KR5l/fUtJhK0fMcLEMx8B18R1PMph2IVFLnVF1V9LcdfW6V5pzO1zrDyne5t9On771e4/oxlmnoz2B3EJAWJdO1JC8r5nHKZBVrl8iPeN9XNQ2LPOXZesme679SFxyXBSfxmnmWceiFb/WWPnqAZRsG9pV8kqKuuEg0wHIM44pG63o1XSrzKs9xzUoHbYqcqsmompzNlVC35RVHQd5hv/WnL22brrVRO4d9ekMPIQV5VtC22gBjYi7JOq58VdUf9Q1yU2maouxoMDfzoN9HbRwAe32P1Sz+UcfQFEGP8DUUQV0SPatQCGFAK5AYlxlub3jL0pC4vk1TN7iBjWmqrSj9tiWlQBlK6y1cC9e/tJV/n/WXczf+Um9bogNHoWnjdqYSm02KQFMmbWXgGiZGo+3jHaX/mJ01vRCb13UZKQjt0dno9aKWenyQVSXTLOEsiVgXOXXbdKL4Ri/A0fqNlJhplrDIM52R1S3maV2xyHU+WX5DFt0PqSB0CMLr+oDVMuXJ9xOkgNE4YP9wwCef7vHr3xzh+6+mI0qp8/hc12I4ClBKYtkmw5EGYqKL4HA9a2s2cXG+ZD6NePjpHmVZ6w13BybKoiaJC5Sh2N3vsbPXoyx15Mfx8xmTizWGqQhChwef7m4bNeuVpjrKSUSS5JploiRKgdl36fVdDo4GnJ0sCcMl0Trj6eMJyQcMBzY6c48gdOgPfIajgLbVlE0/sBkMr08m67qmyGuSKCeONVVSGYrxTsh4N8T1rGuvNw2J51nUTcN44DMa+MSdO2BV6euwaTVQDlwb1za3E2nHNhl0EwbQbTrHMpDSxXnhed20LUleMosSZuuEeZSipGQQOHxxZxfHNHAsg6puiLOCpCipaq3L6nuO1h1u7j8Bo9BjFHpEWc50neDbJt+fzVBKMvBdfnW4w7/79Oi1U9/3UXlZcb6I+PPxhMkqoW4aeq7Nw70hXz04wDJ0SO+jsxlpXnK+iEEIis7sQ08TJY5p4DsWA99lHHoYUjKPU05mK/qeo5F0956apiUvK+IsJ0o1XTJ0bQaBy+GwR+ja1/aaTVvQtCltkyKEjRA2HfGTtjNmY8scEt1ewNJ/kICkpaBpUpo2275KCFMfD6n9B9oKTZZrEOjrQorbaYxsUzHqeRyNeyzjDEOtthOs6SpmEaWs0xyvc7n8KeMfNtNXrbuqyeuKszjiNNausidJxFkcXdnvdp7iLZzG+mvroiCp3m4q99EDrBdLB1zmHK9XtG3L3bB34+uyquIsifhuMUPIhsCpcYwGKUwsKbX7Wlv/xemvXlWGoRAO7N0ZAjDe7/Psu3OefXuuA3tPFkTLdKt/+jmUlAKpdGik7ZjYroVhfhgbBNMy8LsJ1o/NTtlqsF57jIaqicnqCQKBFAZNW+oJVhsDEkv24RUGF6BpfRsA5/o2lmtimko7hdW3+10rQ+H6FkHfxfF0lor8SFLbf6l/G7Wx0LWUujGrS6IdrjaaL0vepP/S25GtgH0rFW1p2marIyubmlWRM89T0qrUC2+y5r+fH/N4vSAwLXzT4nWVlCVxVTBNE57HK0BrDPO6oqiry4yyj6A21EAp5RY8GIbcmmBsdLX9gcfRnSFZWjKfRaxWKVlW0tQtbbeb0OHpOtw8CDU9cTDwGI0D1quUOMqYz2Jcz6LX8xiOApI4J4lzqrLZmmtU5fvLNHwXZVoGo7HPvQc7CAHTyRrPt7lz97qGMs8qlouE+SymyCtMU2d4DUc+/Rue/b5nc2evTz7wcV0L1zZxHZPQt7v8I+2y+OBoRD/Udty9wMG1TQLPJu/X201h0+gpStM0DHse1lXGQas1mxo06XVfiM6mWklMQ3YOfnqz7NrmduNqm8b1Y33EVVQVk1XM9+dzHNPgzrjHw70RB4OQge9qlzkl2B8EetIHzKOEPx9PXmo4byzQ7+8OiLKCZZzxfLriaNy/9tKiqlnGKeeLiCQvUVLgOxajQIMz175OEWyamLx6RFE9w1R7mGpPP5OaiLqNaducps00KBMSKXxMtYshdzpAZlE1C4ryEUV9sjVtM+QIQ+0hhUPdRjRNRNPmtG2GkgMs4z6WcXirz9GxTPYHAfHBiPNFhKkkSVESpQXTVcLJbMWT8zm7/YBR6OHaPyHAgi2wukhjzuKIJ+tFp7tNeLSYYQrJ0HG2r98AspN4zSRNUEK89TP6owdYL27260YDrJNojaUUWVXdCAiyquI8jnm0mBHaLfthi6ksbWohHeq2oBYlQmy6MNqO9Kd4Tx+iNg5/e0dDdg/7PPj8gPF+Dz/QNJEkykjjnLpqaG+56f5Jq6OrGYbCtDS4sh1T6ww+wK7f3FIE3zR9enVZjklv4GuQ9tIxut5621C1MXk96XKuBE2bU9RLqjbBkgMa4w027UqiOvDpeja2Y2KYSrs63rKLrropWDjwcDxLu0V+oA7V1d/mbe6dq53Rd3Gv3WS9+6Hqh77fv+gSWkdmStWFyosXv4zqwo+lEFhK2/tffd2mc646ypt+8l+a6mx2SUXdsC5y5nlGWlW0tJx1+Vk/+vTRFsB5XVHWH5cofBNUvwnwfVX1B95WA/Xt1yeslyl5WlwLURcCLKtryHQAq98BrKvgyvNswr7LcORrgJXkrFepdjTMOkbFR1ymqRiOAu49GHN2uuTsZIHjWiRJce2+3YQYz6YRRVHp5lzgMBgF9Af+S8fd6K7eVP3Q5cErvrbRAMHlNX9TNY02YtjY8V9ab+tGxcYe3bGubxV/Ts+cvKqZrBK+P5vz+Z0d7oz7fLI/Yn8YMgwu2U9yIAhcDWK/OZ6wIVRenWBIIRn4Dvd3hzydLDierijKmi+SbEsFBW2KsUgyzhYRSV6gpMS3LYaBx7j38u+8aSPy8luS4h9wzF+zyWet6guqZkbdRDTtmg2bxVBj2rZEmg6SFiEUdTMnLf9EVvwBhAQEtvEAhxIlQspmQllf0LQRdbPGMo5QMgRuC7AM9oeaMvft8QTTVNRpTlTmTFeS09maJ+cLpJAErvXSNQMf7rpp25ai0Vruk2jNH2cXfLeYcRKvmKQxhhCknXPv5vVVqyeWWVWRVCUj29UaxLd4TH/0AKvsBMhRUTDPUi6SmG9mUz3eQ1sKL7J0+3rtw9BynkScRmuqukUKB1e5OEqP0lta6rqkacrO9vrDgSuAdZSxWmc6E8RUGIbS4uGq6hZ/iWFILMvAMo3t67O83FJN+qFLL3T0YpSXtG1L4DkEvr2lymV5xWKVsI4yBj2PQd/teNN6Md09HEALQd9j/+6IyelSZ09Noy7oN9VBvlv+9oevTefUdixtjR7YBD1XT4/6HmHf4+jhDg8+32e018ML7A8yVbEsg6CvJ1i2a97a1EMIgWFpionraxdCyzZvMJ7Qj3UhJIbwcdQOIJDCpKHEknqCZashUtzyNhYC29WgLui7rJfprd0PDUPhBU6XsWZ9EHBVtQ1pVXKRxiyKjD/Ozym7CUDbas2Nowz2vYADL6Rn2djKuJYjVTQ1aVWyLnMmqTYbyOqSrDOU2Nz5m+/bcTz23ICh7Xb/7+UubQudKUXBLEuZZAmLPCWvK7L6EuwaXa6VowzuBH3uBn18Q1ua37aKpiYpS5ZFxnG84nm8Ymg7HPo9xo5HYFoE5o93ovu5lZ7iXoZCvvp1vDJQ8zbVdCYkOqese+ZaDiPHxTPNbS7bDzp3Idi7kp31pgnYh6y21c50VVWznCcsFjFxlG9t2jdrQJoUxHHO2emS8/PVtuurwWk3/xMds8BQKLWhcW5cZ+XW8ns7BafTd3ZguG00IepjZ1KYlsFwHHDvwY7OHktylouEaJ2SJoXO9DIVaVowvVgzn0WYluLu/RGjkf+yucU7rjddnUoJhoHD/d0+qzTjYhmzSjO+fn5BnBdbS/aB7zIMXHqeg2NqV76fC766ml+VFFrz6NmWprG9sOYaHQ3QtbRxmpKXRj2bUlIw9PUEa53mPD6fk+QlyyQjznJsSx83r6rO5GMFAo5GPfYHwdYo4+XSk6mNFIDOk1AIo6MDim5/0XRUtrq7r0wQ+vVs20UNogNidMdCXJUYvNycuk0ZUht9jAKXB3tDfvfwkCfnc84XEXlZ8eRigZKCeUcVPByF9H2Xnmdfc2T8ECWE0C6tpsW+F1A1DZaUKClIq4p9P+BBb0B4xcV14/4K+pPs2w73wv5bnffHD7DqWguDk4hH8zmPFnMeLxecRRF5pTczJ9F6+/q6y0SJi4JpmlI2DRIXV41wDdVNBHKESLT+qv3wXbJVlPHsdE5VNYS+jWObXSBgjpQSy1Q4tkkYOIS+w/lkzdPjOYtVQtl19e4dDbl/NKSsGharhLpuOdjrYVkKCwMhJFlecnq+5PhsycN7YwLP0qF4QmDZJruHA/ojn4N7I1aLIyanS559e86z7y44ezbbhvtWZfuTdVs3i7LjW/RHAeP9Hnt3huzfGerg4ztD+kMfv+fi+tp04UN0STYarM306bamiUIKLMvA8W1c38Z2TUzbeM05SwzpdxtGCyUdmramlCuqNsJSA/3QvGVtjDWCvkeelqRvCEPelDI3AMvD6UTv77uqpiGpSiZZzEWaMMm0pfaq0LbRYZdB9D/tHPI3O0dAj4ElrgGsvK624OTr+YQ/LS5Y5CnLIiOrq44WI+iZOu/i88EOX40PtvasNwKsVpsVTLOY75Yz/rS44PvVnGWRscgztPujwFIGoWkxsB3+48F9AtPClAr7NY6PL1Ze18zzlKfRkr87f8bfnT3lk/6If797xBeDXfCCf1sA6xbgSr9ObDf2P6Z3tsnBKutmm5cysB0+6Q3ZdX0spbBuuDbeVAPbZWA7HyHA0lmHWVpwerLg8aMLLs5WzGcR61WqtT/1Jiy+IU1y5rN4G/J+tdEr0BMxw7wKsC6f5YahgYfZAazN1zava9oW8YHC49+m9ATLxzQV33+nreaXi4T1KiNJClzXxDAkWVoymaxZzGIsy+De/THDcYB1Q4f/Q5bWW7nYpsEsSnk2XbJIUv70/IJ/eHTMwbDHwTDk/u6Ah/tD7u0MtPbK+HnIKtoO8NdNS1FVJHkBCHzbwrMtjBfuX6UkthC4ltEBLPGSplt2FEEpJc+n2hVzHqWskowoK/SUXZoUZb01wBBCcDgK2RsEuK/5nYsOCCEUQihaTYrW/6/dgMGGjtCGblp0AIxN7uhVI5Mr2u0tyDI6kvQPrw1NVAjB/b0hcaYnc1lRcTrX9MDpKma1secvSu7vDfFsEwOJUB/O4UA3TbXOFj/ANUxcwyCttIfDvhdyvzdgaDvb79isLa5h6salZRF2OZM/tt75HW5aBvv3Rvz2P3xCFr9586ZMxWg3ZLTXY+dwgPOC4FNbgOqskU3S9qW4WVyxEtW1+ZdjmOz7+ibZ94f45gBHSZq2RrX6vAQSSwYo8XJA8bVzkHqCEvRdDu+P+Px39xiMbrZ4fLHufLrL4YMxg3GA4+r3luUli2VKXuhwSNfRACtJdeidYSj8zkI3DNxuYdLnV1V6kVutMyaduUKWaafEKM6ZmTGObeHYBklSEMU5UZTpLmS3mQTdvXK7Tb7r2/RGmqrmuCZ+6DDsfifrRUwa64ySqqgoNwHBZU1d1TpTqwNi1/KrriyOouskb5yo9L/llYwWiTQkSmlDDsPQEx7DUli2iWVrM4je0Kc/8hnsBAzHAYOdkN4VytqG6gN0IcW5zsLwbWzXugw37s69ruou/LjVxg2BfWs9lWUbhAOP/btDPv3NEWlc/P/svdlzLEea5fdzD489Ijfsd+MlWdXF7qqZ6THJJJMe9IfrQSaT2TxIJptp9XRX10YWeXlXAAnkEnuEu+vBIxMA78qtyKqZrwrkJW4ikBmrn++c7xw+ZEUgPWdzHsYB9z8+Is3jt9imO8gmkHgiAGkwdqA3WydvNRXatlg5sNd2vKeEgPlhxuPPzggjn+vLLdtV9f4fBPJZwvGDOWePDpgf5XjfI6z4Q6vRA5d1hUTsmSFfesTK2XC3emDZaJ5sV4SeotMDn0wWdxauZuxg9sbQmhuGKfS8fQivHV3krtqKp+WGWPlYC48nM2fFfWtbgzE0euBZseaP60ueFhtellvKocNiSZS/v1Hv7lMu/HdnovP22jtQWeuYe6O5qAs+X1/x+XrJy2pLb4wzdBjvh3/JruDPpUbY9NadebvZ8V33zu7nbu/ePAi5n035aDIb3Qq/vTQ4UQGJ77OIEpLv8PM/VrVjhtXl+YZnT6948eyaomhcJlUcEIz39t390xiLp5p9vuFteSWwf2bt5jTvfI128PJWNhfcOlbWusXlzxxheZ4kSUI8JcmyyD3fraUsGpYXW+YHKUGoqOuOq8uC1XXJydmM07OZA2aB96MxQR/SZJRCEPk+vudxusj5xdkBUgjOVwXnGxeOvSprZ/s+aFZFw+k853Sek8chSegT/sBB89+9bkwNbkv6dm5+2rhZM2B0R/Ren+EUAumJ/RrTsat3WXAhBFHgDHamSUgSBWyqhqrtebUqMNY6Bqsf9k6K9w4mewbrm7NXd0vc+br5n7z1ihApE6RMMbah18/c90SINtcIPDw5Yw+0dhfdvi21v3t+6xJiVGUoj0We8PBoxqZqudyUFE1L22vOVwWR79xZm65nVdRcrkuiwBmm7Mwv9hJt8eOALjnOvKWRm5X1pURbw8PcGQ89mky5n02YhTcGH0I43i9WPlkQECv/ez9ff/CrI04CPvvHj5jM0w+SH0kpiJKAKAmYHeTks7sOPL6UpL7PUZIgBCS+G7Tcti3zKObBZMrJG/zslZSEShErxUkakwcRgRTjMLMmlDlaHeHLBO8dBgHgFsXpxM0qecrj+P6Cqmg+aH/k04TpgQMv6ej4NAyGpu2pqhatXU5F17u0eycLExhjOJinRKFiMXcWpnkast7WFKUDDpdXBWGoiCMHxpqm5+mLFVkaMski2k6PgYS7TuGbTxbP8wgjmC5SlJIsjiY83jaU25rtqmJ9VbK5rijW7qvcNlRFS121dGOw5Q586cFg9N28Cum5h+nO7c8ZUyj8QI3mFM6Zbgc8kiwkzXcywJhs6kBUFLvcEWPc0G7X9Jw/uyZKAtI8IskjF6SrYrarivOnS6yF4wcLjuKApuooN/U4b9bQVC47Zeg0h2czzh4ffjjAinymi3Q0fwj5+FdnH8xgKeWN83Az8tnrDpj71yJBjCI2K+j0FdXwgt5s2JHZUigCb8GH9NKFEJw8WOD7ik8+O6Opuw/OQQtCRZJHZHnM9CDD/ws8WKu+51m5oTUDH+UzPpsfEXgKTwiqvud5teFFtWXdNfzni2eUfUcWhJym+f5x4mZyPFIVcBxnNMNAonxi5TsXOSHojeFZseZpuaYaOn6/umTTtUTK41E+Y3fdaGtodM+qbfjd6oL/9OIrOq3Jg4DH+Zx5GDMfw32lcPlK9dAzGMODdELuh+Nc0Ddmh3j9ytzJGr/cXPOfL5/xp9WSaRjxH4/O+OXskE+nB5wkGYn6+SzS/5ZKCOFA7C0pYOoHnCYZjydz5mHENPww9639NhnnWqQk8vyf1bEri5Y/f37OH/7tOVXVUpUdk2nMydmMg8PMNb2UpKo6ym3D86fX/Pa/PmX1FgfVd8397F/wV15CCJQvEcInn8YcHuVuPq1oef7sCukJ8jymqTuulwXrVc2jx0c8eHTAfPGXuYe+r6QQCE9yOsvxpcf9gynLTcnltmJTNazLhnXVcL4uEAI+PTvg09MDHh7OuH8w/dkALGvZN0vfKra5/f334AwhHP/zzVNY4NaWUuEsyycpbdfvJXJCONv5ph+4LirOVwUPDqacLSYjg/X9rnlPTvC9U4SI0HpNPzx3ToH4uIasT6AeoM0GbTbf63e9qXaZg3Hos5gknMwz7h9MnG37pmTZDyy3NYNZcrEq+cOzCyZJxDSNmCQRSeQTBw6YO6AlkaNG+Ie8JQRK8fB4ysOjmZMke4ppGPFo4gK9T9P8NRWBa9oJfOnWDPIHeE8/+NURxgEff3bGx5992ODc+8r3nIuNkpJY+eRByLptuSgrFrEDWPeyfP/6nSok9DyywGWg+NIjkDfSMWstimzP6FgE2pr9okyPHeedLnwX1JpkEZPDlAe/OgYYdfjfvpOvtaHrB6qmZ9BuhsoYu2eCjDUIAV2vEVKQxL5zjRnntTxPUlYd1+uKaR4zzWOSOGB5XXJ5XTDJIrpOI3A3nWi0zXzb825ngBGEPvk02bNQxliKTc31+Zar8w3XF1uuLjZsrkrW1yXFuqYuW+qyoW0GuqZ37JB2IMsdD9cV8kZQITwx5nMpgtgnSSMmk4R8Eu9B0mSeMj3ImB3kjq06zLESrLA0VcvmomRzWVAXLVXpzDm61v3u3bGqtjXnT68xxpJOYg7PZrR1x3pZsF2VVEXjgFbh3KsQsDh5syPlm2rHrGXThNOHi/f/wLes/eLEug6WEJLeFlTDUxq9HDXWPpF3PFqvvr9nL4Tg4GTKwcn0B3+/P0a1euC6rfCk5DeLkF8fnLAI3dzRpmv5l6uXWCxPtiuebFcYa/m72SG9MS5UdwQ6vqfIfAewPCE4iTOOk4xUuZnMVg/8l8sXdEbzvNzwZXnFdVvzyXThbKfHXdobQ9F3XDYlX2yu+KfLF0yDkH8fnfHxZMHHkzmfTBbOgGEcor2sKzZdw1k6GTtp74bCu2HbTdfwsir4cnvNH1eXfLld8T8nD/n3h2d8PJnzMJsxD98EzsUIyt+wbf7qUhh+spKjmUY45mcBRJ5iFsacJhkniTuH/tpr1wirqpavv7rkv/7TE+Kx4XV231m8f/LLE6LIJ4x8NuuK5WVBEPo8e3r19g2LO/96/a93g1d/xbWPQZEus+voeMJmU1MVLc+fXpNlEUdHE+qq289oRZHP2f05SeriMn7K2qlJQHA4STmcpHzUz1kVNauy5ouXV/z51ZIvz695drXmuqhp+oGud3lx8yy+YxLx+i/4vm/wZhtvunftrehvgaudG+LrWOpmBuhGZWNf295O0fC2sXwhBMoT4EnyOOR4mu0Dd5+cX5OEPkeTlKbr2VYtq7JGeZKTWcZhnhK9FWB5COEjRYyzXldulmq0YpciwooYTy7w1QME0JgruuEJoBDCMVe+d4wSR/Scj+MvIcY6uWFvJb31MFZhCbH42G8hF9zlodUjoJRCEIc+0zRilsaUdQcWNlXDpmp4ipMVKk+ymCQscjfHl8XhKNF0Jio/BpOVhAFh4HFvMXFgDsiCgHvphET5TMOIWRjfiYDalbbjaMy4jvhZSQR/rHILJTe0dj/PqfsjJmHE/XzCQXzDenWmpzU9tWm4qlZ0Zc9hlHMQTvCFhwscNtS6o9ItgVREMiD2fGIVEkrFdVdy1W0Jpc8izJj4N9vf9jXLdovBchBkLML8De/23bUzsvDkN+nnm86J1ob1pubp82vabqAZWS6tzX44GEApSZaGJHHI5VXBZlvTd5q2HUjigCjymc9SppMYpT78hu4kHqOV+ChnyGcJR2dT6spJBrump+8G+nZgGMxo++2GoY2x+88mpAsi1Fgq01KZDuNZjLTkcczpZMZRNnWgK7xhs3byRc+TvOo2vGhWlOsKcamRV4YkizhdHDD0mqpouDrfEMYBs8M3LCOtA2er5RZjLNODnMXxlIvn1/S9HqUsP8cHvgNYUigCOSPxH+DJBG0ajO2Rwudvoh38hkp8n6M45VE240E25TjO7rBAn0wWBNKj05qvtiu2XctlU3FRF+R+OIbReg5I4UwxZmFE5gfkfrjvUnlScpJkfDJZuLyMqmDTufyi22dSPThG7fP1kqLvmAQhD7Mpn82P+IfF8Qj+wr25gi9dA2YahEzDGPWWZox7+DuJazX0XDU1f1hd8i9XrzivC6ZhzP8Yp/zD/JjH+ZzDKL0zZ/b69nhN2mL3//zvEOtDKpAekyBkFsbEno/AAeZl44xSJsG3Y69+rrUPwe0Gim3DelUymR5y/+GC+w8OmM0T5zqqJEJA32vqqqOu2g82yPmbLwH5JOLs/hzpSWdF/7RlMo2ZzVPqusMPFJNpQpZHJElAEKq/yBzrty0lBWnkZGwfn8yZJCFH04yTWc6Lqw2DMXz+csk0jfj49M2NxdvitvH/d5w6d0zBu0oKx/YqKZ2Ee28lf/d1/aDpBu2CkLUzpLkBTmIv1eXeQugAACAASURBVA58RRw6lqdse8qm20sGd7XLuWv7gW7Qo73922cB0zDgbJHTdAPrquHr5Zo8CZlnMdumRUqxNwfJopAoUKi3HHNPpoTqE6RIUd4BSh4AFk9mKHuIsTXGNCg5xfMOAIiQKHk4sj8SIWI8mSEJUd4BgXlAb2Mqk9FoSTnElH1G5MXE8gg4IObDm8rLTcW/fvWSPzy7pO0HFzJc1FysCpabim3V3AGtO+vzwRiKunUN+7oj8N2M286t8ibL8Ie7HvIk5P7hhOGWu6knJLHvzu1I+W81myo7Z17VGc0iSlhE8Xd+Z39VACsYdbP38gmBp0h8n8M4IQtuaL5NX2P6gaum5kl9znmz5pPs1A2veQEGS2d6rrqS664gVRFTP2bqp0ghCYTiuiv4c3FO5kcEnroDsDZ9xdfVJYM1KCG/E8CSUowaX/fQ2p2UNx0l9gDLWEvbDjRtj5SCJA4IfAewrLXjvFZIloZYC5ttQ1l1FFXLwTxlNk14cDYjjlzH4NuUc+/z8X3lmC1j9p2iu/NW9kaLD6+t4XaLu1r3nLdrLpoN5Qhwp2HCp/kJj9KDmxmtnXZ/p9WXgmWx5bfrp6wvC2YXAYtVyGSecfrowMkYl1uKdc3sMH+j+5TFzWWtlwVxGjI7zJguMoZ+YHW5/YtZjn+XEsJDWJ/Ac8yTkhntsKQ3G6QIftAb08+pEuVzlkz4ZLrYA6zIUwggHgNkj+OMJ9sVFth0Lcu65LwqEIkg9QOUlHjSDbjObISx1mnthRxnpUAZyXHsGO2LpkSPJjnNNwBWNfQ8K5xZRtG3I8By0sV/mB+7bt2t4OfI+qQqxGLf6TrnmHKBAeph4Lqt+f3qkv/04kuU9PhsfsRn82N+MT3g48mCWKl3MucOXN1YQeyuv91n+e8Q6/0VSI88CJlHMdE4V1cPPcvWAazT5Nvf93+OtVMq9CPAWl1XfPp3ivuPDrj/cMFskRJFNyY8w6Cp646q6vaGS/+9IJvE3HuwoG0HLs43XLzaMJunLA5y6qojCBV+4JFNIpI0RHryZ0ngeVKShAFR4DNNnB35w8MZZ/MJX7y64l++esEfnl1wNM2omv6t29nd0/bPJnvDDFnx/pagEDfz2cCo7jHYb9y9eq2pRlal1/rO/PeuYe1JSag8ktDN1lZNR9W6198uYwzdoGn6gX7QY5TC23OQkijgbD6hbgeuy5qvL1dMkoiDSTo+Z1zA8iQJHcDy3z5/JUVK6H9MoB6yc/tzH8OA3X1ug9iZXgC+PMD6Tr3iCLfROVDI8WcM676lahuuuppVF7HqNPMgZhEmBGRoPvw+ttyW/D+//5r/4//7015ppbXLWRuM2WeI3dmn1mK0A1ZV24+eCtwB3z9Gg3iex/zm8Sla3wZYYhwPUHcYzW9W0Xc8KzZUfY9EjFlZ3+09/tUArB2FqKQgD1wKduB5xOOQ5q5Cq0gJSIYAX3h73Xvo+WgM665iO9Q0uqM3mnpowVokklSFZEQMVtOansCoOwYaMOaYmAFtNcN3DCFTniQMFWGnHFAB1DijNGhN3+t916bvNXXjzCqEcMxWFDmXGgt7owilPMJQkcQB/aBpO0fle54kTcKxAyn24GOwhk1fO0A6XsBSSEKpCD2fQCoCqejMwLZvqHW7v3hiLyANQ5TwGMxAb/X4en8cvnfHY9vXFENDIH1yFRER0jeGvrGIvkL3EPoBcR6SpJHLF7eWcmjZ9jW17vYyzFfNmlVX0eiOHPfA79ue7aqiKhr0YEDA0A1URUtVuBkyYyzVtqba1HSjnb1jvJxjY1N1r82M/dzKYrBojB3QthsDsgN8mbv5we8gU/3g3/2N/fKXZPl86ZH7AfMwJlUBwZh/BCCsIFEOKKV+QDiec40e2HQtszAeH+bunGqGwTkQ9i3NMNBoNxtlLAzWhcquu4anxZpN1yKFQI8D07uua681m65h2VRY6xzh5lFMHoQkb3KE+8BdZcdoiaJr+WKzpOhbnpcbLM657mE249PpgpM4JVFqf329qXbdYbm770lFawZaramGnk5rJ38ePap+nqztT1+x8jlKUu41ObMwwpceZd/xdLtmGkScJBlVP9t32d8lI3HD986NUI4P9t3z7Kfe/zfmEzeGFEZbunag74Z9B7/rBoZes7woeP71FS+fXVNsP2wO+b+FSpKQw6Oc66sCKSVl2bK83PLs6yV9p8nyCD9UaCV4WRR3DBTkKEOSUo7hpo5J0cbSG8ek7I7RNzPdAPTIElhrx5EK6Ywdxv/Ow4AsfH3OXBtD0w3Uo335js33lUSNc9tSiH1jdpeVddOwefMzU0pBoBRR4EYTpBC0g2ZV1lxuSpLQmQ/Y/SiGYzK8W01O35Oj259P0w88v9rs2bTdHJMxllergpfXW76+XDsXP+6iN4HAVx7zLOb+wRQpBS9XW5IoYD5a0Hvjub8qGy43JV+dX7Mq61uf6M2fMw4Uh5OUom75/KVH3fYstyVPL9eEgSL0PR4cTpmnsWNs3sFYitFG/e57/+YfbpcF4d9SJtz+xDf7YLCWYqjY9D2NFhjr0xrFdhAEniBTd5/x77of9YNhW7csN+W39p/ZAa2/VIWtouo6yr4nHgbnJijYm0e9q66bhpdlQTV0HCXp94rI/asBWLsSCCLlqFY5hkrerkAqhIqZ+h3TIKXULVM/YeLHbPuaVV9w0WwIpMKXCm0NxdDgSY+F+cto6pXyiOOAthvoR9lf4CuCQI0ywBuJnRDCaV+bHmOcY1/bOUne7ZPcG9mtxSxhUzQUZcswaISAwPdGdsi91gKdGXhZr/iqvKAzzmEw8BRTP2EWpExUzMSP2fQ1X1dLXjUbdhfyYZhzFs9JVEDRNxRDS+5H5L5bCEfjcVq2BU+qS+ZBysPkgFRFBFIRq4BKd2PSw01paxiMZtlu+bK8ZNluCT2fUCrOmw2t6ZFS4vvOXbAuW159fcUwuE5TEPpobSg3FdtVyXZVYrRlM5p09O2Apzy0Nlyfb9hcucyvfnTF+nliLIu1GmN7BlvSmWu0qRAoB7Bk5G7MP+47AH5YCv9DyhOSSPkOXHnend8ucOe8j5uT2Tn+dGOsQ6f1aGgDndasu4Y/b674cnvNsqm4ampnQGGdw2CnBzqjuahLrtuaeRjf6PR3rLJ1tvHbviXzA+ZBzDSICN4zV/W+Mlh3H+o6Vm3Dv3GOEIJ5GPM4n/PxZM5H2Wz8jO8H0wK3yPGlR6QUXadp9EDRd7TanetS2p98cf9zrtj3RxDVs4hiAs9j23d8tbkm8hQf5TOKWTsek3e7Te1cITut94DMG2WhP/UR2AGrnXV6EPj03cDqumS9rjg4ytGDkwVWZcurFyu+/OKcJ18t2XygA+l/C5UkzoBp+mqD73t03cDVskApST6JmExikllEKw1fLq/3ao2d6cnO2c73PAZt6IbBBZ52veukjyBkd57dnlnpBk3dD2hjSMOALAycc6p2//1wNn0jwDLGsqkaLrelk9J5julJo4A0DEY1iqVsOtZlw3VZM2hDHPhEvroDiG6XN+ZJpVFA6Huukdn1nK8Lnl9tOJpmBL6HNo79kEIQ+t5dgKU88jgkjQKqtuPL8yumSci9xYR0NKIajOHpcs3vnl7wxcslm6rZqxJuV6A8Dicpj48XrKuGZ8sNQgiOJikHeUKgPALf42Jd8KcXS37/7ILldjy3xf4fr1XkKxZZQlG3RL5yrotFzZPLFfMsJgsDTuc58zx5i1PwD1XvAEVmYDs0FH2Lxa3xXEOxwZeKeZBgx1iRD6uf6zrpbllrabWm6FvSIUD4PnKUeRd9986fXTYVr6pi/9rv83H/+gDWKBV8WwaJEs4EIlEBkecTSsfG+MJzMjHdU2rHBgXCHzs9bmHfG01v3b87M9CbgW782lVvNL0ZxoWZ+zuJwBPygxcsYaiY5hECaNuefjDEkU8U+bTtgBpvslkakCYBfT/Qtj3DYAjG/BBfubC/NAn32VZhoEiTkGFwzNcua+T27NVgDIPVlEPLqit51azR1iCFJDGBm0nTARKBwbLqqlFOWe6pXSU9t3gbfIq+pRgatDXOSl9IfKEQwrLqK55VV2hjOAonZMo5rAVSob6xvyyWVveUQ8t1X7Lstiy7gsQLiL1gzzhEyiNKQ3LPmXH0XQ8I4sRlYPmBQg+GXdaX0W4hqQeN8l048NBrrLF0zeAcIvOIMA5+VOvxXT7bMAblOgDgyhsH6n3PudfsZoNu7xuLwZiOwZRoU6NkNsoDFe+1RPoetR0atn2NFJKJikj9D5s9caF9jj2qdUc9dPjSI1EhkfdhTkqecGGBoafuSO/gppurhHWLFM/bG0Q0etizy9XQc93UPK82fLG54o/rS7ZdO4KNwXV/dza+xlD0Lb3R4z4fh57HB5C2ls4M1LonDwJS5axc1feUl+6s3zety+bq9MA8jFlEiTP28V3e14csyPcxDEI4WWQY0WlNZzSbtuWiLnlWbog8Nc6yyTsSQmvtGI7sv/Eee7vbqa3rsu+FO/ZmG7Ue6I0eDYPc9vsxNLnsO3qj8KW+28X/BrvzU1boeczDmCrtOU0yzpKcdddw3TZ8vV3z5eZ6b/M7DV3jaHd/NCPrubONdmHRHdXQMw9jN9e1bxL+1AzWOC8YKCazhMPjHOlJVlclr16siaKArhuoSgewlpdbyrKl74ebOds3rWp/wGrbfs+oDYOhbQcuLzZcXmzYbira1jUq16uKF0+vR/tzgackYegThsqZLHkSPWiacXt6cA3L85drlpcFm1Xt4ki0ZrupefVijTHO6tqTTi6/m0fzPHlHVu4kgIp8lAD6vkddtbx8sUKpBadnM2YnOU0Ay7LGCrdQ9T1JEvhEvr9nsgZtaIeBuu/Zth1F2zr58S74VtwGWMJlPHXu+ZiHIWUU7BksbQ3tkL5xv2prqdqeq21NPzhmW3nyFsBydNXFpuR8XbCtWnzlcTrLWeTJWx0EpRAEvkcaOpnhQZ4gpeByU/L5yyVF01G1nQu3Ng6wfXN7UeBzOE052WYstzVX25IX11ueXKzoRmmqNpanlxteXm9ZVw3GWkLlgN/t0zH0FcfTjE/PFvzp+ZJXqy0X64KvL9fO0S7wiHzF86stz682LLcVndZEvsL33m4O5isP5XlM09G4IfBph4FX11sEcJSnPDycMU/jt85efff6MHGduXUe7Brkg3VO2q3u3ymB/Gbtzo13Gpv8TCpLQoywLOuaKHKOwVIIlk3F82LrGNO3rNlfllteVQW91tR9/1am9kPqrw5gva92p53FgaHGdJSDAwGD0USeTz4u9LXRBNInVRGZcvMZm77af1ks674k76I97boe/26wmnVfse5KYi8g8gLUBwaIZknIydGU2SRBa6dd3QGhYXAOg8ZYFxrsKw7mKafV1GUsKO9mlkoI8jQkTW7mcIQQJElIECpmk4Qkvitd6kzPuq+57kp6q0lUSKYiZkFC7sckXkDo+aw7B446o8lVxDSPx8W/ohpalm1Bq/uRkRe0pmcwei83xEKnB7Z9y9Tvxwv87WWsZd1XvKzXFEPjWEcVk6qQRIU8KS/Z9DVe4DFLc+6po1HXbfeqAOdO6BNEPghBkkVYC9NFRj53Vu+TRbp3OLyd65LPU+L0xwtsbfTAtmu5amteVltellt2iuVE+RxEKQdRsv+6WdyOJhfjpbqTCQrbIq2PoQe+m1T1Q+qL7Tn/dP0Vkefzj/OP+Gx674N+zlhLZwfqoeeL4pwvinMOwoxfTc54kHyY6+LtmaH33uLuyBxuvn1Rl/zL8iVfbq+5bmu2XcdhlPH384TUD/azTEXfUfStM5dYvnr3m9p9vcWt79uWc0t0jNrEDzmJM+qh52W1ZRKEvKoPeNhOSXyfRAUftJaVQjILYx7mM7S1vKoKrpqKf1m+QknJLIyYh46Z2YGifgSZx0nK4zFQ9227wFhL2bsO3w5IaeMe5NpaXpZb1iNg1NZJnjddy7Ni7YaMbwE8T7hw6EgpAk8RSO81ZcJfunYughM/5NPZAf/L2SP+tF7yxfqKZVPxXy6es2obTlPnKJjdMl/pd7lrQ0+tB4quZdU2bLqG/3B0xj8enXGSZI7B+I6hnz90JWnAo8eH1FXnZrFWJWXR8PTJkjgJ9k5fnie5d39Bmob88XcvKLZvZg1+yLpeFrx4vmJ5sWW9qlyY77Zhu6m5PN9wtSwYBs2//ten1HWPPwYcT2cJZ/fnnN2fk+cR+SRms6l59vUVr16s2W5qtpua9bpis6q4vipZXm6pyo4//v4Ffa/JJzHSk8RxwINHCx48OnCOt1lIGN49dkJAFAccHufcezBnu2nYrCr60xmTacLxyZSV6dC6ox16mmHAoshlSKQUZdftgRKj7M9Yc6d9JsRtEwlXvueRhgJr3aiBNoZQKTKlmMUx0dus1Mff0Q0D56uCi01J2XR35KtCOGlY0w8YYzieZnx2/4hPzw6YJm9utu1khXHo8+Bgyn/4+IxN1bLcVFwXNXHgrLqVco2xe4sJv3l0emfhPklCPj5ZIIXg8xdLyqbl5WpL9Yee2FduNntkX9Mo4Hia0fVufioO/DsL58hXnM5zPE8yaEPRtlRtzx+fX/D15coxWOO6SnmSRe5YqbLuSMPgrUzd7nj4yuMgT3h8Mue6bPa5WEkUcH8xYZpE79zGj1mh5zPzYzo97EdCQukTemps5MoPZq/SKODxyYL/+Iv7P/K7/v7l+x5+4vGkWCEDQTI2MP50veT/ffWMxA/I/ODOeNGuXpZufaakdLmZ3+Mx/zcHsGB0rbGWwWoa3VPplu3IsoQyIPdjeuM6rKn0mKiYRIVYa/cn4aavMFjWXUWuIjdAKASbvmK9A1hdybp3VHLwgV15gCwNSZOQ295eN/2IG7y8+54Z9djAXhe9/6zjTbBu+v1DMI0DwtBnOolfA1itGbjuSpbt1n1+FXIWz3iUHjIPUgRu8XTdljytrvClx6P0kHvxzLFJKuQPmxd8WVzwqlmT+xGZH9Hqnt4M6J2LjxC0ZqAYGirdvXdeze3rmqfVFUp6HIQZcz8l8yNyFVENLV+XS5TnMTvMuD+/BbDGLviOzhfCBeOefXQ47iP3UNrv7Z0N627P35pD+LGq1QNXbcWT7YrfXp3z26tz9AgKFmHMx5M5jycLBDjZ2a0Lf+ciCGDtgLYtwnpIq7C258e0Lfi8OOd/f/EvTPyYgzD/YIClcZKo7dDwh81L/tPF7/k4O+YgzD4YYAFvNE15+4vta4+K87rgny5f8PvVBUq4Ga6/nx/zP5084H46JRkZqIu65KIpUVLytFhTDm+WEdzWvP9QZ0szAixtDKdJzqN8yp/WS15ut8TK57zasupqhBDEnv9eBy5wDNYsjHiUTdl2jrlajgDrvC64l064l+Ykyun4tTW02oU3/93skHkYvx1gjR3Rsu9YNiXV0DtQofVe4/6y2rLpGpphcPMhWDbjjJu2hlj5hGoHppw77CSISH2QvsD/iYGHxC3eJkHIL6YHBNIB0Rfllq+3a1Zdw2+vzvkon/N4MmcRxSTKzQM3o7xr07X7mb3zqmDZVC4TLZsyC+P3Wvb/JStJQx49PiQIFP/6z1/z9MmSy4stTd2hjSXPI7JJzN99dsY//OYBJ2dTrpYFT768HO+bP96982pZ8qffv+TPn7/i+dNrXr1Y0/U3jNauYfbbf/6aP/7uhWtC+h73Hsz5d//4aC/PStKQzbrmz38653f/+oxXL1e8ermmHd1wh5HRMsbyx9+95MsvLlw0iq+YzhL+8X98jO+7+d8wVIRvyEyMIp/Do5yz+3Pa5pz1umYYNJNpzPHJFFMUlIXrjDf9MA79CyJfsaobrqpqDKv1nIpknFG62cOvM7y+5zkDBUaFjdZknmQaR8zjmOgNVtTg7mIuMkbzalXwu6fnPL/ajFbcwx0As8gSTmYZx9OM//DxGcfTjEny5oakEC6QNg58HhxOafuB3z274N++fsXXl2vn/Ke1kzNGAb9+dMrxNOVXD47225jEEZ+cLEhDn7Lt+Hq54tVqy799fU7bD26O3Vf86v4xnz04covhbqBsuhFg3byfcARYi0lC0bRcFRV/er7kD88vudyUe7vwj08WfPbgmEUWO4DVdKRR8F6FQqA8DiYJj08W9M8veXG1oWo70tDn3sHUBRf/qBLBt1coFdMgptGusb7uaqaBC9NV4vVMxndVFgU8Ppn/VbgkaWHZ+h1fFSvCUI1RToI/rZb8X0//zCJKOExS4jdkEa6amouqJA+C15yEv239zQGs3SI59kLuxQt84XEQTpj6TlIWSsVUJ3uTitgLSD3nFijHxfaD5MBJ4Dyf42hG7if7jtG9eIEUEmMNx9GU3I+JvODOPJG1dmSm7E1nXYzuKbc01Dv2R+DcmQZt6NqBpnO5WE42GIwDoGKv274NsJqmp6w7Ntua1aaiaXtmk5jZNGY+SYiiuyeQGYFnb7WT0UnXyVC3Mr0sBoN7nWflKGFzw/VqlCnpcW7ktgnIrhO+Y7DM+PcfZCBh3aK83/9OOXazd+/P24PJHZDUaAarqXVDoSsGMzDxMyZ+vv8csAMoYhw0d3lnTkYg0FajrUYi8ZAIKzCMnUMhkUgGO1Drht4MhF5AKAM84Y2Bsh9246yGnldVwZPtiq+L9bjQdPul1T2TIOQgSsYL+vb+slgGtGlGI5IAKXysHehNgbbt96Kw31fG7liJu8f6fbXbx0pIeqvZ9g3l0N6xTX1faeuCeouhpdPDHe33TgLTjZLLehjGeQaPZHQPNNZS9c5ae9u1PMpmPMxn3M8mzjjjljnGzgij03p/XL5ZTnbnk/nOGXDdtXtJ4fep0POYBRGhp/jV7JBfL05G6aFjcp4Ua+TLr/lsfkQ4PyJW/j7M+G2lpOQ0yfn14YmLhBCCZ+UGEJR9z4tyy7Zr3fzYeE3tJHr30u6tn8nNi7l99fn6in++fMGqbfYyFCeFdQzW83JL0bd0xjFYL8st/3z5kq+2q5ENl+N7czb597MJZ+mEsyQj/okzpnb3aSU95lGMBf5d3yIEPNmuRkbKGf+c1wWrtnbOsIj9tTKMjKAUguMk5ShOuZdNyAJn2CKFuHPtWjtgrLv+5d5JzGBvyXvuvMddZwgxvsZwcBLxm3+8R111ZJOQ6TRmdhAiPYM23V706kLMd08fgVKCyTQCJmh9j3wSU2wbutHoIopcfMbpvRn3Hywc49lrDo8n/P2v75NlIX6gODjMkVKQT2JOz2bce7AgHyNCJrMEYyx+oFgcZkymyfh6SZZHHJ86E4J86piM0/tzhBDM5gmPPzkizUIePDpgvard83WMBNk9X6R0GYvOfU4wm6c8eHTAwVFOmjnnviyPePj4EOV7PFofslnXN9mNOxMHa0cJ4M32dgD08Nht67bs/k2NOSmF+0wnExYHGXESIj1BqzWb2rF+8yR2wKAfuChKfE/yaD7bW5QLwejOZvfP/V346e3fKYTYL5R3bm5x4JMFbh7rTVk/4GalZlnMQzPbszBXRUHbV3RDhbUN0BAFiiwOmacRDw47psklgVpjjUc3KAQBQtwGWxprO7TpyKKeB4caKRXTJObv7oMxMcYm+KolUC33FoKDvGbQF1jbYW2HsRpPGrKo4aOjJUZv2dQ9RQODDlEyxFcJ9w8W3D84YNCCe4sJbT9wOs/d7FMa7/M/pRQEeJzNJ/zmI83xNGO5rdjW7d7k4niacbaYEPmKk1nGp6cHnMycRf3hJB1t3l+/R+ybC9ZZtx9PHRDN4hB/PI9+KiGwFE4Kl6iQkyh39x3Ea+fPh1QU+pzOJ/jfIu7npyqDpZYDtRw4yTJSP6DXznb9o8mM+9mUh/mUPHi9SfC83PLn1RVSONfB73Ps/uYA1q4SFXA/PuAwnOwpUQtMbDKyLO4h6AkPJXdI3u3KSPqcxjM8IQmljy+9PY0aegGHYY6F0YDBf22hbe1NmPBty9Db1uw7kCCle33Xa5qmZ1vUrNaumz2fpSxmEASKMFBvXFA1bc/yquDy2mVg1U3v7NknCfNZiv+NuSLL6FBkDZLdPJT32kW2m2fxx/mTHQCT7s2PU0E7e1DHDpkR0uxCmm9e836QtZMdaasxOLCrhIcv3KLZGxeAt3t5g9V0tue63/CiOafWDQ/jMxLPPaC1dXNOSnp4SOfIZAZnxz8et972NLobw6gDJJLeDgx2GDs8HrVuuO7WlEPNxM+Y+jmhFyDw+VBp9Q5gfbVd8XS75nm52QMWYw1HcbafC7oLWi3G9mhbAwZPhHgiZLAVxtQOYH1HN8sfs3Y3diU9jDVUuqXRHdp+OBgZzAiwuo7OaG4vMu0I8HutabWm1j2xcAxCqlygr7GWeuhZtTXl0DENI/5+fsSDdMo0iIg8d031Rju2tW+phrfLWZWUJMon9wM6Y1i3Dduupdffb/9Hns8iSpiHMZ/Nj/kfju4TeM6K/UW15cl2xfNyg+95PMhmKOlMa94JsITkdEyqD8fPGSuf87rkoi4p+47nxjlveqNZUOYHZH5I1fdvBcLW7o7LwJ9WS/7Pp3/mvC5vQjpxsyWN7veAdbCuYfOiKth07X7GcC93EoJPpgs+mx/RG0OiFCc/kxBfJSXTIBqZTsFRnPLVdsXn6yv+vL5m27dc1hWtHvaSLjWGz4bSI/IUWRCwiHIOx4f7jqG+a7VvMXZgMDV2f50LjB0w1rmfipGh39UIiQEwVmOt5vAkJs0eoLXBU6AURFGEVO69GTRYgxAK4aw2EEKOZgwhUewxmSZ8/OmJY4fGJuEOaOyAFlgWBxm//ncPmMwSsjxGSMHhkWQ6dZblfTcQxcEekMzmKWkacnQ8oW2P8X2PNIscqMpjoshntkh5+LFTHmRZ5IDIQUYcBzz86JC+H0aX3W9Eg3Azl3R7riyOA6I42MsGJ9OYT35xzL37c/reOSOaN22Lm2Yegj3ISpIAkBmbcgAAIABJREFU31fvnNe1xj0zszxGCMniMCNOAhDQDAOrumGexCwSB9zXdcOqbng4n/JwNiXy1f4o3/WHYwTFr9fu+b2b+9uZqajRQONt5/Y8i0nDgJNZxq/uH9ENNb1eMegVxlyjzRWeVAQqIfBjIr8lDko86WTBtldImSNlvl8jWduizRZjatIoJfRTFrnHJ6cx/RDjyROkPMbaJdaeE/qaaVqh9QXGbjFmi7EagSQJBx4fXXOYbxi0hzYBiBhPTvC8CWl4SBYdYnHOysZaIl8RBQpf3czqS+Ea1GfznGkS0d7bZV3p/T4Nx5/zpKQbNF2vCQNFNOY2BW8FFnbvBJuGAWcjwMvj0DVyf8Ixy93azXkSKI6inE3fsOnrbw0c4kBxMs+Y5z//GSwALQwaN5eX+D5F51wBfzk75BfzA/5ufsgsfF3m+vnqCgmUfU/mB9/r+P3NAiwlPHI/JucmJGx3E9ongHPjnnJHs+v5TN+y3dDzwX/3CWatpW56tkUzOtzZ0c1PEYw3ejnaRu5kbv2gGXpDWXasNxVdp50Tp4A8i0Zw9uYwXDFqnpPYaeUneUyWhMTR6/SnJ5xlfST9UcLXEfYVQaNo9YAaQZTFkqkQT0hq3XHRbghGw5ByaPDH/Zv5EYkXoo3huisZjKbRHUpKyqHdgywn1+wohobrrmTd12z7GrAUQ0OpneVv4rlh/lK3LNstre5ojDO/MFjUrQeMsYbBDrSmoxpqZ0eqClb9ZmSnbhaQUsj9IlAi6EyHQDBYx4J1BirhwEprOjrT79mqRnes+y2Vds47qYrxrcJ+ixmcZui5bCqel1suR0Zl99NZ39EMPd04y/ImRsoCUoT43hSERBiFtrUzuviB7uBvBsHf4NM+gMWysD8PyqFxBiXjIvvbcG07WeWrestVM2Hbd8TW7udcNm3DdVuzamu0NS67yA+Zh/HeVdDizBX0yCQE4+zPTvaxMyBY1hVPizWXTUkzDG8MIQykYhElnKUTnpcbLuqS87rkVV1wXLvw38jzd0pVzDjXpI3BH404dmYOt0tJSeQpct+xmKdpTjF0jm0VgnXbcF4VPN2u+Xyz5H464ShKyUZr+Dd20IUg8wMS5dMZzWCcLO/FqC+v9UAz9Bjroi986ZEFLoD5KElekxVZ27gv02FND6YlkCtyVdL5HQgfkFjbAS0QIsQUIdStbVTYsVEgRHyn650rSyS3KHzkmM0isHjCMPUtn+SSsvX5dBJzL8uYhj6+6DFmC2iwA1O/5aPcJ5Ax1g5ESrIIG6S9wpgGUEg0mS85jlM+nsxp9cAsjDhOMgd6vtFtlsK51kY4U6FsDLBOlNPwL5uaq7qiGro9++lLj8CTxMrNzM3CiOM45ThJeZhNyUaGVTgtO4Nt0LZB2x5re6w1aNEijMTggJMd72VuP2osZgRHCoEcmS6Nn0TEaYTFMJiKwdZYalqzkxiPrL5QSKGQoz20FAovUPhhQJq5773vvjKZJq99z/c9eMss6w6gvamCUBGEivQNuDqOA+L4DTEI36Gc6YUP8+++jd090JixpWBBD8aZY2xrNyO2qYmTgNk84fhkQhw7l8E4UEzikEkUkkehYzq1QYqeSRiySJ2k7+6YgGvAdp1r2PrKxbLsczPtjXpk/0O3/ihGM4m+dxEwQgiUcsArVM7gYSqi8TP5DLpk0IMzsLEKkEhpkKLDmAprK8AxVyAxtsDq5tY7dueiEIJQdYS+JY0GFtmAECG+SvG9Iwbd0g+XGFsjRIE2LcYWGFMAFiF8fM8wTRvyuEPKCVLOkSIZ7ysW31MoFSHF+xf9QkAWh2Txt5+13h9zO44YYEcXRM22blkVNctNRRQ4OeKDgymTOHynNftfonaxQp0ebvIfd0B4x2ffmV9+R9PO88jinz979bbqPM1JkvGrxSGPJ3Me5lOmbwBYvTFsu5Zt1zKLYr4P//g3C7Dg/arwH4u41dqw3Ta8PF9T1R1tNyBwWRnp2AELfNdh7zonTwhHlqrrB5p2oKo7END1Thvuqx0wA8+7BQYjn4NFSpoGDINh0IY8DYnCNx/aUCoWQYrF8qRc8qy6YtWVLNuCiT+aSnjuYXYazah1x2W75UU9ynqEtzfHcAYUAbEXOkfCco1EMA1iAulz2RZ7AFnrnlVf8bJZ87Rasuoq1n1NpTtyP3b2+sBxNGXT15zXG56aK2f/riJeNms6MxB7DlDsuuWOiRNEXujkgqbheX1+K+RQ7A42oQwIvWAc6O/HRblPIH0a01IONbVuaExLqzsylZCqZHTCq/dSue8iyGv0wFVTcVEXlO+xCb1drpOqRjt2iRIJgcwZbIU2DaGcI37Ay/j2jNHtP+3Zifd8+t0Nu9E9V23Bi2ZFOTRIBL7wXgMX76pqNHpwEquMB9WMaeiYp3ro+XJzzZfba15WWwRuXuYwSjhOMmLP33dww5ENKvuOV9WWWRhxajI6M1D2PVdNxZfba357fc6T7Zqi75i+wdY4UT730wmdHlh3Dauu5kmx4verC3zpwoqP42wPzjqj2XaOFZsGEdMgIvTGIMh3lERwGKV4wskc123jTC/qLf/3yyf8w+IE/8Aj9d9teLGTEy3CmF/ODjiOU8q+o+i7vaMljAYxQhJ4HqHncRinHER356+s2aD1S4zZgO0JRcevZyWZF9PoGVJOgQBjlhizRMpDPO8MIfPdBtD6GVo/Q4gIz3uA9A7328+8NVO1ZBatmQduFkMJDbLnYWb53858PpumHCVzDtMTZoFH4tUYvcLaEmsr7iea//Ukpuw9jK1RouN+tsK3A3pIECJBiZiTJCBWRxwnGb85OCFUikf5lFQFjh18yyIjkIo8ACkmJMrnQTahHhxQ7Y3ZN0fkaNyhpMQXnrO+VgGJ7zMNoj34d06tA61eUQ8XIARqBJ2DrultDVaM6+X9HY/BtG4OEw9P+HuQ5STfOYE3QduWajinHq5QIsCT4chYeU76PDJYDmT5KBETehN8L//J5Ex/LbWTEVprR4kilGVLVbacv1jz7Osrnj+95pefnfLwo0NOTmfEiZs5PM0dkN9J/gSQBoGbmRwlg/D62qWsWpbXJcZYJllEloYu/3KXeTVKJXfMtjF2BIDO/U1I4cYItjXKk2RpRDoye7clX9Z2DOaSbvhylJG6O7Y1JZoSa1usbfG8I5R3hpQxg75Am4v9w0LKDE8eIeUErS/Q5txJ/zBImY5NGDtKAUuM2SBEhxD+OFMsxnPaRwiDtc4pV4opvvcIIUK0uXD3GjkDq39cl5Wxduzg7vjXXU/ZdM7d8HLF5y+X/PLeIZ+eHvDwaMbkLSYgf8nqzMC6c7NXGnMj+TcGq26e6T+9b+uPX6HncZpmxEoxGRUsb6pJEPLJdE6jNYdx8r0a2O9dmTl0a9nNs/yY5Q7yh9udv3Nb79jGj53/YqylrFoulwXrTU1ZtQBMJjGTPHJdtEBhtKVqOoZBM5skzKYJ/dipapoeow1N0xMGPtM8Jgx9/G8szqLQJ3rDsO3bKpCK6Zh98KS85Kor3PBjXzPxI+ZByixIyVTEaTxj2W45bzY8r6/3MsFFmHEUTpgE8T6Q+LorOB9BUN7FxMpZq++canqjR/aq4LzZUAwuPwssq65k6sfEXshx6AxInvQV582aXDmWrNE9AkHouTBj2FkhO2Yi8kIGM9DqjnKoxkWOk3aaERRN/YwJOYMd2PYlrenczJbK2fYVl92Sdb+l1i2Nbpn6ORM/RwkPbbVznrR3pWrvqhum1ElDrpqay7Hb/b4t3OkqjQntnoxRpFibu463bAm8yd4A47vUN223e+tYtF2XzmWkOXnRzkb/ndsbt7nqK141a56WVxRDSyDVHuh8aLXa7TMhBC/KLc+rDY0eyP2ATdfy+WbJv16ds2wqQs9jESYcxCmHUbqH1qGnyHw3h9DogZfVlsM4ZdO1dNqw7hpeVQVPiw1fbq45rwsa3TPldYAVK8VpkiOF4HerCxo9cF4XfLG+wpeSdpdzJBw7UeuBZVOx6RqGZEKwk7p677n/CMEiSlhECb3RvCi3XNQlV03Ni3KLJ6RjseLUBXu/hdXeSYrmkQtE/j5l7Bajn2PMBcJ2hPT8apLw2TRGykOkd4oQMXqQaF3jqSOU+gXSc2DJWs3QW4b+GiEnKP8jlPp4v/2h/yNDf4Flg/JdA8ITFik19xLLSaAwJkb5E5R/iDUVxqwx5gprNli74TSecC+ZAr675s0AFMAaoxOEmKDkjMPohOPkgF9+y4DuXTxI5oc/mITRGk2nNxTDczwREnlzBJJaX9HopQNBeDg+z4WN96akNyVCeHgiQIrg/2fvvZ/kOLI8z4+7h0xdWRKCBMkmW0zPbN/s2p6d2a7Z3d9++8uNTc/OTGs2CYJQpVNHhg73+8E9o6ogC0ABBLv5zBJVyIzKjIzw8HjP31eghI/Ep1Gl615lrMonJPUhvozxRIQSIVKErihTCKGQ2E5WIAdI6ePTcwnXhfTStb+LadfEb+TYvCo2i2c/hJdby7F2dih13bCYWXXDk6MFJ0cLppME3/O4+8mY3b0BUWQVy3Z7XcbdDklRkhQlSgr6YUgvDK5AHJ+NdVpyMlnROM9HqQSB72Gcn1TleGQbCfkNRw1sV1FKyWKVc3q+wvetYIvvWaix5114DBoqtJ5TN09RcoQUQ+y9NsdQthwpjwM8tY+UXRo9Q+tZey8RwkfKPr66hdZzGj13fC4LaTWmwFBjTGELLJMgqGxHzEjsuFMIsclrNl20Ab53B1BoPaHRMzyTfpDcVJtNx8rC0uumYZkWzJKMw8mSo6l9fHlrm4Ox7WD136JTdtNR6tpa35RrSmdFFDpu+7Mw1L/1EitQHnudHnuvmbt7QYAnh5bL+L45WIaaWq+o9PJCsOE9hZJda556jXbvxxwC8DxJGHrEsXMdN8atNkGWlWTpRZIt5cZMuKRuNJ6n6MRBy72yE6JxJNx3U6ORwkoDd7yQe91dPKGcJLGFN3VUQMcLCaVHIG1Bp4TkIB62JPiNtHusgpakrs0efT+yXlXKQglrY6FJw6DDbtgnkB50YeDH1gtK10TKZzvsMw66+E7QwrCFEpJPu9uE0idSfutR1vMitsMeAmc0LTx814UKlA8atPMxaozz2cHyuSIVMfB7lLqkaEpKbTlBuc5pTIMnPDoqJpQh2tPu+7tj71anG96sg1Vq60G0qqwgwrp6uYDA82FoTEFWH5PVx0jho4Rdid50kpSI8OTN3GCOsgUP1qecZMvW/+3388csqpSiqfiXyX2m5fo1e2whFFlTOhhoDhg+6+3yaWeH3jV9tAArM94btsns7yfHbNbzs9p2BGdl1m731WiH3UvFFcBO1OUftw+IPJ+qaXi4mrOuKu4vJoTKa31CwPCbnVsMlxFfz89eKF+rHAdrHMb8YrTLsrTnszGabxcTjtYrfjc5arsTG3U+lwoyjjp0ebP0cxTE/HJrFyUE3y4mfLuYcJKu+MvsDG0MB50+t7r9N3jHtwxjWZYbgQSDjz3KdiwLEYCIQKh2u3dOtIWHIAZC1/W7eF9DgdZzjE4QsocU+xizRpuVhSGaDGNqpNxGqrGD2a1Bz0C+DAD+A4UQLcyvNjkCgTE1G6yXpm7hgJ7w2TBfbWIpMKZBI0AYarOmaKA2BZoKiS3CPBnjidgVWYEtzKRPowtqk1soodFseFlvk27VpiBv1lQ6u9nj80wIJKHqEqnujXbvrxtFUbFOCmaThMOnM46fzijLhqKoKfKSwTBmuHWXu/e2GQw71mNRybZ4UljpcNvFgtAVOK864nWjKYqKLK+QUlLVDd04oNsJyfKK2SJlnZUEvjXNbYs1aaX1pRAsVhnrrKRD0Ha3ng8PIboouWUhvMaAkEjZA6TlR7Fy1/nVPbawPQvda5pzMBbCK0TgtrXbN3pGVX9HrY/Reu3ghBLw2yLOcr17rosVIoSP4PnP/FBR1Q2rvGSxznh8vuDJ+YIkLyx3vqzwleL/+OI2X97aZmfQpRP6L+W+fcjwpaLrhZRB40S+jLPGkMQqwHeL0H/rxdWbRF7XnGdryqZhO+4Qet5bH59rdLAaqmZOVh9ieDe1rNdFqHbt5M+PvMASAqUUYehTO9PbxhVOxlhJ9TwrkVISxz5xFFDXDWlW0TQNvidRKiAKPaLQJ/BVK5yhvXdLWgQCJRRdFfKZk1/f9Fmku/A8l1xKIen7EeOwd0VmfbPNxvhUIOh7EXc7YwwbzpNoseGeE6oQQjDwY+7qsSta7Gf6UlqhDbci2VUhO2Hfqvu1nDA711vhETtspZB4rhAMZIAvK8dbkVba/pJSoicVsQoZeF1y7bGq1gghqHVNxqbAUnRVx+2/osFOSqWubOfKKSNeNwxQNg2pcwS3IgrlNdX4jCsSS7L6hEXxF5SM8OUAT8ROTTDEl313E7z2br10X4/zOf86+Y4/zp+ydh3GdW33eSVy/r/zb/nP2aNrvd8GTqGE5BeDA34xuMWn3W163hsUWEHEL0a73O0P+X455feTY+ZOWKLWjSWvej6f9Ib8ZvsWnw/G7MbdK4diO+rwj+N9QuXxp+kJ3y4n3F9MrIBLy9mK+Plol9/s3CJUHqdZQqGb58itVo3JR0nJL0a7hEpxfzFtC591VZHWpbt2BKG03Y6tyJoGfzncbgvQax8DJ8wxCiKSquDP01OO04Q/z05pjMaT8sMUWC2KwYCDmoGw8BwAAsurYlNg3UTR74FQlxK0S2p6psDoOcakSLGP8n5GU3+Lbo7RegamtgWa6KHU53YlvVmgzQpp9nnn4u/GYrMEpCz3Stuu/obkb/lWjVtcUSgHIRRIGlNaAQy0+9mANu55K44hhWcLLNFxRZbtZCkZ4YmI3Ewp9ZJaS/s571CwVLpkXc9Y17MbOjYvDiUUA/YIZHxtkaGbjCK3psaPH034z397yO///SHKkyhPsr074NN723z6+S53P91mMLJKvhsuzkYkKhLCwoXZmGu/+jObpqEoa5K0oG40aV4yGsQ02rBYZTw+nDGdr4mcsXLgW19NT8mWq2V5XA2+p15aYAmhkKKDknZRAmpAIkUf4Ra+jS64MLi/9Ld4jldpaPQEbWYYYztTVhHTfmajZ45rtUCbBFxBL/Ax5BiTYUyAwEOKGCkitPBeWNR9qKgazXKdczhd8r/vP+W33zwhKys8KRh0Iz7fH/PPd27zs1s77A66dMLgB+dfAfjCo+uFz8x2FubYcWJQP/xeflyR1ZVFGlUVofLYjju87bh77WyqTUleH7Es/uBMTS9CtP86lLgj39ow7Wsbk1779FUeh01GAoQIMH5DoLaA0Vt9mY8lhBR0OwHbW126nZCqsoTRjYdVXlTkeYWUgjgKrNO8E74wxnaqwIpi+L7tZoWBh6deLc18rX1zK1vSqSd2sETbzTnZJIeb8LAclg1kbLPN5r3AQibse21evwpzuLw+EsjX38A94T7z8t+LS7+7z1RC4QtDpCKnnKQodUzZ2K6CRrvulW2J970ugbTJ2tDv20LYSbFvpNmNASWtemBjamrdUJmaUpdgYOD1nAKheu250MaQ1hXn+Zp5kZHV9UslwJ8Pe00JJErYwmrTwZKOU6FEjBSbTsK7R0eF7IUDVt2cpMpJ6pzTfEnteG5Dv8PIf57Y/txusynCFbEK+PnggK/6B9yKR3S8V5PVlRDc6Q3473t3iTyffxjvseegcEpIFmXOqrRy0x0voB8E/HJrjy+GY/bjPl3vqslk3w+50xu2z/lSkdUVeVOjhFXOG4URXwzHfD6wndNKN+RNzSfd4SUu30VyFAK7cac1ow2UYhjaAiipSoSx4z+UFp44DCP24x6Rk1cXwio7jaMOnw+2GEcd1lXBKIwZh/GVsxkoxVBEGOCr0Q6LsiBUHjtOdTB+CY78/YVwHZfLe9kApUuM1hizwugV2qxAbxbLNMYkGJOAlhidOIGKzfWcuEeJ0Su7nbt3XHlf995WLKMBNJgcY5YOhuSKsM3uCR8hugiROvJMBe95ofBNQgiJL7vE3g4b4QoAX1Zt0aRNgxQenoyQIkDrksZUVDqh1Cu0qdoOlXTQP2M0oRmiTYUvu/iy284dtgi285B9344rvN5NMKfUa2blUybF45d81825tnPzVdU+nhtXl9Vn7T1F4QkrYqJEQM8bAzcjfvEmoTxJGPr0BzH7B0OWX+zi+QrfV2zv9vnk3g53Pxkz3ukRBN4LPZDexH8ILjpRm26UMZAXNYtVxmKZkaRF64WpHEzQA7QB3TRoByOsnB3MSwssfFtcqQqwoitChEg5QIgIIQJbgKkdpIjc9lt46hOECNgIX7QdbHti3btf7mobhAyQou+6tcZd07ZbJkRgIYSAkDGe+BQlt9vFFinH+KpEytEH6WJKIQh9j14Usj/q8fn+mLKu8T3FsGMLrM/3t9gb9j6a7hVYYY8N169yaJqN0qsnZSuk9LcWZmOT4XK6N4lFYWkDaVXZ4urN0dJtXKPAKkjrx8zzf0ObF/AvhCXNWg+P0qogXZo2NzKw7c3S3TA2ey3x8FQfTw5QMqKj773dN/mIQklBrxfh+4qm2UD7cLmJsMqCjUYIq8yi1EbK092AsIap0ikHep5qsdUvUjd719iUwa/f7hW8tmu+x/X36fXvpYRESM91qXx6pot2HCJzqWjcdOZCGbYk9nEwpOd1Loq3ywWk2IxVe4NvNsUXhlhFxDJCXZLuf1kYY0iqgtM0YVZkFE39hsdAokRA5O3SLmcIgRS+41KEeLKDEO+u7COAW/GQ/3PnZ3w1OCCtS9K64LfTB/x28gBfKv5p9AlfDfZf8z72qFxATkO2wx47Yc8pTr6mwHLdoYEf4UnBVtgh9jzGYYevRjuUjcWRG0OrzLcVRm47H/8ZU8jI89gRHWLlsR11+IetPWpH8hVC4EvbER2GEaMwZhBEHHR6NMZwuztAvUAWWQhBz7djqev73O4OWuhndUk4wsrU28WC7ajDKIhaiXJfKe50B/T8wEqZ64bAbXc5rDefpO+H/Hq8b0U0hCBSPl0/YBh8SCK1eOZhw/IpUjA1Ws/ReooQA6SeYNxKt8HYjpOegWgweorRA3B+TNq9ZgusGUZPAYkREmMWGD1D66kT0Zi2yRgItJlj6soVZdKttJfu948j0XlZSCShGqFEeGXh0RakGw1WW3hthCkMVlUwb6ak9SmNLoi9HWJvx3Kr3IRm5yxtu1g43hW2U1U2K0q9QgiPSG3ZDpd4t7GUNwnnxUOepH94wasbBTNJ7TyS9KUuZ2vC0c69Tnq+3Ubgi4BQ9eh6Y7r+Fg0/TK4QRT5y3CUIPUajDj//1S0rLiElUezT60f0ehFR5F8RpHqX8JQiCn1qJ4gV+B513TBfpiTrouVfhYFHJ7Lol9AZ7hZVTVlaCfO6tpyxl6EohAhQahspO66DZWGjCNeFkiOMsXxLITsIFJ48QPoWQmi3hasd4k1ec/l5A647q/Wcqn5C05wi5Qilti3s1azArPDUAcr7AiX6rVqgr25bjpgrxt53BL5i1IsIfUUvCvjy1g5aa+uv5VllyH4nJA78j84nymCLq0WVsawyLi1TMw5fbCb/Yw+DodA1WVVfmWeuE7Mi49QVWPcGI96wPrsS1+BgGbQpqPWK5rkC60IAQ5ucRqdoU1iSowhcy9hDiI1fh8AYuzKn3eoICAKzTaBKar3CPNMl+zGGlFYyvfMSaVnz7Mpd+7x7TvBBVxVeKQhy0Tp6q7+/6f25vM0Gxui9YBg/q3Z3OU1WQhFI/5IIxaXO3DW/ynUKQI1hVRWcZAmzPKNsrr9yvjkGEp9AbaFE5BLZBlzXd8Ol2Kx6v01cPtbjsGfhoLqxPkZNxaxK+WZ1TCh9vurv89/HX7z2/QS2U9nxQovzlopAvtjH7dlQQnK3N+Ru7ypPZr/zdjC4UFlxjUEQcas7eO3221GHz/qv1nDeeErFns9W+HZwZikU21HnuYLq2diYiMZScq+/xb3X7Nt7C+HbwkV02XSx2pcIHEx1M3dvJMEr21VqDcwNG8K6NSMt7Gtmw+VS7qHta5uEzfGR7O/GvQZCdNhws7RZ2ARddhEmdO8tsLwwgSXNx9gO14fverwshFD4wnaYrgpEXLkztM9dnnek8NCmppEFHX+frnervZ4vtnv+mmt0QWMq0EkLGfRkByXfrcDSpqHSBUXzPE/TcFEslk1Gqa1FhxK+FegQypkry3Zxq3HGy42paEyNLyM6ZoQUklLn/FD+f0HgEQQevX7E/sGH4fMFvqLfDfGUJAg8fE+SpAXVurHzUWSFswa9iH4valWJDeAXFbmq7OXg9t/bGCk/MycL4aPEEBhw0XF6flHlcig1RjG+9MyLxvHlLhZXXq+bUxq9oGnOkTJGyTHaZDRN6uCxfXx1l8uWD0qFKLZfecyqpmktKqpLVhWR8pxNwqu9BC+HrxS+UvSikN3hh/Hoq7VuFxQ3puWBUkSe1y7UXQdFUzufx6wuWVVFeyY6XuAWKy8hym4gl9u8X6Ot52rtTLyt7P9GifFCjfHZz267bkKg3MKFklaVVW0gr6/Z18YYlkXBaba2hbC4viDO8TrheJ1QNDXrqnwul3yTeG2B5ckOg/CfkCJwrdyLMBjK5tw9ZtR6iTYVsXebyLuNkh2kCJ3Kmf1y2pRoU1I2U/L6kErPCdQ2gdp2HKwfXtryQ8SLTvXfYKf2RxHvi+KpjSEpy7fuYNkQSHyHutCt99bGv+YmulfPhnS8NSEEXS+k71lVyFHQZTt8/c1FIFBSOll/74VdoJ/ixxVSDkHdw8j9K912AESIEB2LR/BByjFCDpByxxZBblvP+xlSDC2USO44aXfsxOd9hhA9oLHCFHLMppCTKDwRYLzPkXIbIbcBDXLUwotwgg/2oWnFN+Q24Nv98T4FU16890cZL7wzvHBLT8Z0vD20qQlao9frLE4pfNlDeMJ1tazD5v6aAAAgAElEQVQQhuL6arQvip6/zb3ubxj6e8+9Vpmi5WflzYq8WeHLiKG/T8/fxhMBngjajqM1urdQyGV1yrI6Awwdb8TA3yVWfeR7mPs+1uh1QvZ3BlR144ojyWhQU5a1hf3VFmFhCysLUVOeBAN101DV2nltNtbQeRATOvjiq3Epbxuv+9vLCwUdfHXXQQ4tzFAKH+nFgIdSO2+1L/Mi53idcJYmnGcpszzjy61tvhxtM45jq6anPt4xtCoLjtcJp+uESZZynqd80h/y5dY2+50eoVKE3qtT+FLXrByf2nLgI0ufMNab8U1sU64bmyIqKyrmScZ8nbPOCpK8JCsq8qqmrKwaZqN1W2tb7QLnz+Z7hL5HJ/TpxQG9OGTUjRn1InylXmvgXDYN3y1m/PvpIdoYOp5/7XN9vE54ulqipCSv63ei6762wFKiwzD8R/rBL3n2k4zRJNVfScq/ktdHlM05Bs0w/A3D8Df4cuiKrIsVQ9vpyknrhyzy35HW3xPIMYEaE6gd1N9JgfVT/O2HhQiWnKQJ0zx9+wJL+JZ8/tyE8n6SRIHlFnlYBaKeH9HzQraCLuNrFFgXe/ZTYfW3EkIMUV6fF99tLhJ7Jcco70vsisBVNTolhyjvC/fc5dcESg1R6hP3/83f2teEGiDVgfvsy6+ZZx4vKjDs9kL0Uap76T1+/CPTEzHKi9hwNa/7nQSKQPbwZdf9/+XdrjeJnjem0x3ySfefnnstq1ecFQ84L75nXc9J6xldb4vb8S/Zjb4gkDG+jJHu3Grn91WZguPsrxxlX1PqnK43oueNidXAydf/fUS3E9KJAzYKkgIuugDA5t/L9gxXekbGoF3H4KIzcJ3z/f6vEyE6eOouSu1htJVtlyJASAsJFG3X+81iXuR8N5/y9fSc7+ZTHi3n/D+ffkHfD4k8axnyMRdYSVnycDHnL9MzvptP+W4+5b8d3CFy1iNShC8wE7kaVsE4Z11Z7m7fjyh1TaVrKywm3saQ4dVhBdkM67ziZJ7w9HzB6TzhfLFmvs5YpbbYquqGsm7aW4qUwqpgeh79Tkg/Dhn3O+wMu+yPejQ7mjj0LnUeX77XVdPwYD7lfz35Hm2MVfD1r4dcWBQZZ1nKMAjJ6ur9QgRtyz64UiRtQpsKrXPy+pBGZ4Rqn0Bt0/E/I1Q7KNm91MGyF7flj0REpqAJUqQMqJsFWf0ET/bp+D9+Dtbr4m+RVPixxbU4Ze/pPLQtcsfBOssS5kVOeW159ou42McPDxkVwO14xH8d3yOSPnvR4I18rH6Kv52wnYXrnHsFL+2EvCqZkVy+HVmz6pqirluissbCXSqt6Xg+/SC8ZBZpXnOtbIq6jzfedDlCiLdbfxbiphmzNqRQL+0qFWJN0STMykNC2WU7/ISBv88wOKDjjfCEf6WDpY3GEz6+iRj6t2hMzao6J9cJ0/IpXW8bHb7NgtWPM2wxdIn3+IKs71W3M2NMK23SXiWvvP+9r+7Vi16TWBl2iZYGaaSjl8RcKIi+efT8gNu9PmlVMc8zjtcJ6pIi8btAvz5ExJ7PQbdHVlcsipzDZOWMqMW19z+QioEftUJknpBoo8md4fBNHYGqblimufUGW6VMVimTZcrZwhZWm9fWeUlWVhRlbWGPjb5SYG06WMs0Jw58Jss1x7MVT7oRD09n7Ay6bA86jPsdtnoxg27E8JKhc0utEIJuELAbd4k9n7v9wbW9IE/WCdFyjifl+/fBenUYSj0hKe/jyQ7d4GcMgl8TqDGe7LcXzeWw0puSQI1BgJIxs/y3JNW3eLLPQP/63Xbpp/gpPoKwJG3bwTpN1w4i+PGol1037sRbdFSAEpKt4G+TEPtTfJyR1TXzPCNvahonTJLWNVldsRNbO4VQbTxKflq0+pijNiXL+pzT/Dvudn7NdvApW+EdOmpEIKJWCGsTll/rIYRi4O/gScvTWqZnTIvHbAV3aMzfT4F1U/HxXiX2/EvRwRC6DpziXRZFRlFE4OBk8yLnJF3T9a13548h+kHAveGIyPNYFDnHSeLEla6//5Hy2XIeo8ZYFmTWVDRaU2krpHMTY6KqG84Wax6fzfnuaMp3RxNO5wnroiTNS6rGQVS1NcDW+oKL1YbzhRNCsJIFStpiy/ckgWfhgp3Q55PdEZ8djPlsf4vP9scMOtFz30FJyTiK+Xy4xU6nyy+2djjoXg99c38+xZeKtK7oB+E7UXfeucCq9ZqyOQN2UCIm8HbxhO1cPavgdLFyJjEyxmdEoyxZtajPKL0Z2pTvtktvGY3RLZGwbMmRTSv1uDEkvaxO576VnRpc23Lz8ITEk8oqnUlLkLR+T/JH2cG6LHtZ6caRL90xM03rdK65eoyuiPU7wr508uielBfHZ/NQF7jgH+NxAtu5qnRDUpWsyoJFmbOuSuq36GD90DEMOvR9Kx3+rhYBP8VP8SbRaE3e1KR11RK987qmaGoq/SIltJ/G58ca2jQUTcKqOqcxNZHq2+JKdVDy+Y6naBNsCFQHBARVTK1zVvU5RbP+wUQuPoZ406n4Y76XXu08227WTcRGiCirK4Zh5Hg43pWS7fIMktcV66qibOoWTmm3MQRSEfs+sec5VWJBtckVm5qisTnR5qsoYRVuA6ciG3geZVOzLktyRxXYdKG0MfhS0fH91mdRCUHoeYSehzGwFcV0/YBQqTeS+N8sQlW6odAVlVvk9Vy+9SbiD+0xuzTv5mXNuiiZLFPuH0349uk5948mfHc0YbJMqRrHs7qBsCIXgmWasy5K8rKyXptS0ItDelHQKjgqIdmJu3y5tc1ep8vPRmP2OtcrsIyBtKpYljnDMHqnXv87FVgXw69BU9GYAm0KjIjgdc1Ho9GmpNG5k3evrfzsD9S2rbVmWRYsy5xpnjHNU5ZlwaoqWFf2oiia2hVdtoDYeEZ5rnDylSSQG9WykL4ftvLPozBiGEQMgtehZj/OsJ5OJauqZF5kTPPMeRJZ75/ceQuVTUPtitVNmSWxhZUvlVN1U3T9gJ4fMAgittzx2QpjRlH8oze/q3TDosg5ddDArK6otb6mwfDHFZILE8yfGFU/xYcMKa2cvactIVoAvSBgJOycGqof9zzx9xXG+l+Z2voLOgGL6xRJ2jTUuqI2hVMWbJwi4U/xU9xcTLKMB4spZ2na5nnaLa6Po5hPhyPu9AZEnkfs+aRVyVmWcp6uOc9SJlnqckKIfZ9RGLMVxex1uux1u0yzjPvzCUfJqkW4VFpTNQ3DMOLz4Rb3hsO2MHxTr7QXhTaGUjdkjVUQXNU5npAM/JhREF/xG33TMAamq5Tvjqc8OJ7w4HjK98czpquUpTPEvsmcRxuDaQzTVYY2E5KsZJ7knMxWfHl7hy9v7zDsRgiXk+91uvhS0vGDa/OvAAZhyGfDEXldsxN33mlx4p0d2lr5VVOjKWhMhjKx9a8wL98xTU1jChpjpd0NtQMWv/qEbCTO9aXVhReFcInhZZT6ZWPci/13eP+6Zl5knKQrHq0WPE7mnKQJZ1nKtEhJyoKkKiicbGZjTNuJCaQiVIrIsysQPT9kN+6yF3e51R1wuzvgVrdvcaF+gHBE0+thoT98XKzcXPy/1A3LsuA8T3maLHiSLDhKV5xna86ylJUrRrO6onCF1qbAUkLgCVtc9dxg3446jKOYg06fOz17jLQxRJ6P8Kx31RXQyCVe0Ic8Bs89f+k3c+mJy89ndcWkSDler5gXFuJUvyaRsMo7mlqbVlb2fcZmceDy8XzdONyQpZ/d/sJ2wLTX05XPEuKF1+HHEs+d6w2+3Vx8Z3PptedCXB2non1OPDdg38d3f3b/jRuYF9Pp6/f/4oe4+D5CPLdS/iHPnRKCQCoKKSndSmvXC+gFAX0/JPjgJstX42XHHffj6jG/Oqc+/5/XhHjhr1daGeLSP+K5DX/Y625j6GLQ1iTZ5NSmQJv4mSLrijQDgDNVzql0QW2q1pPwneS9PrJ46Vi6Mo6u5i1Xf3lFXLm+N89dup9uxszlMfaRzdHvLczFSJpkKV9PzvluPqN0KJ0NNPlufwhC0HcL5KHySKqKo2TFg8WMR8s5j5YLBHbeGkUxt3t97vSH+FIyjjvMioyvp+d8PTl3Sn6GrK7J65r9rrVpGEURIAiVdyMSLo3RVNqiAJZVxqxM2Q57bAUhAz8mcNDBTVz3vGtjMBomy5Q/Pzrhdw+OeHw258nZ4rmiSjwzJ13nE65OpfYi0E7RZZZkzJKMk1nC2SLhyfkcgWB/1KcXBZbHJSV7nd61u1aXox+E3BtsoY22+egbv8NFvNMdyqqN9Ym922hTkZYP0KYk9u4Se3dQIrZqMJf8C7QpnEz7hKx+SlY/pdILQu+AwNt5rUx7pTXfr2Y8XM5Yljahf5F4wDiM+Www5pP+kEh5VjXGHSrtCNR5U3OaJhynK1dMrTnLLF9mVmRtdyatS4pLhOsLKBwY0YAjDFZaUzhIS1qXTPOUw/WKb8MJ4zBmt9NlL+6x37GPYWDb1pF3My3xm4x1VZJUJdMibY/LJLerNHN3fJbu+NjC004UlYMMNmZzS8XeJMSm4DKU2nYDF2XOJE95kiwYhTE7sfUF2o277MZdtqMuI9cB/CGm+02xUBt7Xoumab9n4cZP+7O++P+qLJiXOefZmvuLyWu5V+uq4nGyoDGGk3TNn2en77SydJ241enz860dPu2PkLzcT2NSJkyKBG00sQqIVUDHC+l4QXs9lbpmVq6ZlmumRcK0XFPqGl8oIuVzEI+4FY/oeiGB9PA/YnnlPC1ZrzLWq5z1MmO9zMiziiIrqcqGpmnQjTUpFo6UqzyJ53uEsU8UB3R6Ed1+RKcf0elFxN3337U2xqC1IU9LkkVKsshIk5w0KSjykjKvqava4t8bK2kuBMjN/nuKIPTxQ4+4GxJ3Qzq9iN4gpjuIUE4a+kNeiBKndiasL9Jm4WaSp+zGXWfi/MOOpbpqqMuaoqgosooir6iKyspnFzVVaR91ZSWym1q350A7LoIxBqOfAZ674lZIW1hKKey5cg/pzpnnKzzfww8UfuARhD5B5BFGAWHkE8Y+ylN4nvqg5+7ZUMKjo4aMgtvUuuAo+ytpvWDo79P3d1o/rM1SjEbTuC7XojphUZ6wqE4wRjMKDoj+BmXaN2Mkz0qydUG+LijyzZiqqaqrY0lrg9Ya01iYGXqjd70ZPxfjRiqJ5yuUJ/F9Dz/w8EOPIPIJIztvRZ2AMA4IQjuO/h5CG8OqtFD+eZ6hjWEYRYyjmK0wau/5Qlh1uf84OeLz0RZKSmZ5xqPlnJN1wk7c5fPhVkuBiD3fopeimO24gycl21GHX+/ssRN3WgjivLCIKU9Kaq15vFxg+oaeH+DfwNxW6YZVVZDUOY3RhFLRmIZlleNLj57/5vemRhvOFgln8zV/fnTCd8dTjiZLVmnRFmtSWEXADXSv6x6h7xF4Ct9TVtTiEp9scw9rtKZ0CoNZUbHOS9Z5SZKVJHlBo63oUd1oFuscgPtHE/pxSJIVHIz7bA/eni++UZc0xiLT3iXeMYsTeHJA5N0hr5+yrh6QVg/pBV9SB0t8OcKTPaS4OIm1Tmj0iqx+SlJ+S1YfomRMqPat8qB49QmvdMP9+YT/9/ABT5IlsyIlrZ43J/5iOOb/vvMFPT9gFDqyo7vBbOBu8yLnL7Mzfnd+xIPljHNXRGyKhFprGmNP+IZbdNE5A4GVPm2EQeiGXNTIyl5gE3FhjuYJi6/dDm0B8U87B/zT9gGf9EdIIT66AsuAFWfIEu4vJvxpesq3i0kLnSybhurZ47MxkHPH5PKquTWNhNpYzPJaCBYid1jjCx5WLwjo+SGfD7b4xdYuX412uMeIQRDdSLv8jY+D+05F09hJuMpZFAWLImdZ2sfCcawWZc6ysP9fVyVZXZE1FeuqfK08e1qXPFrZjumfpqdE6nqmvO8Sv9m5hS8lt7sDPCFf+nnTYs03qxMq3bDtZNp3METKb6+nUjec5Avur065n5xyf3XCui7oeCFDP+Y3W/essSMDpC/wP1Z5ZQPZumB6suTsaMbJkxmnT2csZ2uW0zXpumgTHemMOv3AJilxJ2Sw1WEw7rJzMGL39oidgxFCCOJO+N6TW60NTa1ZrzJOnsw4eTJlcrJgcrxgOU9JFinZurAJWtm0ibvnK5uQx4Etpvoxo50+2/sDtg+G7N/ZIozt/LQx9/5QIRyXVSIs1MVdh0lVtLAdi5H/4aIq67aoXc7WLOcp61VGuspZr3LSJCdLCvKspEgrysI+qnJTcDWO9K3bboXYJMiugJdSoDxbQNkiyv4MXVIcdQI6XVvI94Yx3UHMYNRhsNWlbzqEceD8jn64I6WET+wNGfm3qUzGUfY1i/KY7fAeY50QyA6h7LTS65qaokkp9Zrz4hHnxUNKnTnvrAPrg/WxziNvEcbYAitPSxaThOnZkvn5iuXcjqssKUjXuS280pIiLamd/1VT28LdLpxwtSD3FH6g8AKvLbjjTkjcC+n2InqjDv1hh+FOj9F2j8FWFyHiv5sCqzHGCkisV8zyHG0MozDi5+NtfjneZV2VpFXFYbLkm9mEb9IJnpTsxl1XYC2Y5imfD7f4v25/4u5zVmTBkxueueXfj6OY2Nvjy9F2mxsdr1ccJivmRU7dNDxeLegGAQe9/o18v1LXJFXOqiqQAgLlWTqMzi06oOm2dJdrHzOtOZ0l/PnxqS2wjiYcTZdUjW7nLykEceCzM+hysNVnd9hld9hj0I3oRQGd0Mfz5JUiUmtD1TRUTUOS2aJquko5W6w5myccz1bkVdXmZVXTsFznpEVFP54ghaBuNGHgvWOBJRBKgXn3Tu47d7ACtUMv+DlS+KTVYyo9p2jOoeTCaPiSbG9jcrTJqfScWq+QwiNUe3T8u8T+Jyj56paeNoZVVXCcJjxO5pxna5LqeWEMJQTHoxXTIiVQin4Qtt2HRZnzOJnzeLXgL7Mz/jw95UmyYFnmrF7wXi+LyxA698tLt/ULybLIOc/XCGE7cfMy57P+iDu95hLu9sMr3GwgXkVTsyxtAfE4mfM4WfBgMeWbxTkPl3OSqmBVlm+Mfr98nPRlzMOlxo4AwsLyszYr1euqZFHmJFXJOIwZhTGx51/Lwfxto9abblXNJE+Z5ikLBw9NqpKkLBwcsnTHw/6+ctusyoK8sZ285pok7MYY1/V8fqHgfcVu3GVVlbYofsWhXFQpj9cTatOghKDvx07e1Ulmm4Z5mfI4nfLnxSHTMmk7ykVTsURwki94kJzRaMMdIYnVy/HQWmtm5wnz8xV5WtLUTZs4vDKEoDeI2d4fMhx37cQoXj1B6kZT15qqrFnN16xmKefHc04PZ5wdzZkc2wJltchIFil5WrYryFIJhJT4vsIPbbLbH3boDWNmpysmxwu2D+bsHIzYORjSH3XojzqEke9Wkt89OWzqxq5wZyXL2ZrFbM3keMHJ0xlnhzNmZ/Y4JouUNMnJ07Jd/UZsCixp9z/0iXu24zYYdzk/7jE+HDA5ssdjMOrS3+rS7UfEnZCoc31M+9uGXXxRLSfTwrKxHm3y/YoFbbpKTaNdUVTbzlRRu99ryqIiWxdk64L1MmO1cMVVUrTPtwlxXlFmrrPlxpBNjF0nork6q8pN50oJpLRdK8/38H2bLPuBarsPm0Ir7tiuY6cf0e3H9IcxvWFsO5K9sO1qBZFvC7M4QHmqXSx4n+GJgKG/z0H8FYvqmHl5RKlzltUptSnwRIh/xWi4oTIltTMornWJLyNG/gGj4DZ9bwclrpe+aK1ZTNcspwl5WlKWNU31JhBsgR8oxvtDdvaHKF+2HaI3CeMgTsaY9rrNs5I8tR2rTVG+nK1ZTBIWszXJ8mLuydOLsVRkFU3jOqK1pmkazKaDxaVx40nX5bQd6iD0CN1Yibuh7bRfLsi3OvQHHXqDmNCNkU0RH0Q+Usp2bN50GGPIXTd4lRYsk5w0v8jHwsCZz8YBw17MoPfunqna3XunWUZWV3hS0vUDxlGHvU6XvLFeSKuqIK9rjtYrJlna8s5Lh07pBwEH3V6r8PcsfN4u1NYkVUlWVa0oWlZb9MsGAaO13e6muEvSzaGelDS6odBNS59pnhNse3U0TlZ9nZcczVZ88/SMh6czJsuUvKxRShL5HqNezLgfszvssb/VZ3+r30qr9+OQTugTBR6eUniXjK61MdSNpm4a1kVFmpfM1zn7q5TJcs3etMfeqMd0lTJdZbab1WiyouJ0nuBJQScMOBj3ub09wFNWNO1Nx6oQwqJzbmCIv2MHSxKpfWTgWVNh0SOrH9PoNevqO7SpwWjLx3JhvTsUUoQo2SVSd+j5X9L1f0bo7ePLm6ncK6NZVQXTPKXvh+0AP03XPE7m/O78mN9NjjjLLEFxVRXtxfI+otHGqWFp/jI74zRb83S9YL59QNk0HHT7HHQ8fgjEy2YCWJUF387P+WYx4cFyyoPFrPVw2hyf90UtNtAqgx2vV2R1xXG64tFqzv3elF+Nd/mH8T77cc86kL+nA1XrhnmRMclT/jA54feTY86ydYvJrpzC5IWSovt/c/Fzozr5txCrKucwm2GA/WiIJyXS+e+UuiGpc86KJd8n5/xx8YTtsM/PensEUpE1FYWuWNcFf1kcUWtN34/YfoVZcdNontw/4Y//+oDz4wVZWlDmryk8Hd/p3i8O+K//4+f0hrFNGl8zsda1Jk8LVvOU7/58yHd/PnSFycquGq8L8tR2fcqibleJN7AuhE2M66qhzOt29fn8eEEUB/SGMaPtHuO9AZ/98haf/+I2470+nV58IwVWVTbMJwnTkyUPvznm4V+POT+es5pbiOAmgbsMKzIOVrSBCFbGQtaqoibPKpJFyvx8xUnsE3VCev2I7iDmzue73Plij1ufbrN/d+uDFFielESeR1ApQICBvh+y5ZAAUSvRfvOxKXqKvGQxcQnvNLGJuutoLudrl/iWrivlIIHuWNdVQ1M11PVLoIGXpYqNuVifE6Ab7PjSAiE0tRRUVUMhbeIs1QaeqlqIZ9ut2EAGXUJtO5MRw+0eo50+490BO7eG7ByMLiXO7/fG48uIreA2gezQKQf4MmJdTymahKQ6R6MdF+tSkSAkQkgCGdP1xgz8XbbDT9kO79Lxtl6oPvii0I3m6OE5X//nI84O56zma9KkuPa+CwG9YYd//p8/p/c/f06sIldkvPlx2MD6lrM109MlZ8dzzp7OOD9esJqnrOapK6LKtpCvytqOoWfGkr2WLyCml5YyaRrRjuHNglCRlW1XawMv3XS3NtDSKLZFV7cf2cWhW0N2bo3YvTVia7ePH3hI/0Wm9+8eWhtWSc75POH7wynfPDzj6GzRvj4adBgPO9zdH/GLz/ZupMAyLi9cVQW10USeRz8IWuixLxXCEwTSozaapCzbhdbaaKcqCKHnvTSR3/C4TtM138wmnKyTtru1LArmRU7VNPhKEnn+jeYOofQYBh0KXTMt1szLjI4X0FEBvlQocf3OdtNo0qJilmQcThZ8ezThaLIkLUqEFES+Rxz6fHl7m3+4t88nuyO2eh1GvZgo8IgcPNDzFJ6bxy60COz8t0FC9WMr/rE3asirijSvmCUps1XGX5+e8adHpzw5X5AVJU1Zs0xzGq0ZdCM+vzVmnuT04gAVBT8I+mkT7wwRDNQYX22hZMfip4UkrR5SVhNqvaLWKYaLBEmJGCU7DhK4S8f/jF7wc3rBVygR86xv1ttGrTVJVTDJU8ZRh7yp287MX2Zn/Mf5If968qRdLXjf6bDmgveVVAVPkgXzIgODk26HURhdkXp/n3GZ2Ljp7B2nCV/Pz/nfp095sJzx/XLGuv5wsvmNMTSmYVpkTIuMw/WSkzTh0WpBYzR9P8SXkr4f0pMWriS4WUJurW1hfpom/Gl6wv86fMDhenVJyOHvK9Z1wWm+crK0NYGblEFQ6Ip5mXKSLzjK5jxN5+xFQz7v7TIMOi0fa1IkHGenRMrny/7eKz/PNIbTpzP+9G8PeHz/lNXcQtteGwJWi5Q7n+3y+a9u4/sKGbx4etNaO75Swex8xdnTOd/+/gm/+5f7nB/PSeYpefbqcb8hoevGQnugguTqNr5LbgfjLkVe4fseWmu290F5su0cvOn43SRbq/ma0ycznjw45et/f8hf/uMRk5NFW1C9OlxC76CFdoa++p03EELlKSYnC9arnMqtVMbdsE3kW2PqG56zNnYXQgiLy9cNXafONQhC/HcsCloxH2PQjU18N0X0pqheJxnnR3POjhZMjuacHy8s9PJkyfR0SZlbyJ/WNzg7XBFZufy+b2dU3h1EbXd3784WB59sk65zmlrTH3Xo9iPCOGjPdcv/usHz6YmAvr9Dz99GCoVAIoVipg/J9ZpKZ5Q6bwUvpCusfBnRUUOGwT7b4afshp8xDu84rtb1cgXdGM6PF/z1d4955BYhlrP0+jsvYLw7YLw34Ff/fI8g9BG+gGt2/XRjC6K6amw3NK84eTLl8OE5Tx+c8fj+KYffn7UFVlPfgKz1Bq7/hn+mPEnUCYm7AXc+27ULK/OUqrDdlY7rhvqBZ7ufl47Bu44XYwzrvGQyX/Pd43N++8dHfPPorH39YKfPnb0RZVWzN76ZhXjDBWpFG+NUjr2WGySFsPY6UrR0gdIhXIwxeEqC8Ow8Bc/p5xugajR5U3GWrfluMePRYk7H8+n4PuuqIqkKQNDzAwLlvQoI9cYRKo+BH1HqmnVlOVJSCAKlLgqsa563qtEkWcH5xvz3fMFslWIMBJ6i3wnZ7nf46s4O/+2ru3x+MKYbBnSid1+Ma7RuuVhR6JOWFXlZMVk5qXj32njQ4XSeMFmlCAFx+GJCwiYHYJNvv6cO/g0w6W2S68k+Hf8eSnbpePeowhmNLjCmxNCwWV0RIkCKAE/2CdQWvtwiVDtIAjdh3swXrXXDqio5z1KGwZpBEHKYrPj3s0P+OD3hSbJoOzk1aasAACAASURBVCYfOnHedIwWZc438/PWH2kQROzEXbpeQOS9f4WsjVDH4XrJ/cWUb+bnfD075/5iyrRI37uS3eui0YZlafkWf5qeUDYNR+mKX452+dlou+Vu3eSl4XJOamN9zzYrzH+PxRXY1bdSV4TSJ5AePS8mlB4SQVLlPEmnPEmnCODT7phPu9t82t1mK+iyHfaYlWv+MH/Cw/U5qyp7oSDNjYTjMGTrgmSZ0elFNllUz4+OIqvI04Ljx1O++9MhD/5yyOH350xPF2RJTl3fzD7qWpOntmj57k+HZEnBvZ8f8PmvbnP3i71WQOJNE5PldM350ZyjR5O2c3V2OGM1Ty35/TqQymuEMRYiZ4xNUA2wXmUspwnT0yUHn25z69Ntojh4Lyvam6Jqs1B2sk6c74mk4/vXhuC+Mgy2kFpmJMuM5XTNYpq0ye7K8ddWi+w5blWZV9R181LF0Y8hjDH2+61yjIE8K5mdrTh8eM5fx49d4dBne992Krb3h47rpW68YN6sVXe9EXCPjjdkO/iUvFnRmMrJtm/yBIESPp4IiNWA2BvQUSNib+CKqw+4Km1sQlZkJckiI4h8Oj2B8q5X4GVpyWq+Zna+4tTxOqenS6ZnS2bnKxaThNXMLurcaKH+FqG1oSqsovPp4Ywir5ieLnl8/5Tx3oDd2yP2bm8x3h+wvTegO4h/1IqDQuC6VhFpVZLXtUPrWN70BqlSNg2elPSCwFnMhCwLCxu0ysnNC3ME45BBkyxlkRdIYBzH3O4NuNMbMMlSjtYr0qp8L4vqgVT0fbtwH0qPnajfLtp0vRDvDYRi8rLmdJ7w/fGU6Spt75NSCLpRwM9u2c7VV7d32Bv1iAPfiuvcQAgEgacgCvhkd0hZ3aEbBvzx4QmLJG/ztLyoOJ2veHQ6w5OCca/DiyqsoqjJMtt5i6OAKHo/nMMbKbBA4MsBnuwSe3cxNBjnVUErqeq2FpuVJ4kQCoFqf97kXbrSmqS0N+ZBENLzA+4vJ/z72SG/Oz9yRsI/nJeGARZFTlZVnGdrBkHEnd4QXyoCqYhu4tS8bh+c8MTT9ZJ/PXnC7yfHHK6XHK9Xrpv0wxo51g7muRGKOFwvOc/XhFJxuzcAz7cqLzc4MW2K31o7tci/4+IKXIHV1HhCuQIrIlQWDpHUFwUWQvBJxxZXn3S32Qn75I3tcD1aT1jXBasqf69F++UCy/MU8UtgbEVesZylPH1wxu//5T5/+NfvWjjdBnpzE9E0uuVMZEnBk/unTM9WIARRJ0AIQacX8aZN++VszcNvjvn2D0+4/6enfPenw7arddMJmoW0weRkwXySMDlaMDtbMT1doRvN9t6AMPbfS8LbOGGLpCqZZCnH6QolnUJXULfz91t/suPDVHnFYrrm7HDG0+/POXxwxunhjPOjOfNJckW1zbiVz83vH3Ft1UZVVNRlTZrkTE+XrXKkUpK9u1vc+mSbT7864Of/5RM7Ho3B8+Qbj8vXh8UcdL0RsRqguWu9sRw88Ipcu6BFxMj2p2q7Xx86tDYUWcVqkdLpRYRRANcUYMvTgsnJgsffnvL1fz7ir//5iPXScvXKompFTox+gWXEBw6jDVVZUVU1RVYxOV5YCGHg0Rt0LNT5l7f4/Fe3ieKAuBch5Y9X1l0iiJTHIAwpHQddlLTKv5XWpI5r5QlJz/l39oIAJaQtyEqrovyiM7ehXhytVyyKHCEE4yjmZ6Mx/7izx+PlgkApTtOEvK6d+vLNhS89PKnoeiE7YR9tNMsqZ1FlBI7fet0oqoqTecL3JzOmq4y62XSbBZ3Q54tb2/yPX3/OzqDDqBsTBf6NpWZCQOB7+J7ik90Rg05ENwqYJRl/eXwK2t4vstLysR6dzhj34peaHOdFxWKZ2blQyo+zwLp6Ubki6dJT5sKI5dm/vEQC1GiTU5sEKTykiBC8+5etdMO8yHm6XlLphlmR8yRZcJyuWNfVc10JT8jWQK7r2VWK2LPt4kB5KCFcO9XeJgxOUtLoVp57XVUXxsTOePdVl0vj5OIXZc7D1Yz/PD+i0Q2hUvQuGaO9j8mr1A2nacJJlvDn6Sn3FxMOkyXz8vVdBl8qIqXssXITTqR8Is9zbWd7rDY8Qe26QbW2yXqpG9aVlbJfV+UrBR60E8ZIqpLGGB4uZ/whOiFQinv9Le71t+j4/o1BBTc+FoFUdH2fYRC/Vmb92diIeTRO6abSL17duvhMgSftMduYVr/vG1Y/CK1Rq3h1aiyFlVK1UtlQmwbhEoFFlXGcLzjPEw7iIbe6Iw6iIT0vJJQeBgiVj0RQa+sp8j4TiKZuyNY5yTwl7gQYc6EkZFX2rGLb8eMJD78+5ts/PuHw4Tmr+Zqm0TcDzXkmjLHmiJZTUXH6dMa3f3iCMYYvf10RxT5RN8R/jfBFXTe2kzLP+P7rI+7/6Snff33M+dH8ehDKd4wNmX61SDl5MkM3ulWs2/9kzHDcpduPb/QzN2PPkrQtUdtglbHsNXX9sbQpiKqyaTtRySpjvcxtR+5sxexs6SCASxaTFYvpmjTJW77UjzWMKyTRhoarRYzyJLq2x6XISqanS3ZvW85Nf6tLpxfZDuU7xlUPSnf/NwKNNR/WG672ZSIaIF6gwCOQ+DLEl5FbmH3/YbShyEpW85T+qEt3+OKxvuFD1bXlRy4mCcePpxx+f8bT7895+t0p58eL9wMtvaGwaZsVMaK2XM9SWYGXIPJo6sZyVxcptz7dZntvwHh/6Ip29d4FU16976ZdHF4VBYui4OFybnObIucwWdIPAtK6YhzF9IIAg2E37lI2DbM8Y1EUfL+Y0WjddqiWZUE/CPnV9i63+wO6fsAgDNnt2HvMJE/57fFTPAc586Wy+ZBSpFVFpDyUFGRVRVbXPFktiDyPSZayLHKKunHFgHCLmg3TPGOR5xytVzxZLZgVGcdrn+8WMyrdMI6tkXHPD+gGwQuLpbQuWdXWi3MT8yJlVqb2Pq18hlxv3i7rhnmScTJbsUpzGm0IPY9OFLA77LlHl34cEvg3Ow7aPMWpEwpE+3m7w24LESyrhlmScTpPWGXlS/lsVdWwTguEk5P3/Q002grEKMcRe9f4AE6Nrz7IBk2t11R6hpLWeVmKdy+wyqZhVmRoDOfZmkhNWZTWc+BFB91XilEYsx11uNUdcKvTZzvqsBVGDMLImQl7LT9qIxtc6Jp5kTMvMo7TFY9XCw7XS6a5LVRetyJhEwbN42SBxhK7b3UH3OoO3isIomgaHq7m/G5y/P+z96ZPbmRZlt/vPd/d4dgCsXNLJrOWrprW9KhlMslMpj9dJjOZbCSNzXRPdVXnnlwiGCt2wHd/Tx+eAwwyGWREEFyqu45ZEElmAHA4fHn3nnPP4S+jc57NJwyzhEK921IcwG/21SCI2I9iDqI2fT+k75mT3bPMhUU2g/SrwiqtqsbePOcsWXDWZJCdJnOyquS6chwaA4xSc5LM+efLE2Zlxv+695DtIMK37V+F5t4VK821bxvnya0gvPVrrDLRTCGZU5XvLiwsIXAtG99yCGzbXIw/sptkzwvwLcf0gt+x41Y3C0uYC39el2ZoVyhmRcp5OmNcLPmqtc3j1g47fhu3GT4XzY/GyFEVt3Mtui2qsiZZGNOKdi96PVBcmbmaPCs5+vmcf/7PP/Ls+1NG5zNj/vCR1zmrRe50OOfHf3nBcpZg2xZbO206GmTsv7PAqsua4emUo58v+OFfjvjxX454+fTykxRXV1HkJZPLGUVWEMY+jmNR5CXWb/c3XmBZQuBJi8CyiRwT4m4J0cRDGPbopue8VoqqVCSLbG1jf/piyOmLIeOLOYuZKbby9KrBQGnc/b68NfBmoCGZZ1RlzWKWcv5yzI9/PubrPxzy9R8OOXw0YOewv5EC6yrUKmxYZRR1QqEyU2TxetEsrvx5FQJJy+5jCfeTZWEppclSw3z3tnPqa2TEJstHkaclL59e8tNfjjn66ZyXTy+5PJ2wnBurdVX/9RghraTCRVZy/nLMfJowuphx8nzIvcfb/PY/PiRo+Xi+g/QFfGTDlHduK69mqk6XC36ejPlpYgy7humSZzOLUtUM04TdqMVOGNEPQnajFklVcDSTTPMl348qnk4n6wZp7Hrst2L2opj9VkzLden5AffjDhrN+XLJ8XyGLQwj0nLcdQEUOS4dz2eUpSzKgpeLGXldcZkmlLXZ1lorLCFwpLFRz+qKJCv5pdn+n8YjLpKFufdqxSRP2Q0jdqMWB602rmW/tcCalynPkxHjfLneP5MiZVIk7PgxXS9kP+jcaN+WlbFFP58sWKQFtVJEvks/DtnttejHAXHg4Tk28iOuX2xLEngO7dBj0I446Lc5nyzIy4qi2cbL6ZJl9u4CK1kWaK3xXMOMrXIGHcdCOBYbqK8+boF1ky681jWFGpGUT3GtAdLxsLm7h/0KK5OLUr1aPBWqJq9fMSUCCGxz4+77IQdRm4Oozb1Wh8NWm50gou+HdFwfv2GzpDAKcIUpsLK6YpQljPKU48WUjusTux4vFzNsKYydZ23kLNehVorLdElaleyHMcOthLQq1/kJm0SlVMPupabAujzl2dy4Bb7L0GIVnhfYDjtBxG7Y4iBqc7/V4V7cYduPGAQRLcfDt2xcy1oXo2UT1pdUJZPcZEadLGe8XM7ozn1Cx8G3bBZlwbIqqd4yG7cywJjkKUppFmXObhDzVbuPJeXG5tZWuWRt12c/avNNJ2cnSG/1GkVdk1Qli7LgLJmTVhVKX8+C2VLSdjy6nrkg97xg49/7m3gYd2l7/nuzjTzpEDuB0ZKXKS+SkWHahOQ0mzIvU5RWxLbPvbBPzw1xpWWyz5pjTaHXx8LHZOZMgZUxnybkWfka61CWNdORmYN48dM5v3z7ktPnQ8qi+qRd5GSRkSYFeVqyvd9j97CHUhrbNXbv8Pp10zBrNct5xunRiB//fMTT7044eWYKg0+NulImvLhZQEopsV2b7iCmO4jX0rONsMkrK3kp8SyjLpCIxr1TvdfRdBVcqZVez1eNzmcc/XLO8S+XvHx6wctnl0wu5+sw139vWNnOL2cpo/MZjms3lt+qsTI3boWu7+B5DuKOXWmlFUqX1Loiredk9ZxMLcjrJXmdmOJKv5vpX8ESNgJBYLdhA2qXm0Arw0LPJwnpIqMuX93Pr5ql5I0T5/hiztNvT/j+n55z/PSS8+MR88ktjDW+MGitGxY9ZTE1AeyTS9OYcFyHqB3Qa64BfuiaHK6PfA+7dlub2fJSKdKqpFQ1vmUzCEOCJnPUrAUNE+5KScfz6XkBvSBgURZGmlzkzRy2oicDtsOIx90ekeOuZYWHcRuF5mQxZ7xIjTFP87l92yZyXLpe8/q+T9v1mDTbsCxL00SyLGzprFmv0DYMTaUUWVWSVxWOZdEPQlqOa9xfm7mwvF6Nurz9zDEy64r0yro3r0vyuqRQhjm+KapasWis09PCqMA8x6Yb+Wy1I+LQx2tkfB8TlpRYEkLPoRv5bHdbJHnJcJ68to1ZcT1DrJtA46pSLJNiHYVh2ZLAd5DS28j82CdgsN4NTUlavmCc/Rci5zFuY3rxoVgxTGsGSTd2mc3fVzK2w1aHrzt9HsY9DpsCq+16tF2fyDEFhW/Z2NJ0JtbOdQhcyyzIhR8S2g5t1zOL8u6An6ZDfpoOeT6f8mIxYZJn79gHuhmSLBjnacPsLOg1J/0mkVYlwyzh+XzC09mYp7MRl1nyzjBc0eiUH8ZdHsY9HsRdHsRd9sIWbden43nG+tN2cC276eKIdd6CIw39upL7tF2Prutzr9XhcXuLk2TOy+WMHydmn02L7NqitFKKZVUgM8HT+Zg/DU8pVM3DuItvvztD7SawG5dCS5gQ5L2wRVbdbuG1rApGmfke/zQUTXj19QWWb9vshC0etXs8jLs8invrG8HHgmkoxFjvCBkGiB2fg6DLKF/yPBlxkc+RmOeMCtMV2/E7bHktem5EaBtteqlrktrIE2pV40obV9rIjzg/UVU16SJnMUnI0+I1BitLco5+OuOHPx3x/PtTFitDiE8s0Vk59+VpwfHTC1zfpigqwtinFQe/atiXecVilnB5MuHFj+f88C9HnB+PPzlz9SaU0kyHC7TWtNoBu/f69LZjk8PU8jeiva+VkcpUWmFJ43y1yusr6vpaff0KWpsg4CIrOfrp3LjI/XjKdLhgMnxlZFFk5UeRh/41QWvznVZlzfnRuGG1Xhl67B722LnXx74jO6F0SVJPSaopw/w5l/lzknpCpQoqXd5KfeBIH0d69NwDkJu9P14HUzwVzKcmcPxNIxxVG5ZndD7j5399ydNvX/Lip3Ne/HzObLQkf1/UxF8ZyqIyrOfRmG+dZ8wnCU/+eI8n/+EeW7udJnPr0xdYgsaV2RbsRSbS5TBusyzNOIJvG6VI6DhraV3H9bCEYCsI+X1/m4NWm1oZa/VVsdZyXbbDiLhxLxXCuP4dttq0HJd7cZtFUSBoHDAti9BxiGyHqDHGuB93saXFb7e28aSF20j0V017KY1ras83LqmrJvVO1GLZ2MO71qsiLHJcM8bg+dfOUrUdnwfRFgP/levitEiYFCmx49N2bn7+1EpTVBVZXlJWhrhwLEnku7Sb4upTjuJJKQk8l27kc+45WFJQlIqirMmKch18/DbYjkXgu6SZmZEuy9o0BYSg0wlwHQt/A2Hbn73AUrogrY6YZP8fWlfE7u8387poM0v0loXt6iSwpeSw1eYfd+7xx61d7rU6HNxCmmcJY0gRXlkMayCpSvbCFh3XRwrJJE/fU2CZjkqhakaZGeY+S+Y4UtL1go1KBdOq5DxZrIurp7Pxa/rcN2H2lcCzbB7EXf6n3Xv8trfNk84W20F0o22TUmAj8S2b2Hk1GayBpCy4zIyTjm/ZTPKUoimuqreYzK5CeQtV82w+JrQdbCnpej474QYKLCGbAttjL2zdSdA2yVOOFzN+no0YZgnfjS+A62+wvmWzG7b4prvF/7C1z98P9ondG05QfwBu8t3Fts9B0COtSl4sh5xlr3JJQtujbQfs+G0GfkzPDdfSxqwuSeuceZlSa4UnbTxpf9RMirqsSZb5KwbraoG1LHjx0zn/7f/6nuHZlPk0uYGV+ceB1kZudPyLsWYOIp+HT3bRB9q0b67soqIwsqSzl2Oe/3TGj396QTLPP/8wvNZmxmS0pNUOuf9kl737W0gpCSOPTRgWVdrIZyqlm0WLbSySq/q1eI1r30lryqIiWea8+Pmc//J//iv/+l+fGtOKqr5ej/zvFFqZuZvzY+N0Nx0uydOCqqywHYvBfhfu2NWtdUVSTZmUJxwlf+b58p+ZV5frzvvKwOIm8GREzz2gCj9d0aKUIkvLdWzEmwW5Uoqqqhmdz/j2vz3jn//vH5gMF0yG83+TxXtZ1JRFTZYUzCZLnn1/Ql0rejsxUexjWRK8z7O8tKXEBvaiFnvR9ffwN68bfT+g7wfXuAb8GqbAcTloxTd6Ttv1uN9+uxzvba8f47IdhDfe/rchdnxi5/W8sGmZMi1SLCl/9f/eBaU1ZVWTrooXrXFsiyjwiEMP39msUd37YElJ4Dp0ooDANSHYtdYUVU1WVFR1zXX6btu2CAKXsqxNkXVVvSCgvSG5+2cvsMDIBJUu0VRw6+SG20EAoe3wsG2YmD/2d3nS3WI3jGk57gdbZQrAlZLdMF6bWMyKzDjiFTmL8t35OklVctYwOh33w4P04JXpgtKaYZbw7cTkgL1czqneQxF3vICDKOZh3OPvB3v8pjtgP4wJbWcj+8qxDKOltOYP/V2kEHw/ueSHyaXZvmbe4k0orRmmCT/KoSmGopi+HxI0UqK7SpTefN5dXmUlhbvNVNiKFTX5M3z0HLSbou+1+Cbew7dc2k5Az42MwYvW9NyQbb/NYdBjz+++JgHUrIaNNV035OvWLvfCPpH98QpHw2Bla1ZCa9augifPh5y/HDM6N3lOn3vRoxvb5zmC0fmM06MRrW5Iqx0Qxv7a4W4+Tnj2/Qnf//cXnB+NKIsvyxZca81ilnD0yzmtTsBjDuhutTYyhpGUJZdpwmW6ZNFYJ9dvutK+6wWEwHFtwsgjbHmELZ8g9EiT/LMV139NWM5TXj69NIPgnoMfuPQGMXE3xLvlXFapc6blGS/Tbyl1Rsfdpevu49ttPBmtnQJvctWzhceu/wRHfvwm1Aprk4uxKbBW9vwrU4vTFyNOnjUzVz+fMx0tSJP8izSx2CR0Y+ueaDj+5Zw//Wef5Szj4Te77D8c3Dnr76542/vc9p3vsqU3fc7HfO23oVBGHpjXxnQtV9U6Yy8Qzu1moo1Pzq+ia6QQWB9Z/v82GGOz1Xqr2U/6lama0tf30FbPBSPDL8saz7PxfQffd0yDYAP4AgosjaYpsPTtnKHuAiEEoePypDPgf91/wMN2j/utDn0vwLE2ox21pcVOENF2PZKq5DJLzHAjs/cWWMuy4CxZcLyYchi1eU+P9sZQjSvQMFvy3fiCf7o8YZKl770BdD2f3/d2+PvBPt90t3jS2SJqjCw2AUdKWo6Ha5lE9J3QzHEtSyOzy6mo35LrsyoWl2VBx/V41O5xEMX0vRDftj9tTsq/YWy5LULLpeuEdJyAvhetB223vTb3wj67fpu2E7y2z7U2Ei+lFV034utYsB90ad2iY3ZbXDW5yJtMmSwpuDyZ8PLZJRfHE0bnc2NpvqGsq7tiZftcFqbrfXY0otNvIaQgjP31/JDpDp/y7X97yvBs9tm3+21YzFKOf77AdR26Wy0e/maPt4aP3BLLquAiXZjrZ5FTqPq1G/v77udCYAJRLUkUG8fDoOVRVfU6n+xvuB7JPOPkmTFS8UOXIPKpqxrHc25dYFUqZ1qecpJ8R2h36br7dJw9+t49Os7e+tpxk+u2EBLfauHIj3cteROqKbBmawbLMKC6Ceo+fTHkT//PT/zy7UtOng+ZjZcbjXz4UqGUYYmrqub4l0uytCRLC4LIY/ughw2Gmfzb7fizIK8rpo2pxaxMmZYZbcen7Zi4ldv16prC6oobmZE48kmL6DUEa4nlq8buKyfPdzYim0a2xpy/ZVkThi5haDKxbppx9z68d5WsdEFRDynq4UfpnJZqSladoHTWMFgf74LkW2bo8CCKedzp8bveDjtBRM8PNjrzIpsiLnRcDqI2j9t9ZkVOUpWcLN89mJ7VFcMs4SJdsiwLNlFfGSleybzMOE0W66yrlQHB2+BZxs1uP4z5utPn9/1t9sOYnh/cKjvhfTDSH0PrbwctWo5n7PUXU6Z5xnm6JE8Xb93KrK7I6oqzZMGL+ZTdMEYi6HoBn9Ep9t8UfMsxVuuN7X5ku2sb3L4bsRt06LkRb/aeLSnxLYe2ExBYLn03oudFhNZmHcmuoi4bm/ZpQp6WaKVYNuzV0U/njM5nZOnNFtZCgJCm+6pXuUcbvv7VtaKuFdPRgpfPhsTdkDD22d7vkiY5ySLn4uWE0xcjzo7GZEmBqm++DaK5AdF0+FbdvU0v+rKk4PJ0ihe6fHW5T5YWZubSlh806G4LiWfbxI6xIG5dkXv3vAC3yWO7DkIILEs0BZbPYNcEpapasZimXwwTKJrFyfr7gvVCRn+E7+umuJr/dfzzhXGJk4JWOySI3GYo/Gb3glrXZPWCWXlOZPfouHtse1/Rd+/RcXfXv/elNsbWBhaThHSRN4uyisU0ZT5ZcvTTOU+/O+H4lwtmk4TiIximiKbtvl5QrhaJ+vVF5ac+rJWhNZiOFhR5SRB57N3r09+J6fRbdPqtO8/u/Q0fhlxVzMqMcZGwKDPmlQk7NmMfDrF+XRHxziJJGPtySwqUFgjVzG3WirJS752J3TTW7paVacJr3TBajWGFlNdfTepakecVZVFRK4UQDQlRKeMc+8b9/q7F43sLrEolzPI/M87+C0pvXvOsdMai/JFKLdH6es3kJtByXO61OnzTHfAg7rIbtogdd+368jHQcX0et/ssK+Mo9z4Udc20yBhnKek7ZqNuA601kyLlaDHjeDljmmcUjVPf2yAweuHtIOJRu8ejhuWLHO+jzdAYaaWFdAT7Uczv+ztUWvHn4RnDbPlOu/t5WfB8PqHj+bQclwdx76Ns479XCCCwHLa9mJbtmYF4NL7lENnGEOTNS5kjLbpuiG85TSaYMsPF9scrsKpKkS5y5pOUPDMM1mrx8+yHUyajxc1eqCmuHNfkY1SVoirr5iL+Dt3BHTGfJrx8ekEU++wc9oyd+2jJ2dGI418uGF3MSBama36bokBKiWyKHCkFaKjKauNhz0VWMhsvCc5cpsMFi2mKlAI/cD+owOp4PpaU5KG5CV69BrQcl+gWx1LUDth/OGA+TcmSgvPj8ee3X28KqlV+kGVJpGUWz3WlqOt6nc/2OZmQsqg4Ox5R5CWu7zDY69DqBviBd+MCCxSVKilUhiN9Os4uHWcHz7p9DMbngFq5CE6FkQiWhgU9eXbJ8x/PePr9ibEwnySU+ebXSUIYEwRpCSzbHCtCCoQU6FqbY6VS66bN55gvrIqaVOcMT6f88t0Jjmfz1e8OiGIf2/lbgfU5UKraFFZlhtIKT1pUTdiwIy06ToBG36ixIYXAsSx814bCFDWVUqRFyTIrKD+xukIpTVZWzNOCrDSOiFIYMyTPMcZ018kciqJiscxJkgKtzUxWVdbM5imeZ9Nph+uC7UNwAwYrZVH8wEXyf6B0icBCbNDjXuuaSi+odbZOyvlYiF2PB3GX3/QG3G91GQThRtmYt6Htejxod1lWBX8Znq0ztK5DUVfM8pxxnr7Khmp+/7ZV9OpdFJpxnvFsNuZ4MWNa5O+0jQdBx/W5H3d51O5zP+6yH7Vv9d63hWhOXgeLnaDFb3rb1FpzmSV8N7lA1ddb+C6KnOeLCb5tc7/VoVI1tpQbCx/+nHi1oL766d/8TG+jOa+eSfq1P7XW6xmxlScmXL+vWw9ihQAAIABJREFUNCYRvufa9MXNjERcaeO6NjdL2NgM6qomTQoWs5RknpMlBePLOce/XHD08wXL+a/t9mWzSDGL2+ZHSmznlTV1WRgr66qsqCvVdLnMgmYTHePlLOPk+ZCoHfDkj/eoK8VkuODFj2cc/3LB5GJO/g7mTQjW2y0t0TyaPA/bsdfW6Vpr8qw0rnnNQkw1jx+ygDdMR8rk0mE6WjIbL3FcG8exuaswQAhB7HobM3uJYp+9B1uky5zz4xHSkiY6YVO3G3Fl9lIIhLzKHjbs1BVnVfM75sfsJwvbMYyQEIKqrNYMUlnWTR6XRqsr9vMNa6GU+qhhyFVZc3k6ZXQ+o7cd8+DJLv2dNkII/PBmRa5uRgFqXWELl5bdJ7R7OML7YlmrqzA27aWxdV6kZIlxKz1+esG3//SMFz+eMTw18513wVXGfCW3ElcerSajx3Lk+nhZzTfVtaIq6vXxUlX1+nhYHyPaBG2v/l19hEZRVZn3Hl/MeP7DKVprwpbPwaMBbmPx/9d+P/5rQ6UVaV2S1aVxRpaSqrGo9y3nVs02KU0ob+A61EqTl0YausxK5mlOXr6aS4SPt/Zavf6quJslryzZrSvb6NjWtVeWqlJkWUleVOsGZFnWZHlJK/Kp3jKWche8t8AyF8YKpTMc2cG3D7Fl/L6n3RhK5yTVM5Iy42MJdVcGAm3X51G7x2+722wH4a9kTR8DjrSIHZeuZ/KxQtsc1GX99hyXSiuSqmRZrfKzaoS0Psj0QGnNKEv4eTbiaDE10sN3QArYDiL+rrfD153+xsw2borAdtgNIpZxh72wRd8LmZc5WVW91ZQjqyuGacKJM+cyS5iXOQiBKy3sfwMX9LoJ4XwF0QyFC5Q2Eb6rfxUINGr970orFMoYyTRd5EqXWMLGlyGu9JHCwhJvvxTUWlFpk4djC4n9iYI97wKtNao25hFnRyO+++fnPP/hlOHZlHSRURWvM8KOZxO2fFrtgN52TH+7TRj7BC0PP3DNote2TGd4XbwlzMcJFycTLk8npMuCqnj7nOBNUTY5RLPxcv1zfjTi2fennD4fXrtoW7MftkVv0KI7MJKcdi+k1QlxXBvXs5HSdLtXi8QiLxlfzplczBlfzBlfzpmNl3fe/hXqqmY+XnL2YoRtW/ihe+tZnY8FP3DZ2mmTzDO6W8ZOPkvNd/ehRgRm1svBD40RhLf68Z3mvx083zw6jo3tmuNqFWz56rHJDhKYINp1EWzs002hX5IlxVpCmswzlvO0ySdKPp5ETGuUgsnlgqffnuB6Do9+u0+nf7OGi8TCkQGh3UEISVYvyeo5whLYfBnHyPtg5q1qsw++O2V0MeenPx/z7LtTxpdzyuL2ipPVOWw7Fq1OQKsdEsW+uQ5F5jrkBy6OZ5t5wuZ8l5ZcD/ir5rpXV6tjRlPk5jzP04JkmZv4imnCYpqaLL5lQfERmDaAPCsZns2QluTg4TbDsxkgCCIXdwPW13/DzeFJm64bUKqKRZUzLQxz5UobR0hjTnHDdbBjSVqBRy8OjZtzZpij4WzJ2dhnlmQUVb1mWz/Wyks3JhZZUTGeJxwPp0yXGWWtjGla6NGPA0LPSJrfBsNSBSilSZKcZVLiOEaxYttybZzxobiBU4FG6wqlc2wZ03K/xrf3P/ydG1QqQemctHoJV7rpm4TpGhpW5lG7x297AyLH/STdFNeysKU0AcSOR+S4JGVhGKS33AiNa54Jqc0qY1duCdkwDneD0ppxlvLzbMTxYsqyfHeGjkCwE7b4fX+HJ50tut6nLbBC28GzLEql2Atj+n5gLEJVzdtY6KyuqLIE17IYpgmzosCRFpZj7OH/mqHRKGpKVbA6YAQSS9hILGpdUWtzY7eEhUCagkybbnFNtf6dSpXkKiWvU1zpETt9BAJHelji7RarK6ts00l1vgRXnGuhdaOtzkpOj0Z890/POTsaMTybkiyyX8nrXNem3YvY3u/y1e/2efTbfQZ7HbqDmDD2152tVRd4MUu5eDluircXFHmJqvV6IXxXrIbEZw37Y+SBY579cMrJ8yHJtQWWyfNwPYftgy4Pvtnj3uMd9h8O2Dno4fkOrm8jGjZX1Yo8NwzW8x/OePb9Kc++P6Usqw0VWIrZJOH0xYioHdDf+bis923ghy62a1Hkpfl+W55hfiqF+gDJ5IqNcj2bViek04uIexFxNyLuhsTdkHbzGHdDs2gOPVzPsBCW/SqUeTVXAxgDhcbtS2tNkVeki5xkkRl7/OGC4fmM4emUy5MJMCKZZyilPspsmRls10yGc3757gTbteisDU1usp8s3KbAkkjyekFWz3GFvwk/lE+C1azR5HLO0+9O8AKXH//lmKffn1Lf0ThHSFNgeb5Df7vN7r0+g70O/d0OvUFMpx/R7kVNs8JZM5zrtUszWwmvM5vJwmSYzcZLxhczxudzzo5GnB+NGZ5PqSv1UQus0fmMIq948GTE6HyGFzjra9Xf8OngWTYdNyCrK+ZVzrRIiZ0A33KwpWVmq28I27JoBR79OCTJS0YyIStKRvOEVuCaIqeqsS3ZzGx/nPW1au7zaVEyWqS8HM5I85KqVoSeQ9xsY+hd7wruew7tdkBeVMznGYtFTtzy8D3HbP+GhvhvsF4SICQCC8fqEtj3CZ2vNvLmAJWakVTPsQoPIayNFz0Cw4iEjsOWH9LzAmLXx5Gfgr8yHaaVLjR0HDquj9ImWLjWv74grySBtVJUWlGqGktKpBa3PmCVUhSqZl4WTIqUYZowLTLyaxYUsmF9TIidg2/bKBSTImVR5o0VZqNxlebQSRv7z8h2aTkeWmvS2qSnB5YJai5VTVqVJjC0oamLuqZQpjBwpbXuqniWbZK6kUSOy5Yfcq/VafKvCvL619uutKbQNUlVMswTjpfTdcDxptwOPxeUrsnqJUk1p9IlStcIIbGFgy0cw07x5qJKvyEQ1NS6RumKok7J6gWVyg3bpRWhHSOFRGKvmxErXGQzXiRDQJi8Ky82mVaWfauL86dEVdaMzqc8/c5iOlqynGevsRRhyzemB/tdDr/a5vCrbfYfbLH/cIvOVou4E+KHbzRgtHme69kEkZlDc32b418uOXl2yfhiRt0UW7eF1hpda5bzlKOfz4k7Ic9/OGV0PiNZZJTl653xlblA1PbZOeixc9jj4NGAg0fb7N7rMdjr0h3EzQyZjWhuFkoZKVFZVibDZMVwWabjOJ+mLCbJnYvFulamCD2ZsH3QvVNH/2NBWhJHCsKWz9Zum8Ovtjk/HnNZTX8VGvsmVtIm17NfsVLNox8ahiGKA+JuQKtjjEpWx9gqeDmMjU28KXpdHNdas1fr93nL9X0thylr8tSwV3E3pDeI6e+02TnoMr7ss3eyxeXphPl4yWycsJybWbNNB9wa45UxcTdkcjknWWSNvNF657ydLRwiu8eWew+AUXFEoVJSd05bzZHYWMK+YtX+DvMSRBM27N84O2uTmE0Sjn65wLYthmfTd8p334RowkyjdkCrExB3QuJeSLsXsbXTob/bpttv0e6bAj1qB7TiwDBYnr22j77uWDGHiyZLArKkoN01RX9/u01/xxRwo/MZw7MZ44sZs3HCbLKkzCvqajPB66s8tXSZMzyb8uyHUyxL4vkuUfwhzVqx9tc25h5G6qiUJi8qlmlhWJWiJM8rqlpR1appOph1gmzYFcuSOLaFa1sEvoPvOQSeQ+i7OM4radkm16NVVVNUtQnCzUuyoqQozd/Lqqaqa6pGdq7UFf/oK/Jj25LYzXa7jo3n2oS+Q+C7uI5lPtuV81BgjMR822bgtYxZkO0R2R69Zkb6pp/RtS16rYC9fswsycw6rqxI85LJIuPocsq3R+fsdWMGnRaR72xsH66ug1rDZJlyOV3y4/Elp6M5i6wwslit8BybrXbEwVaHdui9s1ASQuB7Dv1+hO87DfO2+p+b2e73rj4NgWgjhYcju/j2IZHz6IPfeIVCTfDyLSzhY+LhNlxgCUHsumz7EYMgNJbg0vrkLnOWkIS2S9cLyOuKRfFuFklj2Kxc1TjKQt9hWHwlN5zkKdM8Y1ZkJGV5bfaVLYxles/z8S0bRc2sTMnqilJVyIZSbrs+XdcMJ19mCy6zJYdRF1daKDSj3Mj0tv0I17JJqpKLbEFaFfi2g285zIqMaZkhgJbjETseHSfAkXJ903SkpO+HPGz3WFYlF+kS3iFvLJVilKU8m03wLZuu6xPz6bJSPgYUNWm1YFyckauMUhk2w5U+jvSaBYlYM1ZK10hhQjtt4eBIFymsxt5aU+mSQuWUokBVikqXIMzr2UIgsV6TDBwlI/7z5U8A/K59gI41XTfC+Qzn0E1RVzXjizlZUlDk1a8sudv9iP0HfR7+Zp8nf7zHw2/2CGOfqOXj+g6O+5ZGjzAFVWertZaA7dzr8f0/v6CuapbzjDIvKT6AyUrmGU+/PWE5Szk/njAfJ5RF9SvnQNux8EOPwX6X3/3DQ/7uf3xEdyumO2gRtQP8wMX17bXcbP0RhMByLIQlGOx1CVsmc8vxHFzP4fmPZ2RJTp3e7TOo2rg2Xp5MmI0/X5DzdRBC4HjGpOGr3x+YnLHGdvv6JzWuVLYk7oR0tlp0t1r0tmO62zG9rZjuwISrriSRq9m3VeFx9ceyXhmP3OYGbllyzQJ4gUO7FzHY7zaSQRNNMJ8kvPjpjOc/nHH6Ysjl6XTjBZZxslRcnk6ZXM5ZTE1QtmF737H9wiG2t9j2vmJannGW/cxIHtGrLuk4e7gywJMhcl1kXb9vpLBo2VtYwv0sBdZymvKyvkBIQbp49338KoRYNUckg70Oh4+3OXg4YO/+FtuHPYLQI4hcPN/FbQoq27Fxrsxb3eQ9wOSWScvMkbbaAVt7HQ4eGcngdLRkeDbl/GjML9+95Om3JyymaZPbtblzVtWK4dmUn/9yjB84bO114AOnct8UtNW1Cb8dzxJOL2ecj+YMJ0uG08QEyBYVRVkbk5xaY9sS25L4nkMrcIkjn0GvxaDXYqffYqcfY9uGfdn07a2oahZJznSRMZosGU6XzBYZ82XGoikO08wwMSZnjfVC37bMdge+Q+g5tEKfTuzTjUN2t2J2t2JakYfn2FyNcNLQmFvYHIRdHsktHGlhC9N8DqybM4qeY7MVhxxudTgbz7GkNMqiumaeZjw9HeG7Nn/3YLcpWO0PUl69CdUU1JfTJX95dsZfnp/xcjilKKuGuQXftdnuRNzf7tJtBa8Vm2++VlXVuK7NwX4X25KMJwnjyZKmR7ER3KDAsnBkG9/ex7f38O1dPHtnM+8OiNrBsXrYMkYKH7FhvYBE0HJcdsIWAz8isp2P6hp4HSwh8C2b2PWY5tl7u/9am/mXoq6pLHUnXX2tFMuyYJylzIqcZVlSvOMCaktp3APDFr5tU6qaeZkzLzPSqjQJ6VICgqCx2x4XKS+TKS3HYzeIUVozLzNGeYJv2bQcn2VlGLR5keFZhv2YlhnTIkUgSOuSoq6whUXseK9tT88LeBB3OUsWuO/JKatUzTRPOVpMGQQhD+Lu7XfaFwatNYXOSesFab0gVykajSt9XOkhMTR/rWsqVaBQht2SLp4MmuPMMFWKGqVrM2yu9NoEJFQxla6Q+tes1GW+4LvZCQJB3424F/aIlPfR8+o+BEpplvPstdmltRGEJdnabfPwN/t888d7PPnjPe4/uWIT/Y5Fr1k02wSRmZHYPuhSV4qLkwmT4YLZeElZVHeegcma2bHxpTG1yNK327IHkUd/t8P9xzs8+eM9/vCPj83iPnSx3+HqdtW23OkZeaTr2aA1UgqytODi5diEGavbX3PqWrGcZ4zOZyxmyZopW73358Tq/V3Xpr/b5tFv9piNlxw/vUSMxHo7V3NQq4LIcW3DVPkuvZ2YrZ02W3sdBvtdBntd89+7HYLIW89WfYztFpYwLJzLr4wl6qomz8ziOe6GuL6znr1bScGKrGIT0sGyMNbG0+GC8eWc0fmc3ja4vvNOpzghJJZwcKRPqTImxQkaTaEy0nqOLyM8q2Wkz9fIlVewhYNAEtod4NNLzrLm3LwphDTHlOvZRLFhNh98s8vj3x/y4JtdDr/aZvdef21Sc9dz5erzVscvATR/rLGYpYwv5gz2ukhbGhOTkwmjiznJPKOu61vFQVyHulZMG7Oerd02j3+fUlX1KxOPW37OVzEGgro2rNV8mTNbZpxeznh+MuLobMLZaM75cM4yLUjzkqJ4xWY5tpmxiXyXuOXTjQP2Bm32Bm2WaU5VKQa9VsMKOQh99X1vDqU0Sqv1duZlxXSRMp6ljKZLzodzzoZzJvOEySxl1hRZy9S48ZWNYcTKlt+xDXMV+S5R6NJp+fQ7EVudiHlj8jDotmi3fFqhty7IVqMVGmg7Pltea+1JgOBWPgSuY9FvhxxmHX45HRG4NllRmnVmVnI8nFKrV3NQaPMcU/QZZk3K13Or3oYVE2vYSUWlNFVdk5cVWVHx9GzEty/O+eH4govpkqpWxtzCsohDn51uzOFWm3bov9O7QAiBbUuCwMXzbLK8ZLm0sRuHzk3gvQWWFD6R+zUD/b8TOV9jy83q6gUSW8b49h6u1ccSm2UchIDI8dgJW3R9k53yOSAQ2FLiNTNZ7ztfNZpKGYlgpe7mrlgqxbzIucyWLMoCdQ1ztYIjLbqez2HUJnQcsrpEC4XSGktK7EbKZzKyHEBjCdF4P75yu1NaU2nFoioY5UuWVUHepIgvqoJKm+6MxlD2y7KgVoq247/msGhf2Z4fvQD3PY6PSmsWZcFltmRe5Bu3o/4cEAgsYeFIby0p1Sgjp0GgGiMLAEs6OEhs6eI0BZYnQ4QQZHVCXqdNAeYaG3Lp4soAKWy0VuZHvH6cmSK/wpE2vuXScUMCy/2rcP66Csu21nKte493+M3f3+fBN3u0+9GtX0sIY+tK4DYLhwOqsubZd6YTrO/IYillZm1Ubbprb56uq+HhFXP15A/3OHy8bRb3jTzktvBDl53DPgCXJxNe/Hhm5GhZeWsGahXsPB0tSeYZVVlvxOp2k7Bdi94gRiB4+WxI1PKxXauxQlf4gYcfeXT6Eb1BbJiqrZheww5G7WBtQrCSAPqhMUT5ECOiD4GQAtuxEMJl7/4WrufQG7Tp7XTobsecPh9y+mJEsUE2q8hLxudzjn4+RwhodUI8//pip1QZ4+IlR8m/MK8uqXWBRrOsxtSqwJauuS6JFYN+/b50pIcrQ/reIW8WD18iHNcmCD3jwPjNLg+/2WPn0Eh7e9sxcTdsTCs+zfFjZk/DptCB/nbM0+9O+PlfX3L6YkQyT0luwcxdB600ySJHa834Yr5mi13PNABuCykEtiVAa5ZpwcV4wc9HQ34+uuR0OGc4WTCeJizSnGVSrKV3deOeqJRhuwzbUVDWiiQrmS9zTi5mHJ9NeDoYcW+ny1eHWzw67GNblllw3/KrqWtFkhcskoKjszEvTicMJ0sm85TZIjXFVJKT5mUjF6woyoqyNM3PlawRYUzUV5lPSinysiJJCybzjNPLOS8vpnz/9JzD3S6PDvrc3+vRafl0WgGlqkmqgkyVRtovHaQQWEJgSQvnFsZVrm3Tb4XUtWa312KrHTX70KzfJsuMWmlsS7LMcg4HHXa6LbY7EXHoEwcevmvj2hb2e5rlZW3klMusYJ7kTJcpZ5MF55MFz87HPD0dcTZZsMxMoyP0XdqBx34vZq8fs9NtEfrutfdEx7EIQ5f5POPkZEKaFjiORRA6hKFnWMwN4L1HuSUDWs4TXGuALWOcTRdYwhRYnr2PY/WRmy6wEESOy3bQoucFePZnKrCECV91pd1YiL/7jNVArTVFXVPrlU/c7VApxbzMuWxCi9+VJQXGkKPnBxy02gS2TVaX1ChTHAqJI17NSQWWmf+xhOmSrIagNaCa915WOQITdleomlzVTPKESZEQOz5tNwDMbFValewE5WvOiraQdDwfDTcKOK61ZlkWXKRLZkVO+YmD7z4KhMASNo500ajGOfDVwldTN/kPFo5wTXElXBzp4ckA3wpRWpHqBblKmoaG28gHPVzpY2E1EQm/3l+1VuSqWgcHd5zwi56/ug6WJQljn/52uymwHrB3v4+4I5u96hBv7XT46ncHoGExTXj+4xl3reu10muG4G0Q0jAsg/0Ov/9Pj/jdPzwk7oQErbtfM/3QY+fQIYp9nv94RrsfkSwyY7l8ywJLK0WW5JRlZV5j1YVlM45Mm4DtWHQHMa1OyM9/OTYSScdGq5JaC7zApdOL2H844MGTXe4/3mH/4RYHDwdGsmVbSOsN+/UvgJ1zXOMyt/fAZfden917fbqDFq1OgFaa4dl0owVWmVeMLmZmZrAbsvdg652/X6mcSXnCUfLnph1nrjXLakzCxHyOGzZtXCuk796jVtVfhUGG69q0OgG79/r84R8f85/+t98QxQFBy8Nx7fVx9KngeDa2axPFAb1BzFe/PyDuhGs5dV3VmymwtCZZZqTLnPHFnNlkSbrMzaz3HQosIQwLorUmSXMuRgv+9edT/t8/PeN0OCPLje32OtrmLU70qjbBuHlZsUzNHPJpcw534oB+J+TxvQGWJTjYMXJGS97efK2qa5K0YDgx2/hf//WI04sZ00VKkpVrO/OVHG1taPOrnWj+qBWUQF5UIPI1AyUadsuxLR7fG5DmZVMQCuLIp1Q1yyonqQp8acYzbGGa/K7WSOvmxlWeY+HYIa5js9uN2WqH6/yrZVYwXRgmbp5kPL+YcLjV5pvDbZ4cbLHbi1/7Dt9H9JeVIs1LxvOUs/Gc4+GUH44v+P74kvE8ZZZkpMUrVj7yXAadiL1+zF7PFFirkb23wbEtwsBlNkt5eTLh5HTCwwdbPHywRRS5OBtSItxAIiixZIgrBFJ4iGvsnO8KgUNgH9L1/iOetbNRC3hoBtksm47r0XJcnM8gD2y2BIlobDG5wflqTkDVPN5FkVXq2jBYacKyzKnfw2BZQhLZLj0vIHCsRpJnKOYScC2bwLKxhCBXFVldMi0yJkW6/vEsm5btovyIcZ5wkswILYeuF7Jnx0jMbJgr7SaPycymrYq2qzdZKQSB5aBdiGwX17KQiLfa24PRGi/LgmGaGAarrr8YidJdIZEEVgvlmHmpWpfo5nvUsLZiN/NxdvPjmKKsKbhWv+9IDykkArm2ZreFg2v5jZOg/atFjittYsfHkzYaTVoXjRnK5uclPya8wGX/wRaP/+6Qg4cDwpZ/i5DU13H1WPIjj63dDskiozeICSKPLCkaBmpzMkrLlnQHMd2tFoePttnabdPqBMYl8AOO7dVciOPadPot9u5vUWSmk5qnt1uQa904rZU1RVaSLk0WmevZSPfLMJsxMkmzABnsd3nyx3u0OmaeVEphZqz6LfqNFLC/06Y3aBFEJlR3lZv2JeHq929ZAiya0Oo+WpvZvmSecf5ywnyy/NVM4l1QljWzccLZ0Yh7j3eoq3ffW1wZsuN/Tdm+W07UVdjCY+A9xJZfrr27EMLk6AUOBw8HPPxmj4e/3efBN7uNNNcxtuvWp1+PvGoMmBkty5bs3t/id//wEMe1+enPRySLbB1P8UHK0qZ4MIYXMy5ejmG/S9Dyb11UKqUoq5rJPOWHF5ccnU/58cUlw+mSNDc5SLZtETSGFbZtrR3hVoYYWV6RFyV5UVOURjq4KmKStEAAL90pPzy7wHcdDnc6HOx0iILbNbGEFMaMwrGpKsVskTFbZqR5+Vogr93kFTqNlM5t5jTt1YymYM28lZUxx0jzspEQmu3W2hSNl+MF3z89R9WKslJEgUspamwsbGmRq4phvsQSAikkrcbo4uZGYAIpjNnFvUGHf/j6kNBz+OH40hh01MacLS0qNBlSCLSG6TKjE/l0Ip/Ac/AdB7e5ll5l/TWGZaybAOG8KJmnBdNlyniRcjqaM5wlJFlh7ODBGH04Fg92uvzu/g6/u7/DVjt8r5ojTQtG4yWTSUJd1ziORVHWTCYJtmMR+C7BBsjxG+xZaWajGt3zxmekhENg38OxuljCw7phkOlNIQDfsmm7PpHj4nymzrtxc6E5uN/fq1vVVGrV5bhDhbVmsNYSwXe/hiUEoWMKLMsC2xIUqqJQFbXWtPHxbQeJIKtLY1RRpIzzhHGeMCoStryIluPhWTYvkynfTc44jLrshx0GfoRuNMEKjdLmYt9yXDpuQOS4WOL1AsuzDOMX2E5jrCBA89Yiq9aaRVWgMs2sNAzW2yJ4/5oghUVgtXCkbyR8V1imq8HBiFUK1srSXzZZWRLQuFZAS3e5Gi4shEQi1qYYonn+VXiWTdsJ1kzlsspwhEVouX9VO9YLXPYfDvjDP37F3v0tvGAzsxte4NDfiSmyYm12oJRCJYp6gwWWYcvaPPhmj8OvtukOYoLQe82F7s4QIG1Juxex/2DAcp4xHS2YcXvrdqUUWgljK77MyZLchOl+IQUW0OSCaQb7XX7z9w84eLRtHAIDl04/otOL8CPPOP55TmM2YL1uo/6Fwwtctve7hJFHusjIkgLLsqireiMFVtVY+zuuxXzyfkMT32pxEPyOnnvwwe9tmk4dHPlp40NuAyEFQeTR7oU8+GaPv/9fnvD49we0exFB5K0jID43ZDNvsnPQxQ8cc7wsc14+vSTPSnM+b2AeK00KhmdTzo7GBJHHYK/LbU+mVbjtaJrw8sIwVuN5wmyRmTgbKfFcm34npN+JCBt3QEtKlDLX48ksZTJPDNOy1K8FyhZlRa0UQgr8Z7b5e32PXju8dYFlCYnnWPiejQaSrCTLK+o39qVjW4S+Syv0iCOPVuThN+6AK1fOWmmWaU6SFoxmCWqypKrUK8VQY80/miWUVc1skRF4LgfbHXSgcIVNbZm4laQq1rPXhRsS2A7tW8psbUtyOOgYMx9LMktyxvOUDLP/jAzTPM6SnOcXExzLMkybZeHYFk4jvbSb+9dqrbuXnvXeAAAgAElEQVRyUizrmqo2r7GSC2aFmcGqa0WtzfcduDatwOPRbo9/+PqAR3t9+nH43s+wTArOL+aMx0uUgjBwqcqa4XiJ49p02+9/jRvtq/f9glms2W/9VcOwFOgrXfU7b4hoIYSN2LArkBBG+ha7LqFtvP8/H2472Klf0cd3QLUyuchT0qp8r0TQkpLQduh6PoWuKHWJ0hpbSKxms/O6MoGz0sKSksj2GPitpjiS2A0jhYbY9ox9u+3Rdny6bkBRV6gVK1YrXMum4/p0XJ/Qej23QGCcBG0kvmXjWzauZZkC7S2LV621eX2lSUoz92VyxEzZsNI618rIHk0yub22N33f8OXngBTSOHi+xQ3xbcfF20p3jf5VmOdN5TgdJ+R+uEWhSgpV8TKZUAdmJs+XztpS/yYvty7tPuE+lo1rV6vtM9jrcP/rHVqdYGMLfts2xgZxN6S7FdHfaaOUCYZ9X1f/Vu/j2PR32jz67R579/vETZDwh2L1XUgpidoBOwddhmdT3HfM07wTzfWqLEyBlS5zs53Rl+HmuSqSBIJ2L+L+1zuURbW2XI/igKjtv9WsomgGrcHcU66a7nxp142VhNX1bA4eDshTM1M3m5isNVWrD7LkritFssiQUrCcp5TNwkeKtzN8tnRpy21ie8AqRsI4n5bUumqiJhRWI2+2xJvH35vb+mXt7xWEACFNrtVgr8PBVwOTsfebPQ4ebWM1ZiV3MU3QWlNXirI0uXmqNh1/x7XwfedX14MVw/Fq28SvHleug1EnwA/NIvPlMxM9MTqfMTyfUdQfLi3N04Lx+YzL0wk7B907rWiKsmKR5KRZyXSRMV/mSGHmaTp+0LjqBWx1IwadiMB3TYFlNQVWrdemEsPpksvxknHDiCRZSa00tTIFysvzKUVRsdOPeXxvi7jlY0t5Y8ZRSIHTsGmR7xKHHnlh1lMCYcwfmuJgVVzFkU8ceXiu3RhDrAosxbIxwLicLLgYLRhNl02RmDeGGposMxLJqlIcn094eTGl3ffwWmaNk9Ul2ZXv0nqPW+evPlPzq1IKuq0A37VZJDmXsyVFWTOcLxk2RV5VK8q8JHkja00KsTa8MAXW6hpqwoONg6JR5VzXoHQsSei6xIHHTrfFbrfFk4MBj/b67PZinBt8R0qpteFKHPvr71VrjWNbn87k4t3QVGpBWY9R+sO7YrZs41o95AZliKvcptB2CWyn0dP++0CtFVlVMS8KsityuetgNZK8tuMzKhYsysIMMDsenuVQqorTdMaOH9N2fXacFq602AtiOq6ZqQobpgngcTwgtF3ars+WH+Fbjnm0HXMxa3KxVsWTme359fcjMAuayHGJHJdlWbx1vmo1t6Z1TV6b7K20KvEtG0dajBor17yokFLgOTb9TkS/a3TFtiVfY9D+Btjx2/yxe4/LfM6iyvh2dkJaGza04wRG3imdG7lCvZLIfrp97Lg2Ycuj02+tQztXFsabhO1YtPst9h9sUVU1ySK7tcTuOhgGyDJD8k92Gex3N8bArSClIGx59HbaxonuA4u3qjQ5OMkyJ2x9mUyDcWNsoxr7ZsuxcF37WmZhURQMkwQNbAUBvUZD8iVfMaQl2drrIG2LLC04Px5x2cxjfchMlqrV+vhOl3ljilJh2xbW+8yIUChdkauEtJqT1XNqXVDpksjq0nZ3CKzO+jqhMdd0gJW+fsXXf2mQ0shtW+2AB9/s8h/+56+5//UOnUFspKl3XH+YBaEiXebMpgnzWUqRm3nNdjdkd79Ltx+tr8FavQodZr0wvp41k1KAbdHqBNx/skuWFvzw31+wnKcbmd3L05LpaMHofGZiEe6gO0yzkuFkiRBiXUh02wHdOOBwt8tXh30Od7pEgUercVQ1obcriSDkhWGSLsYLjk7HvDib8OLUmFCspHtVbSR9ZVWbYmaW0I4DQt8luOF9Q/7/7L3ncxxLmu73S1O+2qHhaI+Z2Zmd1V4XUkj/f+iLYiMUO7p3tVczO8fTw7Yrn5n6kNUN4BAg4QhyZveJwOEh2Ka6y+X7vo8RniIYRwE7WznfPpsynWQbZ72tUcZ0nDFI/bYmUUgYekqhLz7O7qfWsXEWnC1KTuYFL96d8ucf3/FvP72j6Qxtn5+FczSd4fB0xfcvDvlabPE0HTNKYjprL8hEIqXJ9M0bXwJf5Igo4Mn2iP/VPmVrkPLnFwf8+eUBs1XFoqhpLskXtM6B9XIO4xztuQni+VyzDw0V0jhka5BuNF5/92SbZ9sjRllC0O/vjyGKAr9P05AsjUiSswZ0moSkyf3Qj++hwFpQdq8wrrjW49+H2PwZ6320TIGbO3t9CKH0i/NYafRfmTj/LrDOUXY+c6s23TUogpJE91byXUFtWkKlyQM/gXpTLjiuCnIdEQjFdpyzHV9N6fxqsMVXg60Lv4uUZivKzlEf1/TJSwqrc78LpSLTAakOaMzVAaa21601pqPsfAiylhLtJPNlxYu3p6zKBiUFSRzgnPNjfAdOK5xyZ5098fATl5vguguMuyxEtsIMNfCF0duTGT+tDrHOooWiiVtGNiXVUe9M9OFzK5CqdzG69ebcGGGkyYc+v2g48eGd97k/16+lA8VwkrH/fMpiVnLw6vTeXl9K0TvDDXjy7S6T7QHBLUTiH36fvuDYGTAcp3d+/bbtJ1jLmmbirXwvRGGvbdHPFeaCs6D189cqce48XO+5NaXEU2QvPu78/6+vM2dazH6SKgRRGhL2herGA9X5Tqq19r1zf1HXvF4s+qm+II8i5Poz9Nv/pV0rpBRMdoaMtwcsTlZ8968vyQYH4Bxt3d5aX+MdL1tMZ/oCq6FtjM8Mu+TxZ809h3Etra0ouxnz9h2L9ojGlrS2ZBI+IVI5iVqbaQlcn/Hn6PUyQqD6YOIvrbxVWhKlIcOtnOe/3ec//R+/YbI9IIy81ukmOB+u2jaGqmqYnRa8e3PK4ds5ZdFQFjX7TyZkecxo4tdNYq3baT1Vaw3da30uO0bXOWbZKOHptztEccByVvLzX97CyXXWdh9GU7XMjlacvFtQrmp/v72hPnpNEQO/15WS5GnEk70R//DtPv/l90/47fPtc85/V7/uu6MFf9kaeCOI1vDmcOF1s3gHwEVRsyhqDk6XHM8KtscZgZIk0fUaW1IKpPQTrN2tAb95tk1RNiAEaRzyfH/Cs/0JeRqRJT4k+DpYFjXLVc13Lw5pmo5X704RVYsxDcb1x0pnODpd8cPLI0Z5wm8eb7Mb3585nTfWUAQoHk+HjPOE/ckAJSXLskEK6QOe10Yebt0k8c+3fSF4HbPds+s1mybuKI15vOWLq//228f8t9886WmH8oNh5+cRBoosj1BSsDXJGI3uhxL4a9zpLuqwVN0rZvU/05jjjz7W80fOqlPfjFIoEaNEAq4jlFNCtfWhl7oR/OJdbjKcvrQb4KeEdX5K1Fjz3gLnMggh0FIRa81ukhNpr8tZ65/2kpxRGDONMk8DvAPEFf9/FZQQhP2U62MLefCTrNYaWutdGIUQG4egVVl7+1bj8xu+f3F0lpMTKD+yTyPSJCSLP5wt9LeOV+Up/9/8Fd8v3vHz6oiDek5tO95WMzIdEauQUGqfM/WRPfksm/KH4ROeZfd3fn8MURww3vamBcknpKlJJUlz71KYDeIPZgLdBEGfnbO1OyQfeytsre/fElwIQdSHkiZ5dOftN52lrlrmqxLmAatU0BqzoQa31iAQjJOYSZwQ9vEVjTEcFQXHZYnpaSJpELCVJIzieHMdXzQNJ2XJsmk2dJI0CEiCgDQIyENvinNYFBwWhTe8wRFIxSiOGcUxrTHUXUdjDK31mYOtMXTWEOuAYRSRhuFGN/tyPuffjo6ojTcPmtUVWRCShgFZEJIEAfFncqn9EDY0sGHMo6+mnB4sePXTIcWiunM2lgPqqmV5WrJalMgr9HYOS2trWldxXL/kuHnBsj2iMgtqu6K1Fa2tQQgm0ZN+jSB6F9oVRTejsksaW2Jcxzh8xDjYJ7hn1+G7Ihv6CdDXv3/E46+3SbP41hEK1jqfb1a1vPz5iBc/HXHwdsZyUbGcl54SVrV0reXR060LBctqVXN6vGQ5ryiLmrruePR0wqMnWyTp1fdurRWDfrG5tTtktJWzmlc09c1jG86jbTqW85L5yYqyaLDWIt3N7c+Bs6DgNOLbp9v8p9894psnU6bjDK2ud21M4oBHO0OstRzNCl4fzjmerSiqiyYURdlweLJkOs6Io5DhDS0CpJRsTzJ+Z3dpWm/MEASKyTAlT0Oi8GbHxtr9bjrO+ObJlMWq5pe3J/zy5oSinzRa623sD098kHHzCQPfVc8EmuQJf3i2SxoFvOvt1I8XBbNVxWxVUTYtRd1nfF2DnrwumJIwII0DsjhinMeMs4S9cc7eZMDj6YjH0xGBVp6ZdoODqW0NRVEDgjD07rCil4koJfufu99j7zzBqro3nFZ/pOpeffBxDtOP+c8sWr0riSaQE0I1QcucLPzt3TbpPfRBbULdmHP61w6H12E11mDcx7O0JD7c11P2BuzEOZ0zVKbDOMsoiEl04PMU7iFP7CZ7QknpdQ9SXcsi3Dq7KbCsswhBf1GLWJUN81XFbFFyeLri6GRF1XS0nSEONfvbQ/a2B2yPc6JA/7susF6XJ/zfRz/w3fId86Zk2dW8KWc+NBBPqTw/gfgQ/vfpb9gK84ctsJKQ8XbOZGdAnH7qAitisjMkGyb3dsyEoWYwTtnaHTIYpURJiArUvds6C+ldz4QUpFl05+03nXchXCxLyrngMOooupaibSnblrLrkMDX4wluAlkQEGnNqmn48fSE745PaKwveKZJyreTCQ5ItCYOAo6Kgu9Pjnm3WvVFkWWSJGwlCdtpxm6WkYchrxYL/nx0SNF6l7Ek0DwbjXg2HFG0LcumYdk0FE3DarNtLeM44clwyHaaoqUkkJKX8zl/OTpi2TQs6pp5VTNNU7bTlGma+jD5L7DAAr/2yAYJj55NWZ4WFMuKN78cef7RHdFUHYtZwWpREV9BrbHO0NiS0sx5W/2Fn1Z/ZN6+wzqDdR2da+hcQ6IH1OYf6NN/AEFlVszat8zbA5bdMa2rAMdATy/Vpn5O5KOEr/5un//lf/uGx19v9xl1+lbnq7WWqmyYz0q+//Mb/vmfvufVixNM5/WdTdPS1B1xEvCHxbPelde/UbGsOHgz4+3rGceHCxbzEmstW9uDDxdYgSYfp8RpxNbOkOEk4/Rwiet1pbdF03TYecn8dEVdNhv64m0a3rqfXG1Pcr59OuW//v4p+9tDr1tS14vOTeKQR9uKONS87kOK12HEFwqsquXgZMXOpGA6ujmzSknRBwD7uATEOs9LbgJtb9IsC7R3GdweZ3zzdOqNIazl3fHiXIFlWZU1hyeC+aq88HnuG0pKokCgBylpFPL1/hYHp0veni54dTTnxcEpLw5nHC9KjheCVdVgXYf9SJZJoCRpFDLOY6bDjN1xzle7Y77anbA9ypgOMwZJRBRoAnXz+2HTGorCH4dRqP33qn1hFQa6d5u9wxfT4453A0GoJmTBNwQftFd3vYjV4OiwrsXYgtYtcK5BCIUUIbJ3KrxvSOFDfpW8Hj/zbwWuD/xtjKFz7qN0ECF83lWofDGqpaSzhkC2tNb2FL2wt/q+G256YZVCeMOLa+5DP8GymwkWgFbemKNpvYV23XSsiobTRUlnbJ9VJijrlmWf19F1ph/jRyS3Ff7fAtYWGLfAurJ37pS9k2fQh3FqEBLrKpytEEIjRYYQEW5jPNPiaMHZvrsjkCJFiuTacQuxChmHGfvxiEmY0djuXHzAzT7TMPx4WPR9I4wDhpOM0VZGfM+6pfNQUpJkMePtnOwOFvC/RhBpBuOspwUGtK3h5GTFclnRtsZrh7QizyLyPMb1Yue2NcRxQJIE16ZNqJ5XH/Q/OtDeEfEWwcmmszR162kxpYJKbCgjYX8eCqDsWn6enbLTF0VaSiKtScMA1/gcwLJrOa5Kn9OXJCgpKdqGo6LkpCwZhJGfcEUxeRihhGBR1yyampOypGhbGmOQCFpjOSoKWmN9kHs/vTI9lSrSut8+wUlZ0hjDdl9EKSl7hpovpEZxRB6GJP1zrvs9PyTOX2eTLGLn8ZjlrOTVj4dIKTG3Slg8D29oUixrqlXj3c0uQecaFt0hJ80Llt0R1nVEMiNUCRLNafuKspnT2ApLx3k5wTqCwmIozCnL7pjt8PmFPMDPjSDShJFma2fI/vOpd/qc5ugrJhS/nhxedj9sG8PhwYKXPx1x+G5O2xrSNCTNIsJI8+rFMa9fnFAWzSbUew0pJVorrHXMTgpevzjm2dc7Hy2SPLXNFyrDrYzdxxOWs9JTQYvbZ2NZa+kaP5Gryoaqfy1vVX+ztUAUanYnOV8/mfJkd8z2OCNPoxtRdNcFTp5GbI1S9qYDirJhWVSsyrPH1U3HfOUt1m8zCRJCeNOKezJVktKrD5M4ZHuS0xnLz29OLuQ2WXfOEKRuMbcMvr8OhFiHFnv79gFRXxwFDJKIURazPco2k6yibqnbjqYPfF5TwXtFxiYnKwkDkkgzSGPGWczWMOXx1pBHW0OGaUzehxbfFrI32jCmo6waxMzf/6SSZGnEUAqCe2Ch3GmvCxR58HeoLMO6D+dbrCmCxpYYV1F1r1m131Gbd0Rql1jtEaptpLhnQbTw9DItJVr8e5pfeStzP8Hq+gXEh1fEay2UFn6BoYREKp+ZYHEEQl7LYv5TQOC357pFsnVnToW2F3Za6xdVZd0yX1WczAuWRU3VdESBIktC0jjsi6yOullyeLpiMkx4sjt+0ALLuDlN9wOdOUCICEGIFBlSZn2RFCNESGcP6cwBUuQE+glaBH1xNsfaJdYtca7FF2garfYI5N61C6z9eMR/nTznm3wb01NO4f0FwnXwJJ2wHd1vzt3HEEY+5HM4yYjuSbh6GaSSJFmIsznJIL6x3uIqBKFmOE4Zbw9QgWK5qjk+WfHixTGLZeXzOtKAZ0+nPHumcM5xeLhguazY3h4QhkOuu+4XUqKEIwj9YjGKNU3d3a7AMpamX0y5WkHXm9SEEWngtZQIeLVY8P3JCca6DQ3w8WBIqDQnZclxWXg31KbhpV0ge+1T3RlWTYOxjr085++3tzfFUdm2HBQFR2XBsm4IpCTWmlhrBDCva17M5kRakwSaRAfE/Z9ZGJKHASdlxYv5jNO6YhhFjOOYrSRhnMRkYcA3kzH/sLNL1L9upDXRfbQ8PyHiNPSZbYuafHRPWkTnLdurwuuwzBXd8tbWnDaveVn8T5yzDIMdEjViHO4TypTvlv/Esj269LmBjEn1hFV3inUdRXdCYwsuC0b/XEjSiNFWxs6jMbuPxmzvj4ji4Gr613kN0hWPaeqONy9P+Nf//gtd2zHdGfD1b3Z59HTCeJLzf/2ff+L06PIohTgJGG9lnJ6sMMZwfLSkXNU3OJcFg1HKo6+mLOcFy3nByeHims+9BH20iuksddmwnJebTLqbZoHFUcCj3RF//80ee9OBnzjccrOUlAyzmP3tIafzkrfHFz/julBZB+p+KQi0ZJR7k51hHm/szgGvr+wszrU0rfmo9v6+kUT+uE/jgOkw49v9qadit6Y35DAbG/a1Tb7AFz1aeWpgoL2de6h9PlgcarLIr8/CQF3LKfBD0FoRJwHWOeqqo6o6ZF/gmYkljvQF44tbv89dniyEJAmekgRPr/V4LyAuMHbFqv0RKSJUm6DlAC0HKBHfu027305xlj8lfCe1cx1dP6b0QjrpF/DnaIR/7Xot53yob9u7x3z8NBObYlT235kQcuMK+Dkh+86GEtfjbdtzE6z1BcYH9XUUpbdlrRu//+NQk6cR46F3CvKSBeHtW3s6w23oAXeBtQWteUPT/YISA6QcIEWJdCVK5jg5QglBZ09pzCu0HKPdFo4R1hV05hhrTzFujnM1oBEiQIoUJ6fX3o5plBNIRWOvNha5LlIdMQruIb3vBvCOXimDUUp4TYHybSClIE5CX2il4f1psEJNPkoZbmVY4Ph4yZt3c16+OmE2KwlDTRxr0iRib3+ENZajoyVHR0vCUDOd5nCN7MLzls1KS8LIZ0AZY2lvYRBre5veumpwjYbOa5oGYcQ0TZkmCQ54u1zyerEgCwLKbsJYCLIggDRlTaufVRWLumHVtEySBNNPnBrjRelbScJvp9NN4+XNckExa3iz8AVZoFSvy4qwznJclhwWK7IwwhERKl8kTZKEnSxlJ834/uSE706OOVwVdFuWPAwZRCF5GOKcYz8f8NV4fGa+cdkEwno9l8MbvGgh6Zzd3Hek8Jpg1+uSz8TgbmOwcxnWE2TBWaai63+08HTGy2jUYRQw2sop9ipPYw2Ut/u29mO9tw+ia322Vl22V0YTGNewaA94W33HJHzMVviEafScnegbYpVz3Ly4xJrdQ4uIRA0IZYJ1HaVZ0Nr6ztEw94l04GMgdp9M2Nrz2qU1TK/3tcZu9qkxzv+9p+Zepltr246jd3O+//MbdvaGPHk+5fm3O3zz2z129oa8/PmIP/7T95duTxhpBqOELI8wxjE/Laj6e9l1IIBsGLP7dMLJwYLXP19e/N4Irtdmli2reUUYBVdSSj+EOArY640jtseZt9W+5VpNSkGWhD2Nb3ZhEgR+zVBUDWXV0pkvp8Dy07cQrSV5EqG1Xxet81M7c5ZFtXGT5OKa1lrrw6TXRbfzxb4QAiHPrmvW+McIIdDaT3msdRecKs83XJ0D7Xy+6SAMvUlFH9DunOuzsnyju6oaZB+27K3rg95J8dPG5mglicOAuu4oioaqaqA30wgjTdfdz3rvwQnjUgQgUyK9S+5+h5LJZpqlZEIafH2v7ycu+VvnOo7qGUfNzG8TgliFDIOMgc76QuvzFxV3hc8a8VMbey2K4Fkx+qUVl6J3qfOZVteYYOFP5POffbGqOThZUlQNSkp2Jjm7WwOkhCj06e9BoDavfjQrOJ6tiCONevDutGAd8q3VHoF6gnUrjJ3hbEcoB57qh77QDQWLdRXWzv1U2Tkg8PRCEeJP+evv20gFDOCCvettEUr14Dl0QeBt2tNBcu/Oe+chhEBpRSh8UaR7Trc17lbTvjV0oMiGMekgYb6seDcvfTDo7oitrZzZrGA+K2maDmcdTdMxm5UcHCzY2RncKutIKukpT3FA29yusLbG0raGrjUI65Cc0T+U9G5P/nsRWOtY1A2vFnOqrqNsW4qudx50bMyJnLUbe2fVT6V8AXWxmHDOh3O21hIp1ef2SbQUSBHweDAkDyM667Vb6yJsTfXTstcW+le78NqiVwZdB7Om5G3pXQf3Eq9pPakLDuolOEi1d7ZtraF1lsZ0PrvP+W06cycU6zfHOXz4u+kIpCJWAUpIjLN0zrIdZWzH+aUmRFIKn40VByRZRD5KAE/bum1mmwO6ztBULW3dXjkh2Wiwuhnb0XOGwS6jYI9Ifdy9y1MEA6RQ3rjJNljMXWrCe8doK+PZb/d4/PUO+fBiE6lc1cyPllSrCnpXtKpsqIuGOIvYfbrF1v74vde01lGWDbOTFXuPx+zsj9h/PCEbfJzls6YIKqVw1tE2vsi79rVIQJz6eIvB5P6aU8721OFF1YeyX38vCuE/VxRqRoOYnUlOloR3MiPwRYMiic8W9udhrOtznS7P3vxcWF9LtZJo7fOklPL3m/V6x3JWBFl7zh25R121zHtzGnMuU80HrGuCQBOEitW8YjEv0Voxmebko4S6bL15ytpopTMbx9umMTS9Q6kOfE5kFAdEsQ9PdsJPZw8P5hwdLBiOE+9eO0oJlUZFnz7KRcg+jw4vA6mqjiCQ9663f/ACSxCghCZSOygRE8gBTXfAsvmOQI4x0d0tQd9/z97qsf97azsOm1N+WL4EvD35UOfYxBHLCKTudUZfVpFxY7gzJ8G1pfGHsKYIfok6tfW2Xbf4c734c/3ZHY5FUfH6YIZ1MMpjtoY5o0HMKE+8/kScdXicc2gl6YzxRhf3nJv0UQiBQCFEjFa7xMFvqbufaM1rcAW4x0iRIkRAb1rtTUycxbkKY+c4ektbsZ5eRf2E+Pr7N5T63iaYFxaLDwQdKtI8JhvGhJ+wwEKwEckGoUYHfnGDMxhz+xtzEGiyQUI6jHn34oQfXxzz5OkWv/v9PmGo+cu/veXNax+Kaa2jaQyzWcHBwYLlsr7VokApSRj6AqsqmjP/9BtgHbbctQZlrLcz7ycuqv+x/blmnWNR17yaL5hXtY9X6DryMOw1Vb6lcp7krKUk7t2jtLzYcllrT7u+wFK9dlMJSRxo8jDk2WjEQbHiYLVCCgil/7e1Puz8ZOgMNzt2Z03JD8tDOmsJlI+1OGkKflgc4ZxjGmcMgpjKtJSmZdXWLNqaxvowdyXV2b1L0H8HjlXbsGxrn1kYJkRK05iOxnZ0g20GQXxpgSWkd4n1BVZIPkpom472jqHYa8fIpu6u1HtYLK2tKMwMJTSjYI9RsIeWEa39sLzAs0s0Qigcls61vf7qC1nwChhu5Tz77R6Pvt4mG14sGqtlxeGrY2aHC9ZB18vTguVpwWh7QJxFlxdYxlIVLfPTAqUku/sj9p+MiePwgv36ZVgX00r7RkbbdpjO3kg3Gych42nOcJzd27XTWkdTdawWJcMyuxH9eB1SG4eaUZ6wPcn9pOMOuR9CsAkE9o5+F+/z1jq6zm5sx78knFHqPJ1OS+nzQc/Z+29ypZzbMBTWaKqOk8MFB29m/jN2hiQNyYcJWR6TpCFJFnJ8uODd6xlRHHhX22FMVfrIgMWsZDkvqatmo2EqVg2rZYWzri+sQgbDmHyYEPTfcVU1vP7xkJ++P+DR0wmhVmRJBLF7kPXnmp4qBHSdpa5bhPAOvfe5RnnQAutsYSwQTiNFgBSh9xh0JcbVOD79GFYJxVBn7MfbtM53SqUQzNsljW0Q+BtsKMTsTaEAACAASURBVAMSFRGriEiFRDL8IouPKyHOihLTmxx86KZ0PoPmfKbMl4L1tl2nCyf6i7HqaTgCQZZE7Gx5DdA6jDBLfNq7pwK0OOf6i61mkMXsGtvbwj50L2JtDNNg7IzWvMXYWW9YoXqjmBXWLjBuBtZh7CmSGOd83oYvtjrA9sYWCUKENzKSkZvj5nawzlGahtI0BEIRq/BeHCivC60VURISJ5/Wbn9zbRP+PcO+C1g7dyeRsQq8tsvfnBZY63z+SxYTxwFBqPobqH+862+oN+pW/wrrxZkXoMvb1Fd+G7qzCZYD5k2NWTjmdc3b1QohvMnFdpaRaB+w2RjDqmlZNLVvkFifS9VZ+95RuD6vf32lCrVmmiQUeU7ZdszriqrrqENDZgLSIPQ0xPP5Wede66qjPVSKPAwp2pbDouBfDw7IA6/bSnoXxPDcpNtCr1s8u2attaGN7VCNpOknVp2zVKalMR2tM1jhNrNmKYSn7yA2TrDeTVXQWW/9rIQk09GVYe3rzwm+gE7SiME4pSoaylXNXaJkPdWon5BcUdCvqZSyZ4ZYLJbrFUmda6nNksb45msgoy8iA8tPraXPwBunbO+PmWwP3jPTUYEmyWOssSit/BSxN5LJRz564Yo32HTagd5w5nr3v6bpWC0qilWNc36hqwN1o6DjMPb05GwYbxxGuQYT5kNYF3tV0dC23Y0aQLovhNI4JAp1n3V1+21ZY23NLeX7r7dmAVl7s+L0U2Pj3CvOXb9+NaGCNXW4px//avs7YyiLpg+DjxiOfWOgrlqstQShD14XQtC1Bik9XdA5tzm+ylVN23RY4zZaX2ctpjUoLckHMaOtHNMZlouSOAkZjBLSLCJOwp7iHpCmEUnSFzgPsMbu2o6i8A3I0ShhkEe0nWddrIOkzp9nt92mz+wpu2Ek4+i8lfsDdKUCqZhGYzKdUHQVhSlZdgWzdsnLssQ4b2ue64StaMw0HDIKBoRhwOe+qN8Ea2MILRSdsBuO7pVYC1Gdp/SoL6iYXE/izLkctQ9B4ru1az2ZEDDKk42bj3cRUhvuclW3nMwLjLVsDTOiXpcVBH4hEwYPfKq4firlajp7AJ3ttVQWQYijxtgZxp5izAnIDmOONwWWQOOocK4CAjzdMEMQwgOGbTscq67msF6QqJBpJB6kwFrfeHTg6QlxEt6b8cTHoLTsO3cBpjO30jCdvZYiTiOyYUKUBP3iTJMkgS+wPkHRKKTchJLKW9Jv3Jrf31lU30E9LSsOVwVS4M9N5R1L9/N8k2/VGENtOhZ1vXEClQg6Zwnk9dxLY63ZzXIEgh9OT3i1mCOEoGhDBl3EuO+SntdnXgeR8hlajbW8WS45LAr285y9PGeaJIzj+EKBJfGaKCfeD1JvrGHeVhRd0+uDJZ09S3+6GK589lyBIFEBiQr6q6D/b6ID8iAiD2L0R85vKQVREjKcZCxPyzs7XjrrMMZgjPnA4t9P5JUI+viQhs42aPFxDU5nKwozp7be0CGUCUoEn51hIqTP0IlT/1167VX2HhU5igOGWzlJFhHGIVESsDwtWJwWBJEvvi59fXwxHPT3nqbuqKr2Ws57Td0xnxUs5yXOOdIs9NODG9zTwyhASEk2SAgjT5/zA5Lbr9Gc85Ptumzpmg8dL+8j0N6IKkvCXnd16824gAsa/V8dU+uGlbsGA+hz4iod6Bn8leU8rOlz1sqW7b0hT76aslxUvHt1Ql21jCc5UbzWE7sNEwgHTd2yWlZUldf1Ke3pdTpUKO2dM6M4YLo75NHTLd6+OuHt61OEEEx3Bv6cGacMxymDceqLrl+bdXxC1I1huaxwDqbTnEEec3C04PBw2a+R72df3y1o2DkcLdY113f06U8o4wpaM6M27zCuRKCRQj/IRVMiSVVMqiLfBXQd1jmWXcFBfeLHqjga16KE6m9Y/gCOZUgogwfXktwG685mICWt/fjixPUnkdfbfD7HwMuwFkd6yt/HH7+25hcI6rpjZrz36voatBbK133r9vB0xdujBTiIAs3WKL1Xe9WbQogQJQZYOUYS4lyHQKPkCCESpIgA6x8nB0iRglB9k8LA2upYeIt3+mkYGH8OPtCOtc5xUq/4cXnAKEw9rekBjC6k9HSF9SRGBw/TGYMzDVMQaWR5+xuGEGcTuDSPSFLf8cNBVbV0nd1Ysi+XFUfHS8+HN9YXR7e0DZe9nkwHqu+e33yG5Zx3Ejw/SVt3g01PXRFCk8feWEIIr8Uq25bW+GD0tUPf2tI9VN5JKlCSNAiYxAmdtSS/an6ESjGOY6QQzOqKo6LAOkesAyLlp0yh8q6G1jmC/v+jnmaztmGfJCkOyMIQIQRpELCTZThg2TRUvf27Wes8f/UdREozChM6Z4lUsPndMIg3C12Bb/gFUhFJS6w0FndmuCQu0ttBoHs9qnGW1hmkkIyDhFGYkOvoo/cmISVhpElzP5m4C8UKt55Wfni6IoUiUimZnuCcY9kdEcgI4zqEkHS26Tvths42NP312uGYtwecNK9ZtkdIJAM9JZLZtfIQPyWUkiRZxHCS+YXiMLk0zFwFyudhaYXD269b67xVtJJXXpekkqRZyGTqBffHh0vS/JSu9VSuum79/dpYmrqjLGrWdcC7NzNevzjm4K1vLmzvDskH8Y0aJkr78z9KvOGNDjVdaz6aYfQhOOtNUXxw8Q0nWL0xQRIFdzK2uAhxNgXyf/3VBrOZ/tx1grW5Djq3cdBb0w+N9VMyszaPcOupU28isd6WdVul/0XXWQ5OltRNd+k16IPb0zMdjLWEUcB4km2u2VXZ0HUdDkfXGerGO1E3VUddezpw23R0rb++r++3URRQBc2GZp4PYsbTjOPDBW3d0UV+shUnoTdSClWvFZT+OvRA9+h14Yzw0TxBoDaUwfvEnYOGWzunMcdYd502reudfyyNOaHqXlGZ1zTmiEAO0XLYC/E/PfyN3lB2NfN2ybxdUpiK1nZEKiKWIYnyF8uiq2hsy0kzZxqO2I7H5PLj4tzPjXWRESpNbQ3XoQiuxeGeSvB+1+NzweLo+iLrOl0vn5ulsJ3lcL7kXTX/4OOPTwveHi2IQsVokPDsvjb8llBySKi/RasdRO8A6CFA6N7gIiLS36LkGCEClJwg0Bh7grFzQKPlBNA4V9N2L5BCo+QYuOc4hCtgnOVNdcr/OP2FR8mY7WjAfvK+3uA+IQSbwmpDc1uLWB4AUvXdvE2BcnMIKbxQvZ9YRbGnOWZZRFk1/PjjIcZYXr06ZbmsePnyZHOTqquWPI+JIn2rRYiQZ/bJt13ErGmKtqeNCSHYShJPp9MBsVbEOiALA7Ig3EzXW2PYHwwo2sYXHkpuaKpKik3WlcQbU1jn2E4vXouVEERaMwS+nWwximIcDi0VgZQkQUCsNa0x1MagpCALQtIg8HlWQjBJEv6ws0PZtuznOVIIhlHEs9GIrSSh7jpaaxlGEcMo2jz3PIZBwvNsgsUxDhMEMAlTxEBccOWUQiCRPVXer5DXDoHQH7bn9oPXsq2n+v0ESwXEyheQ6iOFh+j1gmGovSvYXQos+sXKel9fcWnWIiTXU3airwHL2+ovrLoTtqKnxDKjMgucs3SuoTRz5u07WlvTupqj+meO6p9pbEkgIrajr8mCCfKaUROfCjpQDCYZe0+3GEyyK51D/bXHn5dHr085er0OCzaMtodEScho+/34iiBQbG17a3aE4Id/e8vp8YqnX03Z2h4wPy0wnaVt/LTq3ZvZZiLx4ievb1kuKqJI881v99jaGV7qVngV1podpRVhrIl66qPXct2u2nDObTLyuhu+jpLebc43j76MdclN4Ry0nWVR1CxWFcuiZlnUFGXjXfWaztuYt95Y46z4cpvcqPVEzVq/Hvrx5TEn86J3BL3BfhGglDhX3Jz9k7V+urWalyxmJYteBzg7WZHlEW3Tbe5tbdP5BlTm71FV2aBD7U0kfrWfzuvcjTHeIr1oWC1rkjQkisMb2/bfBmGo+ntpy9HJiuOTFXWvIV03te4Ddy6wOjun6l7S2euYUzhPBXQdVfeWVfsdVfcKKUICOSKQQ+8y+Inhb2SG1naUpmbeFszbFaWp6Zwhl5phkBFK//UUpqJuGmrbYJxhEKTk+ssvsMSmwFLorufnfuD8c84viDtrUULgnPxS6qveWt/S9dPFj0EKQSAkpnMcna44Obg8L2SN49MV746XDNKI5/tb97XZt4aSQ5QccmbAvMZFTZRWYyJ+s/m7sQtAYOwCJSd9MaVpzSs68xatJr0uy+Oyntd9zi19gTXjf5y+oOga/jB6cm+vfSX6CYzvvGqkfv9C/ylxJjC/mebh16+hlNzoNaIkIElD0iykKBp+/OmQomg4Pl6yXNW8fHXKclWT5xFpEjIapURRcKuOnBAgldeX3HYh4xfdrtcueEreVpLwZOgLlEHoC5rzVLjN8/qfjZPeJR8iD0N28/y934M/9yOliJRiGEV8PR5vOPWu//fz73kZJknCJLk4aR3GMcM43mzfehuvMt4ZhjHD8GIjYxKlTKKze4f7Vdf5Y9t1Ht6u/dzzrvlcgUCpXmN3D5MAZx3GnqdSvQ8lAgZ6yk78NUf1L7yrvmem3mBcw0DvUJo5Fj+9KroZs/YdpZlTdnMO6h94V32HlhGPk79nO/6aXG9t9FyfCzpQDCcpe08nDMfpB6fkQgiauuXNTwf8+Z9/9Oe3Vjz6umX78eRSvce6wPrqt3v88sMBP373jle/HFPXLVXVMjstNtOr+WnBu9cz5rOCxazgh397x3d/eoOUgr//x6d8/Xf7THcG1w5PPa/xUUoSRAFREvriqGpvPc1xztNJm6bDdDejCEolNvlIv3b7+1Jx/vOti6OmM8yXJe+OlxyeLDk8WXE8L3yg8bKiqluqdSBvH8pr+omXMbZvXrkNC2c96bop1vq+XzcCvWOro6k7louK5cIXWVJJ5qcF+TChaboNs6BtOt+KF8Lfc2Pvxvze/cNfoDbXfGMsTdNRlg3FsqLIIj8Fu2He6Mc++2XnZBBosiyirjuOj1csFiVRFJw1JcX1r8Mfwt0ogjiq7h3z+l9ozMmNnmlchXUtgRwT630ivU8W/B2BHN5lk64F4yzzdsVpu6A0FZEK2I232HYTHI5Ux6Qq7juBAuMMs37KFcrgs1MTrguB1wCsnbE+tnC2+OlV1bW+wPqCWJDGuY2NsfmIgxL4LnYgFbHWpGFAm0SeJ6wuDyp2Dqq6I46CT2qGcDtcf5ooRECgdnHhH3rabQZIQvUEraZotd/TCx8O1jlvie1u3/m8Cc60V6HvpD3wzdjb1a5F07d7b6UVUZ9FtV5Y7O4MscaxWFYURcNyWTEYxIzHKcNBwnCYMBjGDPKY0Shlezu/3bEsBELK/ucu9DE/iYm1ZtBPrsLeAv3MgvySt4dPkoFyX8Y96+2+L8fVu3AFxK/+vO6TlJboUKP07Y/RNTxbqS+urppgyZBBsAMIlAhRIqCzdV9EzVh2RzhnWHXHvCr/xLw7wDqD7ZtB0+g5mZ6wF/+GrfApqRojP7OEXGtFPkyZPhqTj5IrtWyiL6biLGL6aMzz4hFN2dLUDVESXKkNDULN9u4AcIS94cBqWbFaVPzlf77i8N2crjWcnhT8+V9fcXK0xHTWW4oby9OvpozGKb/5/SOef7PNZJrfKp9PSIHus4qkunvT1dl+4mmvPl4u3Y5+iq3ucF19aFjnmC994XQ897Evx7OC2aLkdFH6CVbp8zaruqVqWm+20FvDrwurX0+vXE/NvW1xBZAkIbuPxmR5zGSao7Qky2MePd1ist0wGCbkw4Qnz6eEoacST3cHDIYJddlQLGuMseSDBKUlXWc4eHOKUordx2PygXcOFEIw3sp4/s2Op7tnEUGo2d0fY40jH/j3T7Nooze8KZZVw6psaPusMikFeRyRJ+GlXgJreqSnN/pCszMWUzZUVXsnY6rzuOMVylJ3b5nX/0Jl3lzrGd56WqFEjBIZgZqQBt8yjP6BSO2i5fuj8vtG1xdMr8oDQqlJVMwkGPrCSiee/87ZSdzYFi0UxhoiGSBv4ML2ObGmCEZ9yOVHNVi9w1VlOkKlHmQxfF0Ya6mN8ZqHa1EEfUBypDVpFGJSSxRq4khfqk3pOsuqqL3t6QOZIdwM17uhCAK02kPKAc7VG+quFFsIEfVugg9Dw13DOh/4bG5oKnBbCM6c/ILg8v39Sd9fCKTyP7d2Hzo3gVN91snOzoDRKGE2L5mdFsxmJeNRymJRMhgknu8+ShiPM0ajhLCnR958++lvOuKMWnnT3dYvuCUQK80gikiCgECdN565utt/1+XT+cPsU7BD79tN9ravdquiTIhNnMBdpqwbrBd5HzAC0MIXWKkaoWWAFgEnzStmzRvm7TtW3QnWGZbdCY2tCOoYLSICGTIOHzGNnrMVPmUaPWMSPkaJ4LNnVapAkY8Sth+NyYbplYWSn1Z5vdb00RgVKGaHC+aHC8IkRF5VYAWK7d0hw7HPoQpCzaufj3jz6pS3r085OVrSdobZyYo//b8v+fn7d4RxQBQF7D8Z8/SrKU+/2ub5Nzs8/Xrqc41uU2BtNJnr68ltLghnsNZPt529nmHV2Xb01yX55eV0XgVrHaeLkl/enPDDiyO+e3HIy7enFFVLUTUXCqg1FfDMLfnchPuCDsv/z11vpXEasvd4jOlsT6VXZIOIMNo6c7zsDZt29kYgfNGPg8N3C4pVhQ4Uo0lKGAfMTwtOXi/ZezLh8aMxo62MsG9wjrcy0jxCSk9NFlKwuz9iNE5RWhH0WqzbNkNXZcOb0wVlL6rXSrI/GZBGAZfdAs8YFm5zPWxbP1n9ggosQaAGxPrxtRZtfkKovZuQTD0tUE3Jwm9I9FO0zB+ku+6cpwg2tiVWIZlOGAU5mU7I9PsC/MBqRkHu6YM6/aswuAA/xYm1z32ZN/VHFwXGOWrTsWxrol5s/TlxvsBrraFsW8qupf2AyHZNkwmkJNLKC9QzCIXyphXB5RONrrM0rUEKQXqLdPlPh5tecCRSpEgRY12JsAUOUDJFyoxfUww7azlulhzVS4yzfuKgArbCjEmYcVgvOKwXlOZ2Rs6VaflldUxpGoyzD+IS6imC0guzb2hNfE9vf26CdbvXWG9/EOkNfcP1gvYw0IzHKXEcMhwmlGVGkoSkaUgUaYLAdxO1ltxuNnJm+3vblf96caCFZBBG7Gb5RqsU9BP1zWPxdBHbL9JFPxnyphgXJ1prat4FWiFuQ0MUQtAZS916LUOotc+I6SfX9zHNvM/F3V1e69bPFd7oQmnpTQ/u/HHcuYXf5ZBCEQqFExGDYAeHQwqNFN5ZMNNbtLbC9mlnUigCmRDKhK3wCZPwCeNwn0GwTawup4Y+NJSWpIOYrZ0h6SC+Mox+fS6YztLWHdWqxllHEHvanc/L4739IJU3A4iTkJ3dFmtdHyzr6Vdb05zHZbPJMJNKkiQhSRry+NkWT7+asv9kwvbekHxwe2OhdYEYhKoPZ7091qYNa7vvG02wetrWX0NtVTcdi6Jmtij5/sUh37844seXR/z0+pi3RwvaztC0Xv+5bupGoSbs8xO1kpuML9mb3UjZx0j8ir52PCs4nq+om+5GRZfW6j2Gg5T6vSlSEGo4d8q1bUeWR4wmmZ96DWKCUHujG2v95Gvks7TWCHs2xhrOOeLUH9vrA+qm17Mz0xA4mK/40y8HnC5LHI4kDBDA9jC71Gm3M5a6aSmrlrLyUysphd8Hl+Sh3RZ3KrAEkiz4O2SWYF15zWdJBBIhNFKEKJEQqDFaDpAiQPDpixdvy6mIZECqYgY6I9cpgbz861BCMQgyAqkJZUAoP71O7D6ghCTVAaMw4ViXHy2wrLMUXcusrsl0+EUE6621E7UxLLuGVdf4ML0rIIVES28FnuiAQRQRS02Xxt4K+gNOMUoJcDDMHsYA4tNBABIhYmTfDPAmGe+Tshrb8Zf5W/548hOVab3jVJTzn8fPmYQZPywP+Kej7z9qEnIVOmv4eXXEoq2ubbF/VwgBsl8QPKR74Ob9e8qBvK1JxEb3oDdugF1nOT0tODhckMQho1FCnsebgEitFUEgqaqW09OSqmrY3R2yszPkpveKXpPf39BvC7+QCqRkksQ8HQ437n2BUhvaxrpT2xpD2/kJ5/o8NX1XVwq/CFFS0BpD13kTHtV3sted33WgcNm0HC8LlmXNMI0ZpjFxqAm15m7Lw78dCMlmEvDQ30gsB8hAkaghk/AxjSkwrqVzbX99cPhw4QAtQ2KZE6ucSKUEX5C5lFKSNI8Zb3t601UTLGctXWMoFyUHL4/5+U+vSLKYJI99gXUNGm82iNmXgsEw4fGzLVbLmrbtNo6E4M/ZtbFPPogZDGKygQ+MvQvOJli99unOFMGe3naLEPS/FqzKmp9eHfPjSz+1+v6XQ45OV8xXFU3bYfrPHgSaNAoYZDGTYcJokJDGIWnssziDQBP2Lnu+6JKbKZ6SAufg//nTS/74p5ccdyvvQviJ121SSibTHKmkN4UAEILtvYCd/RHZIL6+juruw3Oss7w+mvPP373k9ZFfpwzSiGEa87snOyTR+9vSdYaibFgsS+bziqJs2JpkTMYZw0FCeItJ72W4W4ElFGnwjDR4dm6nut6yfS1gvLioEpvFny+04KK47qHgu6SSUAY9NfDqRbUPcbx8uvUlQ0tJFoRM4oS3RfDxCZa1lF3LrKmYxMm1qHifGrZ3DqxNR9G2lF13ZeEn8J85Ul57FauALAohuviYy46z9ZjYOveFTbBuBv/ZeoEyCj4yWe6s4U11yr/MXrBqa4QQPE23eJJ4o4+XxQn/dPg9P68OfXbRDfWHDnzQsG2wPFxY43kK1IM7Tok+IPSWVBbBukDUGw2ZsZbZrOTlyxN2d4ZMpzmTSfbecw8O5sxmBYeHC6IoYDrN4RZNq81xdIdrsnNeAzqMIvYuMaRYW0y3/cSpbv25vc6oW9NnpBQbYXvddtSNQfW6NNkXWJ2xBMoL4JdlzdG84HRVYh2Ege5f8/Nfz74E+D3rj9Hz14sHeW8hiFRKpFIGbANrGlQfrL4x9fHOiuIcVd/1E3DjWv97PqMWR/TBt1nEaJL3dvdXFVh+YtNULbPDBW9/OmT7yRZp3/m/Do03zSLSLGJ7t39N19t5r2l2/QRM9gvw+52y+uup0gqxoQjeEu5s2+/D+vxLw1orNV/V/Pz6mP/+b698ofXqiKr2ekIhQCtFFEpGecI4T5iOM/amA3amOcMsZpBFpHFIHPaFVm/uoXt3VyUlSgmcc6zKmr/8csDpotg0rD4lpBQMRinZIKYqW4pVjTWWdBCR5fG1jr/7Oj7XdMqD2ZI//fKOH996L4hJnvCPX+/TXdGMN8bStB1V3XoHx7KBSUaahiRxcG9OhvesEnVY19LZGa2dYVyJtRWWM9cyJWKkiNByQCBHaJlzWWf9U8I6S2lqTtsFqU4w7va5Dl8ytFQMgojtOCMLoo/a93bOUbQtJ3XJbpdh3f3wUG8L4xxV52mBZdfSOXMWdncJfCEceCvnICI4d8P72NHVGUtVexpGeknH428VWioeJRP+y/h5P8GCaThgO/ZaSL/ssWRBxLN0i734ZhbrnTP8tDrkp9Whb648wGnuNVDeHekuVuO3fn/6uuQOl7W1JfGal26NY7mqOTjwhVPTdJc+r20N80XJ0fGSvb3RzWx7f427rKP6t3Wb/7wPYy2zouZ0VXpBdz+xMsbSWXfh7deT7LJuKZuWQCniUBP0Jg0bAbyS1G3HbFVRtR2deRhjlf/A3bBpvL7XjD1D51pqu6K1FZHMiFX+IIyXX0NK4RsgkfaB4ok3Rrrq9ir7Zk8Yh8RZRDKI0YHCGtfnStlbnWveTMfP+87/7t7RU2/Xpj33tDTmLjquLxVl3bIqa14fzPj59Qk/vjzqLdTP1lJRqHm0PeLxzpC96ZC96YCtUUqeRuRp1OdvBoSB6htDsrdSl5up/ZrubIxFK+XPlQf8OoX0DZAw0iB8EyGM9CcxJ7oKzvWxQl2fH3ZDemQShwyyGGe93tE5x/HpiijWDEf3Mym/xwKrX4q5lsYcU3Yvae0JrZljXbV5VCCHaDUkUnsILVEy7SdZD1lgOUpTcdosGAcDur/RAiuQkmEYs5Nk5EF4DQ2WZdU1nNYlZdd+9gmWdY7KdMybmqJrae2HNTxS+DybaZwyCEICpa59VBljqZpu0zX/94JAKh73uVTr8yBVITvRusDy+yHXEb8Z7PGPo6c3ev3aetrP22rWO8c9zHmu+gyp+3BJuw16tvytny9V7/IWKISUWOtYLisODhYMBwlte/k1q2kNi3nF0dGKomhuX2Ddx1fmLvzxHqx1zIuK18dzjPUaqs5aVlXDqmo2iwvrHG1nqNuOVdVQ1C2hVmRxSLLu7iq16ZyurZABOmP+Bpdxf5u42lfSw7iWsptTmhkEEMrks1i1y95RL4y8JXWUBB9sHon+XI6SkDiNSPMErfsJ7Q2tyi++8P05Y370rc7Za/8Hy/ZqlHXL8bzgzeGcn9+c8OPLY7q+abRGFGqe7Y/5z797wtePt3j+aMJ4kF4w8JAbrZk4M+kRa2YKm33QdXYTuvyhZtZ9QwgQShBIvXGmfGh9nKNnQHQ+7P0m8gOtFUkSkudxP432uuWTkxVZGtJe0cC8Ke5m0+7Ocq1ae0rVvaM2b6nNAXX3DusqrGsu5O404gjZhZTqFWX3kkjtEOk9YrWHFJHXYT3QRdMB83bFL6s3nDYLlJAXLNgTFTHQ2Qfpg18ytFQMwmhTYH1sgtVaw2ld8Xq14Kvh5Fp26J8SxlnmTc2bYsGsrjYWnFdBnS+wQj/BajvDsqhZlR8Owj46XfH2aIGUgiwJ2d26HzfLL/1eJBEMA099Nf3EMpSaTEebf9dCEivNbjzkq3z7Rq9fmZbvFu+IpA9AfZjFwDrHqRdlcTHCBgAAIABJREFUfy5TyFsP7MTFsF95LqCzD6K8mDl09i7WOtrWUNetLy6+8OnNWuTddg1l64uosmmp2q7XYvlF95oWHPZ6Fd13c8FTvbVSWOebI50xNJ3XBhj7N8hD+hvDdRsgjS05aV5x0rzEAakao3l4OrfS0gd/p+G1XEoFvuOvAkmcRuTjFKkkzllMazZOZr9G23Y+5HVeEoTaC/Bjn9Vz3jCgLJpNXtFyUbGcl5ucrTQNGW/ljLeyPvxcPrir6r8nrMqad0cL3h4tmC1K6vZs7RuFmjQO2JsOeP5owm+fbbO/PWQ6zsiSm5m7vZ+v1TsQ3tsnuRrnj1XxGStuP8GytKafAt/gwyt1FlqtejMqJSVoca+slztPsJxrMbagaH9mVv+RRfNnjF3R2RVCaJSIEEKzthmyrsZQI9EomRLKKaP4vyIjTaAm3gHsE4/9BWszBMVpu2DRrdBCE0pNcM7AYjsa8zzd/6stsAIpGQYRO3FGHkQfDedrjeWkLnmxmjGryyv5qw+FzlpO64qXyzkndflB90Dw+zQLQraTjEEYoaWibjreHS94ffBhk4aj2Yp3RwuSKGRncj8uVetz9EsusqSQZDoikHrTAZJCbEK2pRQESpGokGmYb6Zd10XRNYzDlFgFaHF5BtmngHdJ+zwUwfuA7GmO5/nsaxfBdXjvZXDnaHZ3ogc+AIQQRIFmkIQ0bUfZVCyrug+t9cRyi4+aCJQkDjQyPuuSendM//s41L2Oq8+P6b8j39n8D/wtoDYrjuqfeV3+iUQN2Ym+/izbobUiTkOSLEKH11ir9MerVP55g0lG23R067DdK87Ttja8ezPjlx8OyAYxw1HGaJJ6W+xzBdZqVfH6xTEvfj7i5U+HvPj5CK0UceJNB373h8f85vePSLMQqaIbm978B66PVVHz5tAXWEV1sambRAE7WznPH014/miLrx5vkacR4S2zn2yvwbPW0VmLdQ+ncf4S4K/vjtb0FMEbXOnPdL3SF2qd85b0kSKOrs6muynuWGA5OrukNgeU7c+s2u8p2u8R6L64ir09tIjo1Y10Fqxr6GzB/8/emz25caRbnj9fYkdgy5WLlpJqu6p7u2tm2mze+mH+9hnrbpsx69vdt26pJFVRErdkLthjj3CfBw+ASTFJJsnkIlUdGpiZQCAQCCAi/Ph3vnMas6QWMzw1wlf7RFgCoVDv2KpdCkEofYY6YdMWFF2JsQWB9PHV0xNXosOftXxQi6cmF6kfEGsPTyo6a640imhMx6ou0blgUZUUnbNEV+9xYAxPJyIcwSq4v1kyK3PqV1WwpCD1Ao7ilHEQ4ffua5u85mKZ7UrvVzGexapgviqoo47yBsrDr2spu+0xed8nSCkEgfII1NV9ZwMdchyOSHTAfpgy9p83VngZfKkZeTFDLyLWAfp9VKd7ffpTG+qfH8EScpulJXffI+0pwtDDdJblMuf0dNVr850srussy2XhrNx93TtmfrzvXfYEaxiFlLWT/1VNixCGToCnnetg4On+5qSAWsndoEIICLR7vOyrX7qWKKkw1hL2+2EbbPw+sbWkdq5pZuecZi8Hhu6CQy+Fhl4KD316TrhkhX4pE+dyHs51l8vWJecnC5azjCKr6F5xXn2Dd37p95vb662t2LQXXNT3ud3+fhdC/L6htHJyv8h/rSBvIVx2lh/2VTfLSyeAmqbl/HTFX785Yf/QhYz7gSYZBLscn84YlvOcBz+c891fHnPycM7JwzlSOdvvIquIk4DBMGL/IHXRFW8SPv4PXAtF1TBfZsxX+c7UYosw0ExHCbf2RxztpexPBldaiF8HxjjZdFk1zpWwe/9jhw8NS1/B2koEX+P9b8/BQoDva+LY3ylGtOfMky5PYr5xnuUbPWu7kRjK9gnr+k8U7UMEitj7FaG6Rahvo6XL47ks+TOmwtiK2lxQtI9oujmt2bCq/ifGVigZ4cnh22zWK6GlZuIPMViqrqYxTW8PrJ4JLxx6CbH6eVavYDt41gw8n0ngerE2Tc2mrii65y9OnTVkTY0A5lXBsiqZBBGR9gjUDfuhXAON6ZhVOT+s55yXOZV5+QVVC8kkiPg0HbEfxgRKI4wrzQ/iYOfEc5WrnDGWvGz6xvm3uwAJBErIpxWbVxybFrfvW2s+ePbYT3E3nvB/7n+JLz2OwtFrP18IwdCPuB1N2A9SwhcQuZvG1ipdyJ+nMffWuctVsNzvwzTi9q0xXWf4+i+PuXfvjLAPFq2qhrJ0rkhdZzg+HpGm4ft3UHwNSCGIfOduqpQkjQPWecU8K1hmJZNBxGQQEQeec7DsB6NSih0pQQi0FGglafr+yabtaHpzi1ESMggD/A/gJmk6V3Fs65aqbKirhrpqXfWiaWmajrbuaNuOtuno2g7T9dXHrpf99H/vHONM/7t19t9md38fTtovs/1999il59Vlw/xsxexszfxsTZm/XD79scA5hnUY2/Z5WR8GSsld/9V1ZrqtdQS765wksK1btOd6sgbjBD+8+tra9iHCD3+8QGvFwdFoR8ishbKsKfOa08cLvv/ulAffXzBIQ/7wHz91x0Hd4WnF7GzNv/+P+/z2q9uko/j6Ftr/wGujbZ1Z1laifRme1gyTkPEwJgy8t5r364whK2rmq5y8rJ1E7u8MuwpW2/UVrOujrls2m5LOWPamCcdHQ9abis3G+UXclNjyrStYVfeEZfVvtGaNlimx/pxx+EdGwR9RIoRLfRf9nBzWGop2Kyn8msasKKpHCKGJvU/fbpOuAS0UU3/IQMd9NcfAFTvUkx6h+vladjuCpQCfcRCxHybMq4K6615AsGxvJtGxqAoWVUnW1L31+YcgWIZZWTiCVWSvrGBp2ROswZj9MCFQmrYzO4IVBh5R4KGvsOBsmo71pnLa3LcsDwvh+sG0FNcydthajbbGuKyoj4hj3YmmjL3EGYjo168sb3u87sQTDsKU6D0cT1srfrVrGn7nL3nj2GVpyS2pkAyHIbdujfnhxwv++vUpm01FmoYM05D1umS9LhmkAXfvTrl9e/LREywhIPSdvG8Yhxgs67zi/vmCzliOJyl398cMQr9v9Ba70I+dHcJPP1x7KRjE9v14H+gLYIyhbTqqsmGzKshWBUVeUWQVZV5TFTVl0VCXNVXR9LlGLW3TPXtrO0zbuSDPztB1dke8uh0he0rGjDGXlu3vay891vWPt0+J2M8DFkOHsd0lS/f3D6kvE6xrTMZtyW7rPsumaUnCiMEoZjCO8V7gWts2hsUs4+GPM0aTxGXCKdkHp1uqsmG1yDl91BOsHy/4j//pc/7wx08pspr5LGO1zLk4W/P4wZzhOOKzLw+An1fczM8JbWco6nZnmHUZvqcY9nlXUeC9lQlS2xk2RcVsmZMV9Qfvl/8g2PVgmZ0k/Lqo647NpkRpxd50wP5+yoOHM/Kixt6gweUNSAQz6u4ckATqgIH/awJ1gNz1Xl2ybbTbQDyLJ4dE+hOMbVjXX5Ob72m6Jca++9k0i6W1HZWpWTUZy3qNxTL0BqQ96eqsIVQGLdTPJlj4p9judykE0zDii9GUomvIG5d19SIYazkrMr6enyKF4MvRlIH3bmWbl1E0Deum4sFmyZN8zawsyNqa9gW28b5URNrjMBqwF8VMw4jE85ypgobRIEIIga8Vvqf6C9SzaFuzazZO3zJoWPZ9I35v7PAqdNZStC2bpqLq2g82cLgKnlTE2kcg8OTrV/aUkByGQ74a3SH1IlLv/VzcndFFL795wQD7ZSfkDy2tE/15c7sZSklGoxhjLJ6nGKYRWVahtewdkJwjWTIIODhI2d9PGY3iG8vzeBd4dh9bFILQ0+ylsTtnpTHBNtx0+5zeyFtcuQ73wE4yJ16y3Btg+33petJUlQ1lUVPl9e7vumqoy/5WtbuqVVXUu8ebuu1vHW3T0tYdzU8qWD8lTbbbygp/UrW6VNl6tmplfrKMeabK9S6CXvN2wcPiz7Srv7GlwKl3wNg7RgrFrLrPrH74xut3BheP6GyL/YARIlJKtK/wr5lhZYylazrqsmGzyJk/WWI6g/YUcRpifhIlcLnnsm06yr6XJwx9otjH8xTGWJbzjB+/P2c+ywgij1t3J9z+ZMqdT/eo65bJfsrp4wV/+/YJ88cL8qyi6z6ea8svEdsJHSGfv+4Y6/qFmqZzx/QbrH/7PSmrhpPzNd/+cMrpbEP9AlfZXzIs7ry2rWC9zg71PEUcBzRtx3yRUZQ1y1WB6WXnNyV7eWuC1dmcqrvAV2MCfcDA/w2emvT2qS/aSoGSAyL9CQJJ3vxI0y1pzRprm7fbpOtstbW0pqPsas6qGT9mJwDcjY/xhEdjGmrTYKwhVO+PWLwrSCGYBjFfjvZY1RWPNi83fLAWzoqMf5+dEijNfhRzh9eXh70p8rbmSb7hx82CJ/mGeVVQtu3O5e6nCJRmEkQcxgP2w5hxEBFr3zUwIhgOQuI+CPJFFQ0lRJ+FAMO3JFhCCLR0/SP6GhK1zhrKtmFd11Tdi4OUPwQ8qXYk8U0qAVJIjsIRQx2hpXwvFSwEu6BfKV8+T3gVmX3/3TpXQFzu4xM9wYqIIp/xOObOnQlF0VDXLXXd4vsaz3PWs8kgII59/Gs4nH1s8D3FNI1JIyfp9a+oEFz303kXn6K1zqUxWxes5jmL8zWLiw2recZ6kbNe5GyWOetlsSNVTd06smQuuX1dIjnP9GT16avbfiw3m9r/vW2u6nurtj1X2xnX3eNX3Gcv3Xe5H+smkbVzHuT3mC3XvXJFcCf6imAQoYTPw/zf+Xb9X954/ZUpyNqZkwl+UImgwPM0nq+R1yBY1hi6tqMqajaLjNmTJVIKwsinHid0reGZWYPt86ylbQ112QJu+ThxfV/WWBaznB/vnbGYZ0SJz2RvwJ1P97jz6R6msxRFjdaS+9+fs5hnFPnfp5TsfWIrYb5qnLFzeG16QvCGsEBZt5ycr/jL96ecztZ/nwSrz8Fq2y1hvf4+9T1FkgSs1gWzWUZVPw2BdvzqI3ARdCf5DmMrLBYpQrRMe5OK55s3L/+9dRHUMkUI7ezcabDv4cTZWUPWFczqJasmpzINErkjVkVXknclCEhNfCPNbh8SAsE4iPg0HfMk3zAKIgKlaI29krRYLPOq4N5qzjiI+CQdcxy7/plQ63ciubHW0lmLsc7J8PvVjG/m55zkm1dmcsXa4zgZ8Fk6Zj9KiLSHp9zAzEonQ7K+djPDxriLVtPS7ML/LGXlSvo3MeOvhCCQamcq8qr91RrDpqmZlTlZU/eOQHYndXuXMNZQdg1l1zhSKDWeVLsUJwsYbP/7mxAsJy18E3nh20BwaRbxBZttMbSmobPdbj8roVBCf5AA0x227pM/2fbtxVv0U2zbAVhVtzsS1jQt2QbapmMwCPG8l010fTx4uv8FkS+J/DdXDdzEMdP1fVFN3VJVbV+VcoQp31Ss5hmrWcZytmF5sWG1yFkvczbLgk3/s+7J1U+lQr9UWCzGtnTWEQKBwND1ipGaVXvOafk3AjUgVAlKvN5n3NkGS8eHDqkVQqC1cym9ngRX7CZKXNxCR1N31JVzEjTX+H4IQf9aztCmbTsW84xH92c0TcdoEnN0a8zB0ZB0GGEtBJHHxVmEkIIyb2iaFzsW/gM3A60kYeAR+h5aPXsNqZuW1aZgvszIi5quM7u8q5eds+zOrMa6jMC85v7JnB9P5tw/mbsg41e0T7TGOAlyayjqhqJqdrJCJQVR4BMH3s5M6KfbDo7UbYqKrPw4ejbLuuFinXOxyllm5Wvllyol8T2N72mn/ujMjhh7nnrGvfdt8NaNNUJIl12FwNJibIWxAUq8/EC21mBsTWdLwCB2g5p3PxjorGFZb3hUnNHZjomXEiifUAU0tiHvSlZNhhSS2rT9APOjmNd+IwghSP0AKQS3kyF7YczACyjahqJ9vlRtgXVdYazlh/WCe8sZ0yDiKE45Usk7CXe0OFOLsms5ydb8eX7Gv12c8CRfv3K2deD7fDoY85vxPnthzItqRnXTUZQ1q6xksSpY5+VuhrjtL1pJn6S+N349t7zLUEISas3ACwiVdjkLvHhIsO1586RiWZVUXev09lJw/ajkN0NnDbM647RckeiAqT8g9cKdSUdjOqqucZba0vuoJWdPsQ1n3B6zV+/DzrZUJqcyJRKBEBJfhh8swPQydif3/qcxhiyrWK9d2PDp6YrFMt9VsLSWKKVQSqCkJIp8vvz1Ib/+8uhn8pl9XGjqls2qYD3PmZ2uuDhdsThfMz9fs1nmFJu+l6psqIr6GUlgU7fUVev6nP6OBrShGrAfDJgk2xlgwdS/SyBjKpPjpjQMA73HYfg5oXq9rMFNc8Fp9Tc27cUHvRpv+yOVElfKzX+KbWi4H26DhkO0pzCXg4avWo1wTqierxFC7Pr5ts9bzDOePF4SJz6ffXHAJ5/vMxonCCmwl6SAts9J+qiae3+hCHxnZJEmAb737DWkKBtOZ2sGccCnt6Y0beeu8X0O08uwrX6fzTb88GjGd/fPuffgnNPZmrJqX0kumrbjYl1wscp5PFvxaLaiqBrnoqcVd/fH3N0fsTdKmKYxgysI1rqo+O7hOT+czl97v7wLNG3HOq9YFS6s/nLm2CvRz73Gsc8wDZFSUlYNZdkQBDc3znkrguUGMNr1W6EwpqI1a6TwMMRI27+TZ2D7ma6Kzmx6WWCHEgFS+O9l5rizHes257SckeqEvWBEoiKUcFWsoitZtxme1DTW9cS8bKD2sUMAA88n8XyOkwGH8YBpGDMvc8quvbIXJW8b8rbhwWbB31YpkyBCCsEoCAnZJo2//V7Zzs5sHQxXdcWDbMVf5md8PT+jbNsXOuvJfmZw5Id8ko75cjRlGsbPVIwu69mrumG5KTmfbzi5WDFf5s9IbywwHSVvnYMlpSBEk3iu4udCUeULM3kaY1g1FeDcGzdNTdm1BGgutz29i29faw2zasO9zSlTf4CWilB5ffXHBQUv6hwlBGM//iBmJ28GdwZ92SxUZ1uKbkPerZAopFB0qn1uMkUIiUS9/+r1JWtxYyxZVnF2tubhwzkPH86Zz7O+Kvv87GUcBwxHEb/6/OD9bvML4I5z+xOFgtj9214XnJTN9udc0Qe/i11P2jvbtr4/aSvlWy8K5mcrzh4vePj9GQ/vnXNy/4In9y9YzbO+f+rvT5bzMgQyYepPuB09dQGO1QhfxlRdvvtcB96U4/A3pN7ha61/Vv9I1s3J2vmHJVji2QiFV2Eb+uuHHmESkgxjgsh351j7dJ3PPa+XrUexq/QVec16VaCVdARrtmF+scYPxoynCbc/mZKOI6QUTjJ1yfYf/sGv3gcCXzNKQ4aDkOAn+VZF1XA+zwh9j/NFxmpTkkROyq1Ufx689DXYjo22luxN2/HobMmf7z3h2x9OeXCyYLEudstLIV7YXlA1HWfLDfdO5nzz8IxvH56zyksEEAce//TpEXXbYfu/B+HzUv5NUfG3xxf897++eR/lTaLtDGXtojkuVhnV65yPnRIb39dMJgmDJGA2z5jNsl0F64PbtIPAUyMifRdjK/L2R0zREHufEXufoWXS27RvX8ZiTEVnS6rulLz5gaK9T2syQn2HQB+h5PuxRd9e2DvbUXU1W2ttKQR5V5F3JQMTY6zpKyI/T3K1xXbrp0HMV5NDmq7j32enrJqKputeWF1ZViXfLM5pjSHrpXqHUcI0jIm9t++naY2h6Fo2dcV3ywv+trzgT7NTHmdrqq59YQ6ZAEZByDgI+Xw44ZN0xHGckvrBlQeDtZbFuuTHx3PWWUnXGZI42BHFummp6vZpr8JbYDsw9KQi0T6TICJvGrKmpr5iMLy1G626joebFf96/oi8bfi0lzy+S3TGcFqu+Hr5mLvJlEkwYM8f7PTMP2bn/M/FfULl8R/Gn7w3k4q3xrbH+MUKQWpTsmrOmdWPkUIhkAQqIpAxnnz63R7oKUNvii8+3Htv246zszXffnuCMZb9/QFHR/1A9oo3GASa46MR+oYCE28Cebcia5cY2yGFQguPQMWEMqa1DbUpqUxO0W0ou4xEj0jUiEDFeMJHi3fTv9fULdm6JFsVzE6dffnizFWrFudrlhcbFrMN60VOvqlom+4fvSxXQAmPUKUM9N7uPk+GTgooRP+Z+24Zb5+R/3oEqzIZQS8tFC/t8X632PVGXtOhtOvMrg8vHoQc3JmSjCIG44R0OiBOrz6vaE8ymiTc+XSPtu345t8f8uCH813u3enJkmQQsncwZDIdkA4jgt6drq078qyiyGssljDy8LwPMEn0d4Y0Drl9MGKxLrj/eHEpUsJ9D8q64WKZ8afvHtMZw94oYTyMSCIfT7soii0xbltD1bQUZcNy46IrHj1ZcP/JgotFhgX2RsnODKluOvKy3vUTXUZZNzw4W/Kvf33Ik/mGi1VGUTeI/rF7JzPKpsUYw2QQsT98ftxRNS0X65wfzxbvfkdeA8ZY2q6jaQ1Z+XpOimXVslznKOV6sUzsUxQ1i0VG24YMBiE3MfJ6a4Kl5ZDI+4SieUDe/EjR/EhnMye3UVO0HDm79n52sjUrmm5F1txjXf2JvP0BX02I9F0CdYR6L4MYN/8lhXAGA6bGYNHC9csUXUnellRe3ffC/DJOSgKYhBFfTQ/xpGLdVHy7dOTpRY5qy7rkm/k550VGZy1aSlpjCLV3IwSrsYZNU3Ham2r8tyc/cn+95LzIKNsXO+ptq2mfpGM+G074ZDDmOEmdc+AVy1sLy3XBD497zXoaMogDtFJoLcny2pXZnyZzvjEEvWmGVC7oOYhYVSW16a4mWLgKXtW1PMxW/I/zxwgEQz945wSrtZ0jWKtHGCxfDA6fCaL+Mbvg/z79htQL2Q9Sfju89U6356bg+tdePgRrTMWyOee0+nFHirXwnw4KexyHvyJUCb78kATLcH6+5ttvn3B4mPKb3xxz1BOoq4JDlZIMh9FHEypqseTtiovqIa2t0cLHlxFDbw/teb2BwZJ1O2NRP2HRnHEQ3GU/uEuKRSiJ5t0RrNUs4/TRnHt/fsS9rx9z9mjB4sLJAbveoXFrb25fM9Ty7wVabgnWdHefq/7K/vjSaOERqgGpt8/QO3qt9eftikAOkNLr1/mhIBBSIsX1KlimMzS1y6eLBiH7d6aM9gaM9lPCJEB7Vx+jSivGU0ewZucb/vKnh1SlGxQjXPB4kobsH6RM9gYMR7Hr0xIudiTPSoo+4yyIPPQ/CNY7xyAJuH04Yr7OSZMAKaVz8LSWtq+OXywy/vTXxzw4XXDncMSdwzHTUUwUut6trelNUTWss4rFuuDkfMnj8xWbvCIr3GeaxgHTUeLiSJQgyx3JuIpgFXXL/fMF//rXRxR1Q1k3tJ1TZkkpKJuOJ/M1g9Dnd3evnviom46LVcb904+DYLnujm2Vz7yWcUhVNSxXBZ5W7E0TrLEURcN84VRNe3stfcziW+GtJYK+2mPg/RqJJmu+pzEzyvYEazu0HKBkghQ+20FrazI6m1N3C1q7QYmYQN0i8T8n8u6iZPx27+ga0EIy9AYch/s01rnTNaalE517T9JjPxgz8YeEyv/Zn5Qub3+kPA7jAbXp+Hw94YvhhNMiY1mVlFdkYzXG0JoKg+VvyxlKCFZ1ybwqOIoHJD3RCpUmUL0crq8Ebk0aTG9e0VpL03U0puv7vxrmVcGTfMOjbM2fZid8v5ozKwuKtrlSGigAJSWh0txJhvxhesRvRnu7YOGXYZv6jYA49BkNor707u6v2w6vTwXfpnz/dP+9zv5WWxI4GO0kl1nz4gbRzhrOy4zvFq765UlF0TakfsDACwiUM6HQUj4j0YSt41ifDtPnanW7ny5fq7Nm95gvFbHnY6ylNA2rpiRvazprnpHIFV3DvM52BPDnBfHMj59CCY9Ypwy9/V1FW0sPTwQo8fS7FKr4mQDyD4HtDGjbdmitGI0iDg5Slzx/RZVKCIHf9258HLDUpiRrl7S2IVIDpFDk3QpjOyqTk3Urqi5HCsXQ20MgyVsn39TSJ+Ttrw3W2J0NunP9y5idrnjycM6TBzMe3Tvn0fdnLC42ZOuSqvg4Grp/HhAo4T6rn8KTIRP/Nnfjf2bP/4RQpXjy9YxvfBUR6xGpnuKrBHGNCIx3gW3yw3VffptjJ6RwttJ1S5nX6HWBBaIkuDJPy/c1+4dDfv27WzyMZ0ghWPeydiFhspcy2R/w2ZcHjCbxM0St64OGBTAax9z9dJ/xNEF7H09F+5eIwNOQhBxMUj67NeV0tmG+zJmtMpq2w1hL1XQs1gV52dC0HXlRMxxEBL7G99TuWl7VLVnRsMkrLhYZF8sMi0VJyWgQ8enxhDtHY8q6oawazmYbNnl15XZtCV7VtLsg9m1/qLDOgEMKQd10L3RrNtZQtx3l6/Q6faTwPEUU+hhjWK0Lus6w2ZRYa2/M4AJuoIIVqAOk76NkBEKQNVB3M7Lm+36mRV0arj3V4SsR4csxsfc5qf9bBv7vXMVLvF3/y3WgpWY/GOFJzbxeMqtXZF3pKjnAyEsY6gHTvjfrlwRfKVICDqMBXwynXOzlfLs856/m4kqCBY4aV13Lg82CdVPyMFvx3eKCW0nKrWTIrThlGkZMwohE+/hK4UuFFBKJkwHWpqVsW9ZNxaapOc03nOYbHmUr7m+WPNwsuSgLLqqcqm1fmHklhSSQmtQL+DQd87/t3+KL0ZRx8OrPSUqJpxWeVozSiPEwYrbMWawLsqKiKGu0FDStC58Wfa/Zm0IKyTSI+Xw4ZdVUnOUZkL9weWMti7Kk7jraviftUbbi03TMZ+mYcRAy9ENi7fdE9hLBwtJa55LoSLFxFbOupepaatNRde3usaEfcDsZIuU26PipzenLsqN+NhCXbi9AqGL2/DuE6uk5x1VWfkqwEjzxfqTLL4IQ4Hna2bAnAWkakqbhzp3squXlNZqn3yd3PRLNAAAgAElEQVRaW1OaDGsNoXJkKW9XrO2c2hSUJkMJzdg7ZOQfsmnmbFrXUB3r4ctWfW0Ya50zYNnw6Pszvv/LYx7eO+f04YyzxwuydUm+LqnKhvaKmeB/4M0QyJij8At8GTHxbxO8wUSqFj6JmjD2bhGpIfIDOn3uzpHX6cFSAu0rlJLUZcPqYk2ZlawXG0bTAXu3JwTRFaTU1xzdGrvjfRSRDiNWi9xl9QBHdyYc3x6zdzhkNHlW6WB70yblSQ6ORgShx/7hEM/7ufTQ/jyhlUQIzf444TefHWKM5S8/nJJXW4WM7eV/HcZYzucZWV7je+77oaTYxS90XT8h3ThpYVU3JFHAcBBy92jMP//mFl99ccyTizUnFyva1nA231y5XVK6HNA4dJOqddvtJrAFAq0kga/x9Ktdj38JiEKfvWnCelOxWOQ8ebLCWovva8LQ6z/Ht3+dt5cIigSpfSw1rdnQ2ZLclLRmg7EF1ra9tapbXggPKTyUDvDVHon/JbH/BbH3ed9/9e4/XCnELt+q7CqkcF9KIQQKV926Fe4z1MkvIgfrMrSUaCmxRHyWjinbxrkqViVF29B05kpy0xrDeZlzXuacFRkPN0uO4gGfphNm6ZjDKOEgTki9kFBrAqlR/cxd03VUpiVvahZ1ybIqebhZ8XCz5MFmyf3NksfZ6pXmuxJBqDV7Qcxx4gjib8b7HCfpK0NwBRD4ijQJCXzFOI0YDkJWWUnTdk/lgaJvuN8aO73F11EKwSSM+NVwwnmZcW85QwvpKnpXvFMLZG1N1tbUXcemrjkvcpZVQdk27EUJ0yBm4Pl4UuIptVtLZwyt6XbEqukMZddSdQ1l11K0LWXX0PYE6zhx/WqjwEciUL1cNm8rlk1OY3xa5VGZZhe8XXYN6+bFAdWvgu770vQbBBa/C3gyYOTtk2iX8WaxaOHhSR/59garN4qtDbvXZ1u1raGqWjfbJp83mxFC4HkgpfooSJYFjO1ojJth3c7S5t2avF1Sm5LalCR6RBgmHAaf0JqKWf0IAbTm7SpJ28DeumxYzjNW84x7f3nM1//9B+5/94SLJ84l8OcGsT1JbeWwW2OU3kVzV8QVl5aBp1lc9uYDh6+ClgFj/zaJnuLJEP2a1StwVbDU26e1FYkeI8UHOkYv9XZe59ASUqI97SR6fU9OU7cYY/ED74VmKVpLxtOE8STB8zVB6LFeutl2ARzfnXB8Z0IcB8/lcQkpUEoRJwGep9g7TNk7SPH8j+Pc+0uFUhKlJOM04vPbUzztxj+rTclsmbkKUuNUMp2xZEXFZutm3GPbUyV3mVoSrSRJFLA/GXA0Tfnik31+9/kRX315TBz6CAHzZf6cscYWWklGScit6ZDFpsBTxc51TynJZBAxTiLGg+iF63jRej2t8JTst/f9VUi3ahxjHGHcVgivgzDUjEYxxlqyrGS9KUlin0GfIXlTctq3Dhpu7YamW9CZAl9NSMU/Eem7jMwfMabE2BLDdiZQoESIEiFajQnUPr7aw1f7/cny/YwEWtMxr1ecVXPWbU5tGgLpkeqYVMeM/ZSBjvGV37tY/fLgSclR7HqWatORtw1SCM6KjIvyxVUWcNWsZV3SWUveNpxk651LYaDcANoF7AqkgM5al8NgOsp+oL+sK1ZVybIuWdfVK8mVFo4YHkQJf5ge8YfpIb+d7JP6wU4y9zIIIZik8e6ktzdKCAJN1GdWgMvLSpOQOPT7gNq3+z4qIZgEITYd8zhfsx8lPMrWlG1D8Qq5XdW1zKuiJz01DzYrYs8j1h6+6snr1iERfiILdCfv1pqeUHU0/e/ueZLftwfcSYZMwoBQ+4z8hKpr+GZ1QtZWjPyYkRfxuFhQmYa8lTwsZvx5+eYOQmM/5jAcMfbfvQz4OhDIvmF+e4xbnDG+7P9ylUwp5O6+DwlHSlwv1p///JjHJ0uCQPeN7c9Ca8XhYcrBwRD5kRBadz5QOx1Dh7PJz9ollSlobYUUsv/d5ZNdrqy+DaqyIV+XzM5WfP+XE3749jEnP844uX/B/GxN+QJpzccKJ1GTu+wWqeROhvb076cDtO19W+e6qmp2OV11db0sprfaXlx/o5DCHXNvcDz5MmLq3yVSQwbe3jNV5o8Z2/y6IPbZuzXGDz0n8ZaSMPGJ01dUxwUkacjRrTHjSbKTdqUjZ2pxlZthFPvsHQwYpCFd5/Kv0lH80fRk/tLhe5pJ3xNnjGU0iDi5WHE+2zBb5Wzyik1eOWLQuGrWlrQrJXcVpSjwSCLfKW7SiOP9Ibf2R9w+HHHrYIjnKZLYZ5zGpIPwOWv4LZLQ59e3nRT+yXzNk8WGomoAR+SPJilH4wFf3tpjnFxftTWMA44nKXvDhCjwiHzvvU3otZ2hqBryquFkvuZktqaom2s9V2tFHDli6nuavb2By8XyNXHkE/g3c255e4JlNpTtExDgyTGRvosUIVIEGFvSmQxjt7OPAiUHruolnSW7ENsBzfsbwLS2Y1av+CE/cZpLBKmXsO+POYr2CKSPLz3UL5RcAXhScRwPOIwSatOxaWrqrqXuumsQrI6661jVFSfZ+mlY3paSiOepyTYozxEpi7FPrZuNffUQSklJoDQHUcJ/2D/mP9/+FZMwYugH6Gt8TkLAeOh0zkqJvpkUosAnDDy0diQtTQJHsG7gLCGFC3hOvYBH2YqDKCH1A4y1ryRYrvrk8rEebJZ9T9vT/QxPpyMu77vd7z/Zp7b/P9IekfLwpORf9o4RjImUz9iLKbqab9YnPCzmHIQpB0HKSbFwOVjAw3xG/BYV3U+SKbEOPiKCJVBCo648DTqiaujAstv/Hw521/x8fr5hNsvwA006CBmkwe67sUUQeEgpmE4Hfdjwh4Xrx5RIoTDWhcV2tqHqCrKuJ1imRqKpu4LWNBjbYtka8LwdyaqrhuUs49H35/zp//sb//r/fEu+cT1WTdO90OTnY8TWxU719t9KS5SnUFr1eWjy6f3b+7RC9/dZY9msS7J1QbF1RXzHjvPuWPN6UvRmx1EgY7wgZGJvIz6SSY/rQAgQShJGAX7oMz0aP/vYNWb9k0FInATPWUe/KOg4inyC0OvjR9xzpLhebtc/8PbwPcV0GDFMQkaDkM9uT7h/suCv98/58fGMs3mGEIK8rMG6TKftce17Ct/TpEnAOI3YGyXcORpz93DM3WP3czyM3MSJgDjyGQ8jhn218iokgc9vbu9zezri/tmcH08XbPrAYN9TfHow5pPDMZNBRBpd/xo/jEN+dTzli1t7jJOQ0SB6b/YzZdOy2BQsNgVSCObr4toEy/Pc+TCKPMajZBfFtK0efhQ9WBZL0y3I2+/pTL6T/7ng4acuXO7C6nKuPDvEyCHKRv19we452P5E844/HyUUYy/lTnRIY9xMqUSSdQUP81OkcEYNiY521axfGoRwsjAFHMZJ7ywonWGF1szLglmVU7/Awn1XNdkGSL0DSAS+UgRKc2cw5JPBmN9N9vnNyAUKx9qR4OseDNvAxXXekJcryrKh6Tri0MMYjbEWT/fBwDd0gCnhZo8PowH/vHeMsZZvFxd8t7ygMd0Ls7HAHV+ddRXAm8I2QNj1G1o8qbgVjfiX8SecVSuWTUFjWlZ14QKQm5zGOPOXeZ3xqHjzkMFE+1Td9U6A7wPbOoq5QhK7zcgqu4xIpSR6iBQfTi4spSRNI46OR1Rlg8XNdEaRRxj6z8lZA39ry/yBNvg5CGI1ZD+4Q2NqlNAIBGP/gEgNaG1Faxq09DEYTssfqExBpFJiPXxtQwRwzlJlXlPmNY++P+f7vzzm+29OePDXU9aLnKZuXdDrO5bICSF2ZMf3NV7Q33ztLvSeQnt6t8xWZqS0q0pJJZ6pVj1XuVJOPuqWlc9WsPp1bdcjpaSuGp48mHHyYMbFkxV13b6HTC8XMry16Hfdua9rHiRRyJ9dYsrT0HBccPw15ztMZyjymqKo3z46RDjSFcX+lYYaHwOEFAzigMO9lN/96gjPU/z606c5fqM0YjKMuH04Ym98M+66UgqS0GdvnPDbzw9BCH772VMXvTQJSJOAu0eT13rNbW+sFpY4cooYYy1aSfbGCausZLUpqZvWGUt0ZlfB0r1dexR4xJG/cwucjmKmI5fZ5PcyPmsNkZcxSZ7wxdEj6t8/5PboDKGOQR3z1Zf77I1DPK2IEXha0ZkRgad3ZhVaSfaGLmA48l3/0XUReJppGnNrOmSSRkwH8Xu75pR1Sxz4hL7H/bPFa233lkiB4F2qGt+6gtWYOXnzPWX7mM6Wz1arRISWCVoO0DLFk0M8NcaTY7Qc4skhWqYomfTVrOuqmt8OntQuXFhH5F1B1pZs2pxlk7Fpz/qKiuEwnKKE+kUSrMvYDxNC5TEOImLtEymPb5fnFF1D8xIL93cNKQWJ5zH0Q34/OeD/OLzLb0Z7HCcpQz909qSvcTS3naFsOs7mG+6fzFmsCo73U473h1jrrG11PzC5KWxnRQ7ihD/u3yLWHq21PMxW0PYZWB9w9tyTijvRBC0UP2Tn3MvOOC1XFF3Nqil2RAtgXufot5Dl7Acplfl4jAMshta0dPZ50rfNyFo0Z0z9WwQqwuPDESylJKNxxJ07E5p+MCzEU83/T+F7rln3Y3ERFAgSPUIISdXlVCansy2JHhPIEIOhsy11V7BpFzwq/kqsh8R6SNr37bwurLFk65L56Yp7f3nEv/23v3Hv60esFzlVWe/6kN41hBS7HprBMGIwionT0N0GAVESEMUBQejhb2+Bhx9o17vj9yRMuyqVlI5Qucvl0xnXXZ+VuKQkuPTYdvlsVfDt/3qABZqqZT3PePPOyuvB9hXL1tRo6SOE/3PjSe8dbWtYrQouztZvfQ2WQjA9SPF8/dESrK2CJPA0o0HEr+7sUVZPz81eX9mJAo9BfDPnYikFSRw4aVjo8dnt6TOvqbXC05I49EmT1z8HCeiDhF2v0jiN+bx2Tn5t29EZp0q4rDfZOgRvpYJaSQJP4/vu/fvP9EhZIn+FlzwiuP0DR8mPZF8uEf4dhP8pw+Ex01HcT7IIPOvI23gQ7mzNZV81Czw3ufw645/A14wHMUeTlGkaMRnE780ko6wblx0mJYMouPI6+KHx1kJDITyUiFEiwtL1phYt1nYYoTBW01mNsAphBbYzGOsMMRq5RIkI1UsKPTXunQTfbfaPRBCrkEgFyEbQmBZjDZs257SaszU5CFVAbT6eGfd3haTvn/KVorOmN1BwX9bTfEPW1ORtQ2M6mncYsClwB3ugNKHWDL2Aw3jAUeyqP/88PeLTdEyo3eOvA2tduNxilTNf5izXBZuiou0StJLOutk8zbu5iRTvy88begEqHSOF5KLMuSgyzsucWZnvAojbDxBeqoRk4juCLYTAYgmkR9HV5G3Nuil7y3hNqkP2gjd3+Uy9EO8D251fRmdbKpNRmeclsVVXsGzOWdRPCGVC5x1ee+b5fcFaNwhr2+e/N9a6CYWPSfnmQmaTvjq4pjIFWvhIoZFYJBIjO1fdEoJAhgz0hEQP8V6jemiMy6uqyoazRwvuf3fC3/79ET98c8KjH87fCbGSvVxPa/W0QtWToyD0iOKAsHeDG4xiki3BSkOi2JGsIPQIIt+Rq1DjBx6er3YGCTuCpcRbWQkvZxnzszUn9y8IIv85g4R3gdY2bJoL1u0FsRoR6zG+DJFC/2x6qd43mqbj/MmKe98+eXmI6lZE0h/s1vLUhEM6hzjP10glGY1jgkvqoo8JQjjpfuh7DAfvx7VVCkHgawJfM4gDXi+Z7dUQQqCV2JGk9MaHtgJPSzw0oRLsxS2YBhH4EEwQagDCeyZTwNeKwWvIAF8GTymS0GeUhAzjkDQO3hvB8rTsY3Y6Qt97xlX5Y8Fb5mApYv0pItK0ZoO1NYbaaedt0/cvdE5HjwGc1r01GY1d9USsxdgaY2vS4PeMw/+Elu+WYIHLHDIYyq5m0+as24y8K6lNgyc0nnS3X6rJxVWI+mypSHmMgpA7yYgf1nN+WM15sFmxrJ0pxXWdWl4XzuFQsR8l3EmGfJKO+Cyd8Hk64fZgyHGSEmqN9wY1XYtllZU8OluyySoGccBoEJHGAV0f6rfalHieYlonu4DpmzpmtVTE2skx/7h/i6Ef8M3inG/m5zzKVsyrglX9/hvtBQJPuQHt7cj1Y32W7PdkuuO/KM2szoiVzz+PP+GPk0/f+LX2gsFbEbSbRmtqNu2cdTN77rHaVKyaczbtgtrkGN4/+b2MrjMs5hn3719Qli+e9NkOuqPIZzSMMHcm72sTX4nW1pTdhqxdsGzOydoFa3mxI09bF8dEj/k0PiZQMaGM++Dn61+qutZQ5hXLWcYP3zzmf/23v/Lg3hnL2QbTPTtbfFPQniYeBCTDiMlBymQ/ZThNGI4TBqOIKHHVKj/oidNWIuj35Km/KbXtnZIo1ZOpnWGFM6n4WKqSr4O6y3hS/pUH+Z84CD9jP/icVO8TqgHqFfmFf6+oyoaH9y/4H//fvSsnUbbY9mba3hHS2q1hgsDznZNgOopI0pDbd6cvXM8/8HOEALkHWiIwWLNy94mI9+XI7WmJrxXqPff3CcSuMqjVzY3VbhJvd2YTgtC7Q+jdudSHY+hs1VepVjRmSdMtacyK1ixp7YbWbGjNkqZbUJsFdTej7i7obEHsfUHiff7Sl5VCoKXEl8plLnUvnlr2pOr7dJ7eZ3s9eGNayq4ia51MsO4tqUMpCaVPIP0bM7rY2m5urar9/vYi+Ert+oveV3N9qD1uaY/jOOU4Sfn1eI9v5ufE2qOzLni3bHvZ4HaYcqmJ9rrDFrH7+dQ62Fnne4RacytO+f30gK8mh/xucsDvxgdXhuu+DqyFTVZxcrbCWjicpkxGEUpKOmPIy4ZVVuB7mrJu+llAe2P7fmuP70nFwPP59XiPSZ/dtXX/y9tmtz8t2wnJ19u38BO77ssWzojejbH/buH2py80vtTEOuA4Gj+zrvNqw78tHjL0Qr4a3eY/H/3+WtvwtAL4/PZvM8Yub+yHMJBobUPWrlg0Z1c8VpO1C8puQ22q3pjhw6HrDKt1yePHC4orwm+fnfMQJEnA3btTp+3/KGBpTE3RE6xNO2PVXGwf2mHo7TENbnE3/u3rv0K/E9qmI1uXzE5X/PDtCf/2//6N+dn6ucr022Inv5OCMPYZThKmRyPu/OqAO7/a5/DOlMPbEyb7A+JB+Gq3uF8walNwVt3ju/V/pTEFngjwhI+WPgHvfkL154imbjl9vOQvf3q4kwVfBWNcBIHpXI+xMU/7osPIYzxN2D8ccvezfdr2w57HPhY8Nc559jp1aYn+p8BpnsSle3/63MvLu97C55f/6Xn42eWff+x62+NkwVOQU6xtEeoR2AJEyFVJ2M++76u2/9n19y/y3Hq2kFLgqS3Bel/2Fk83S/XZpkrKl24n9O99O75yuSGvmGzb9ry++bjzxqaOLNtKVEVrMjqT9eTKkajWLGjMktbkdCZ39u22RqDw1RRPjgj1MUq83CLSV4ovR3v8X3cNszJn09RUL3FkC5Tmfz+4w8ALdtr0xnYs6jWLZk3ROWvgqT9k7KcubEx6+NJj7A1uLGg40h5fDKdIIfj1eI/zInupk9w4CPlqesQ0jJyZw3vMFwAIlWbkR3yWTlBCcisZclZknBVZb61esq5rirYhb2vnLGg6WtPriu1T2iV7S3G1JZdKEfYywFg7eWLq+YyDiEkQcRQP+hDjlL0wRt3ArG3ffoDsg4SrpiEr3IGplHPzyYqazliXM3KDTjKXIYXAkwqr4bOhqy7cTUY8KTacFRmrumRVV2SN27dl60KC694Qo7Nmt2+ttc5EY2tY0pNQLaRzXZQaX7t9HSjdf6YhQz/g99NDDqJXD2x8qUi0T6z818qv6mznso1s3TsaWjrb0dkWgSTWCbEafFBnPl+GjL3DKw0UWtsw0FPydsnYv3qZ9wnPUxwfjfjDH+5S/zQA10LTN0uXZUNRNCgl8X390VQ7LFCajGV9RmNqRt4hE/+WOy4vfQdCNWCo9978dSyslznff/2Y7/70kIf3zinzuh903gy5Ulr2cr6AvaMhe0cjpocp431XuRpNB4z2BqTjmHQUEcYB+u88f8gd/y2trRFCEagBgRqgxMcpV/sYECcBv//nuwAvnSjZVq66zlDXLU3dMr/YMDvfYK1lup+yfzhkNI5R+u9HkfNyVGDWYNdgVmBX9EGY7qdtgQbkEagjEEMQPiDBnEF3CrYE6n7ZnkTJfVAHIFIQAaDAPIHupF++A2vcsth++UO3rK3cbbc9HTvyZRugddUqeQRy3G/PG1yXzLl7Dya7tP39NskxyEOQo377X75+V8FST0nOe4TrU3MET16D3HVtR7EpKTYl64sNq9maqqhd29IVkvFoEHL8q0OOPz9EqA9KsCzGNnQ2pzVrV7HqFjRmQd3NacyCppvTmDmdreiMa6kVQjtnQTlCiwGBOkbJlxMaTyp+PdrjdpLSGNc382IfNsfFUz9g4D9tqu2sYdlseFicoYUiVD4Tf0TquRwsIQQSiRYKX97MLoq1z69GE24lqQuCNS8PRdNC7nqjtoPo94lQaTypiLXHcZLyVdMwr3JmZcHjfM3DzZIn+Ybz0uVmbZqaTV1RdoKarnepc1B9hpUvFYnnE3seIz9kHETshTFH8YDDeMCtOOVWMiT1fELtESqNr1SfQ/T2EH0GlLUdZd0iReX6JpQkLxzB2vauvKv9LXhaVf08nXAUDVhPK2ZlwUWZ82Cz5OFmyVmRMSsLFnVB1tS7Pq2m62h7kmWgr4o54uqpvjKqNL5UpH5A6gcM/YCRHzIKQqZBzF4YcZyk7F+DYHlSEauASPuv1T/l+mxysm6D7eW4jampTIVEss8RkUo+OMEa+QcM7PMyus425N2aol0z0JOPg2Adj4gi/7nBlrWWPK/J84rFouBitqGuW3z/ZsISbwaWsstYNmd4MuDQ/4yJf4wUsneUc5BCvfG+tn30w2aRc+/rx/zP//od5ydLyqK+0ZwnpRRREjLaG/DlV3f49b/c5fiTPaYHKcNJ8lTut7VK3+ZP/R3DZcq1NP3xH8iEQCbofxCsFyIeBPz+X+7y6a/2X65g6B/sus65DuY1f/vmhO++fkyeVewfDjk4GjEa/yMHawdbgrmA7jF0D92NDtdoa1wVyBbg/QtgQUkgBaEcWWr+DHYOJgdKsJ17vv4d8E+gesM24UH3CJr/BWYBtsa5W5l++d8CXzlCY3qyZx647bEVu8bf7fbo37ptEhoY9CToNWHOofkazCnYvF9322/P56D/qa9+iVeuX0qBVuqDSAR5poL16kn4runIFjnzkwUP/3rCo+8es5pt6NoOc4UEd3w0AuDw0wPeNEry7diDtZTdE6r2hNbmzuDCNhhbOZlgT6SUCBFqgpJxb4TRIVBI4SNF0LsMDoi9T9Di5Y59UojdwPFtIBBIBI1tadoWay0DHeFLj202E9ycA7mWkoEMGHivv91FXlHkLi/BOU3pXXjk9ktljKVtnDONkC4j5bI17xZda1zidWd2blRb61/TGcqypiobtNdbCCtJKnwS3yOWmrEXMfQCJkHErSRjXhUsqpK8qcnahqpraYzpDRueutRspZGR9oi07j/DkElPsvbCmIMoYT9MelL1eg6Br4SAJPI53BuwziqMdenfsjM0vS37KHW5FS4Z/R0RrL6K6mSuffXODxj6IdMwZugH7IUxszJnWZfM85zz+ZqLYo0KNN7Yc+njm5I8K5GdQFrwtSYMfAKl0UaijWSgfIY2ZChCRipi5IUMhM+g9QhWhs16TScLlCfRWrkBqnHSga0VdJBLPtd7DIKQ4WtUc7cyXGO7XeWqs67yIoX8oMRqCykUvlC7PDbXK+pkBNu8Hk8EBDJCfmBzDiklg0GI5+nnZG7WWoqioSxrlFJkeUVVtR+VwQVsB9muD1cI6TLI+ttONtxnZb0JyryiyCpOHy04uX/ByY8XFFlFd0MW5H7oEUY+o70Bx59MOf5kj89/d4vPf3fM3tGIdBwTv6fm/J8bBBIpNJ4M+s93e7z9Ay+C1orROGY0vp6Lcdc5Y5eqbDC9O93sfI21sFrmlEXzzgOlfzawpq8YZWCXjmyJCOTUkSLjvqPYArpHzkNAHrhlzMItT9NL8SJHnGwFlNA9xNrKLS+Tfvllv3zkyJFt+qpU5ciUWeCIXduTrBkg++2JwapeZViBOcF2CtRtBOk132/nXt/W/z9779kk15FmaT4urgwdqaBBsqpY09XdY2M2+2Xn16/Z2K7tbtvOtJiqLsEqEoRMHfJqd98P7hGZIEEggUwiUdU4ZmEgIyLjesRVfvw97zlhPGeeXBGBTC/G71r/+R2gHoAabK/NkVYM85S9kV+YFQgm/Yw8iYiUem2e+TEg8PPcTfXsXVO2tu44fXnOk989o5gXOCDtJbhwrvwQWT9Dx/pavV3XzMEyrJs/cVr+X3R2hZY5SuRImaJCxlUkhkixi5QxUsQIIoTQXIQMK5+bJSIiOUDLn78JXiLJdcokHnJSzzipz5nJJVJIEhn5Bn/XkaqYUdQnuqEq1odiMS85ejHDOZju9ZlM++hYEUUXO99aS1k2rINRQxxvmqhfP/DbtmO9qsMKtyZOPJGKYkHTdJydrDg7WdIfZPQHKXGit85VGkFfRUT5gEmaUdsJtekukaoLeeDlW+fGqlxdkq/FodqycQzMVESmI1/uFTc//RZCMB3lIARn8zVnszXzVeWrQbbzDkI7A6ajnMnwZmShV4UWklz78N8shCnXIWh4uSr4vjzkaSGYDsccPNgBITh8esrR4gzTGLrGECcRfZmSqBjXWWxnSU1M7mJ6JPRlQk8nUFhsWzEv15wWLbYx5P2UrJdsSbpzbpvNkyaSf4jv0k9zdvXVz00fLKrQQm/zvLSISZQikSmJSj8JkrWBdQZDh3PWPwQBtjMAACAASURBVACFRikfjipv2UJQCNBaIkTED5d9nIM41vR6MVXVIoWgqlqf8fQJsSyFJpIpQggaU7LuZmgRoWXERgqjhCaW2QcZH6zmJUcvznn55ITTwwWrRbk9nm8CvUHKzsGIB1/t88t/eMAvfnOf4bTHaNoj6yVE8Wezhp+CFJJYZuR6hBKa1jU0tgoSwdutDv+tQAofByCl4ODuCCUFz58m/PmPr3j+5JT9u+O39nL9x8Sm0iS9tE//J09q7CxUnNahmrQAVfvX3BJoQE5APfb/usI/7BmYp15CqB74z3QrX/kSB6AehfeXl6poz/xQ5BTEiE0fFHIK0d+BvBvGEsZjD/3figzUvSt+zy5IIjfywwpEz1es5J0w/rXfjjnyhFCk/juEa3MSafbHfb68s8Mmd/HudMggWKR/bJXVRQ+Wb/N419brquHoyTF/+Kdv2Hsw5c4X+/SGGVJJxBucVNNeyt6DnWsttl/zjmCpupfM63+mtQtiOSFWEyI1IZb+XyUztBoSy3H4/xwlej5YONSRti34H2kHCcFWGmjx9uwgmEQDVlFJZWpK0zCIcjKVkLv00t9+/Elhsao5Ppz7iVSi6Q1Sn1WgHcYE7XXVsl5VLOclOhCsNIvIe/7gN8ZtgwvXy4qqbDy5ijV5z/entU3HYlZw9GpOU3dY60izyOcxRIokichSzUAn2xDMvxYIIM8SdKiONa2XCXadpcMw6CXc2x+xO+6RJR9XtqKkJJOSDJ/5dRmrpGD4rCOp1zyMd/nV3iOkknx7GvHEWJqu9WRZaHomJ7UxnTV0xhDbiIyYyEboSiFbb19tjKFclMxOlhTLiv4wpzfKwDm61ldxNrbQk/0hB/u7DJIePX114ukJtUIJTed8hVhJb72dqoxIxKEV+PZI1qbh12JpXUVtK29mESosWsTbcQLbhtjbGvMmKPtNfMETML+Y0hlL07RvdR67DXjylGz781bdjEjGaHvxG0cyRgpFwtWOtcvkaTkvePnklBffnXB+vKBc34Ar56WssdFOnzuPd3j09R2++M09vviH+35xKlKAwFhLWzY/yp66/N829MpIcaEe2PR9Xv4uG3XCxh1OCLENF95IIUWo8n9Ibp9v9P545FuiydSQUXSAlgm1WVOaBUpotIgRYmMOsMHVvtOnI4G9fQjp+3ujSDHZGZCmMU3T8Yf/9ZxnT06Yna0/QqD0XyMUoD3x0V8h1H2w52DPce1vwXwL7iz0PDlwC5wrEex5AqXug115ImXnYI7x5SbBVm6IDm5/v/CfHwiNa/4nmN/iXAVaIdQIkL7KJcegHiP0ry7G0/3BEzgWnqxdEQ4TCNRp6PEqQEw8idOPw9hXgfTNfCVNffXaZ2RxxJ3pgK8f7G7v3A92Rwzy5L1Cfm8KIvSdR0qhVXBgDdfCNxG+rumYHc95/qeXTA5G7D/cYf/RHjo4uf4QUivSPLmWvPuaBEsSqTG5fkxtjhFCYl1La2YYW9LaBVqeE5kzGjUhtpNtwLASOUr6DCxf0fp4k9qLHqwjGtMyiYdEIiJVCa3tKIwPHpZC0NgWx825yd00ynXN7HzNalH5LKfOspyXNHVLmsfs3xkh5YDloto+bzqf9zQ7W9M0HdO9Aft3vN5040DUtYayqKnKhq71ssO9/SFpNgw39E/z9/gpOKAoG2bLkqbtmA5zxoMsSCmst20fZKRx9Enp1AVe4qkj5VdaLl80hCBOY+I03k7WrHUkWUx/rLfOZV1rOHp2xvHzcw4eTtl/MCXvp6FJ1PeL2M4SJZq0lyClxHQG01mklFvr6PeZzPilE0+wrLPUtqJ1avtaJOJbP6/cJtzW1szbY+btMc5ZX7ESGiUUUigGekI/mhKL25N/dZ3h+HjFycnyjQ3vxnoXsZOTJWdnK9rWy4A/nQqWQMmIWGY0tqJ1NdZ0SKNQwhMUgETlaJnQY/TeW1icr3n2lyNePDlhtShvZNRaK1+lmvR48PUdHv36LsN7Y07LmuW/P2N32md30sNYx2JVUVYtWku0UiSxIom1VwqEjKzlumK5qklixWTUI89iFsuS+ary0m3rXsvmKeuWqvaBmsN+Sp75SXPddiSxppclJO9dOXM4S8gDszdm/vE2RDJlGj+g6zU+MqM9onM1na2xkUHLhEgmQbj/9vuLz1OWYXH2M94G57y6peusX5y57QF9cgh9UiL3FRsUnuAkIAcgtJf7uRphlyBynD0De4zDIBoH8knorao9ERIKiPGGFiu/Gdn3ckGhw+fHYfMS55pAwoJ5kYiClDDFT9FDL5Tsh/E0QIvgp03SfgRnA3laeKJmT4AFohWBENYX8kFs2Fb82kf0s4Sv7uwwuJShtTPsMcpv574oCD1gSLJYM8wTRr0McAwzH1h9ec4ipCBKIrJBSm+U05/06U96PgbjDQRxM++6Dq5JsASRHJNHjxFCByv21bYfS4kUJXtoOSS2E1o7JZITYjn1ocKMQQoU3vDiY03aO2uYtyteFMf0dMY4GtLTKZHQtLalNDWLdo0SisZ2WBw/XF/7VFAUDUcv55ydrEhSTZJEzM7XnJ+sSPOYONb0hxnnJ0tevZhhjSNJNTg4O/VywKbuyHsxaRpjQ6Bh2xjKdUPbdKyWFc450jRi987QV64+vZ/i7XBQVg2nszVxpDjYGTAZ5uGl4HS4tYK/5bFehgCpfIipUq//7gLfFxIlETiH6QzOWtIsZjDtMZj0GIxzFmdrvvnXp/zpX76nN0z5xT8+RGu1tfY1ncG0BqUl/VGOjjTFsqRYVv4C9gGN+gKBDBJBiydYm/NHCkXmrtZX8HPCOktnW2pTMGsOeVV9iw9aztDS31wEYBNDqvrE8jYJluXkZMk33xz+yEXQBw4b2s6yXtfM5wXOubeHk94CfAUrpXMtna2pXPuja2ruhvT0+5Mr8ATr+bdHvHxywvoGCdZ42ufeF7s8/NUdHv3mHjKPeXY449WzY756uIsQ0LSGl8cLZouSNNYkiQ8uHfQSenlCnsakScTp+ZpXxwt6eUIcadJYM19VvDicUdUdnTFIKRn0/N/OlxWzZUmWRNzdHyIErIqGdeGz/CKtPoBghWpocM/6GJPuSKZMkwekasBh9Q1H1Tesu3OcAyEUmfK9JL4f7x2LOU6gAsn6jLdAAPjrgAnk/ZNrzLx1CCAGmeOlqtI/RBr+W+HJR4tzS4RNQzXpBOwMZ88RIsdXtpwnQiIN5hBdkAemIPqexG0IE7EnUtvP3xhNXCZ8SSBrgfAh/N+7Bl8Z++k8xB/DhG0scC6M37U4u0DIby+NPw7bfRPBivnq7pTHBxdRLkrKW6lebSC9NTRZHDHIEka9FJxjkG8I1qX3SkmcRuT9jN4oZxAI1k/O62/ASfqaQcOCRO3Sj39Nove8PbsrQtCwt2NGSAR6239lXUNrz+ncitocIdF+SQpBovZJ9T1iNX7ntq8Hh3Xe8roLTfitNVjhZReFqVibitymmG1mz6c0675A1xqKdU1Z1PR6CeNpD2sdVdmitKTrDMWqYrX0Faw41owmOWka0bQdxbpGSEETmuI3PQurVcXsfO3NGCJFr58Qp5E/oD/Nn+KtcPgw4fNFQS+L2Zv2P2hi8rGhtWK0M+D+V/tM9ofESYQQgsneENMZb0YSe+MD0xoQkA8yesOMrJf43irjuPfFLk3VcOfxLv2ht+vdORgRxxFd22E6Q5on5MMMpSV5P6EaNQwmPbJ+ShRr1HtYlYpgyy+lAudobYsAlFC0Nsbccq4U+GPC0NK5BhBoEftwdLwL4sb9sHMt1vlq0CZX7DaglCSK1RsnxDqSxNaRZRE70x5xrNjfH34y1VgBpDJnGO2QqJzONlvTE/C5Y5uenPfpd7PW0dYtTd2xPC+Yn61ZLUraH1rZvyekFCgt6Q0z7j7e5df/5TF3vthl7+6YBjhdrNFKepKURFuDGNNZ0kHEzrgH4ZpjnSOONHFYDW1aQ9x2237Vum5ZrGuUFJ40RX7x43xesC4bqtr304ljWBcNaRKRpf7xIZMb57zjXNt0N54N9lPoXMOiPeK0fspp/YTz5iUCQWNLFu0RscqIZYZEBbngT0OJiGn8gJ3kAdEtVpXfhK7paKqWpmpo6pa2boNxEOhY0x/36I3yK03cuu7CFfAqxGgT3eGsYz4rmJ2tefbkhLpsfVxAGv1Vyfo/Dhze/KEGAnHBBROKKvx/BEIhNoYWIg+PAUI98DK7DUQayJkIRCiQIFeFbZiwzS48LKAD2ZJh2114fxPMKX4wnk3o+nuEr2+rZiILj56fm6sH3pZ9O/4ESINd+5TLNzspvCW6Cj2+ZeXjQJKNxC4co+KSbPk1ObMUNG0X+oOtr9InOqhv5HtLnTfnkATu7Qz5r796wJd3pjgHeRLxeH9MrN58L5kdzfnLvz3h/GiGjqNtperyCHSiGUwGDKf9D77nX1siGOt9lMwxrvYugqFR3JOYJoQOVxhbYl2JcTWtnWNsiXFl+LfCuoph8o/sZP/tIxAsTw6FEBhnqWyDw5sNCCEoTU3RVdSRn1h93Pi094Mxlrr0E4wki9i7Mwo9V4auteBgvaxYr2qKdU0UKwbDjMlOD+u8qUGSatrGOxC2rYGQJTM7W9Prp9x9MGFnf0gvyMf+KuGgqjtmyxJr7V9Ns6+OFNODEXk/Jc4ikszHDezeGzOY5D7/QQpwbB2idKzRsZckKa3ojyVf/v0D9h9M6Y975EMvD5wqyWDS8y46xnrL+tAk7eWmJhilXBidXB3eEl8JFUwuWpxz3rnPtoFg3e5q6kYiaFyHlhF9PaZzDdYZLAaDxdjOO9/d8lilFKRZxGiUv/HYlcJLIJIkopcn9PoJ41GO/mRybwSp6qFEhHUdduPYGFB0C1bdLDhDXV0ubo2lXNesFiWL2ZrVvKQqasw1+8+kksRJxGCc8+CrPX7zX79gtNMnG2asqoZRP2MxqBgNUob9DBHyYLSWTEY5j+9PmS0KXp0saFvDdNgjTTaEaONS6wMvm9ZQFA2TUcb+zoAkjjg8WXByvqYLjq9la1gXDUdqxZcPdjjYHdDLktD/9X5wzhPBtu4wrdkSgJ8TrS05qb/jL6v/j6I7p+hmWGeYt4coEW/luFdZzIxlxq+G/41htEt0i1XlN6FtOlazNcvzFcvzNavZentdzgcZd786oDe6oitgZ1nMCk4OF2+NdNlgU5U01nL4Ys6rZ2ecniwpi4bJTp+8l7znNfw/AlyQxoX+I4LduquCmYUBkSJQIIYgRwg5womJ76WK/jPoh5c+T/mHK0O/02nob1qCKNhmZm1kgc4iROJdCjeRBa719u9yM56N4+ESXIcgwYnQN3ZlhKqcGCLEGCfGCDn0lu/6V6+/DxWqWK/HuHi5qaPtDPNFydnZijiJGA0z8iz25N55MyatFUKwlaZu+ljLouH0bE1VNQxHOaNhFmTU1ytiPNqf0M8Smtbfq7WUTAY5cXT5N3LblpDDJ8es5wW9UU42yMh66Y8qVvkw4+Gv7zN4W5XrHbj2Er4WOUqlOGf8QYIN/23o7JrOrmgtGDyR6uyC1iyCnHBBa5eBgFUkag/jbkba8TZIIUlVwijqe8c7Z6ltQxfso51zJCoikTFa3E6WzMXF0nnNfdVhraVY1xSrGoHw4ZXOIeTlFYOwiiAlUgareRf0qqHZ2jmH3Tx3uRnQ/XgMm9WHjTzMWIu04tq5Lq2t6WxD65pQIeiIZEosEpSMUCIKvRk3h84Y6qZlKeBsXpCFipyQF6ePkn5FJv3IRhc/BaUVvaGvSF3GINYMxhcXwM2+woWLxKWLhY4UaRazd+/1vKc4iS7SzcNBsmnIvy6CbY2X2DlDu1nEcJGvBoXp9e0aR/hOMSkUkYhJZAYWGiqcdUgkQsZBtnS7ExMhBGkSMRikFEVDXbe0odpsrfOT+0iRJpqdnT7Tac8T7FuUb0C4joWAWeesn0QLgXTuNYLl+3dN+JurkyPTWYpVxdnxguWsoCpq2ub6iydxohmMc3bvjDh4MOX+l3ukeTAMwpEkmkhrdMjRU2EFVmtJL4+ZjnPqpsUYH4vRGT+mzlia1qBUR910NCEguu06lJQMeilZGnF8tqQom/Db+D6aujXITtB2xi8Wf+ghGeTETdN9NKdJ60IOnvHht5FMt1Xi1pW8j9iplRWNLbF8WhJYgK7tWC8K5sFkpS7qrQW0jjXG+AXMq+y7tu04PV7y7TeHW+n+27DptzLWcXK44OjljKbu6PVT9u+OGE971+4p+dvDpjpUeIMKe4JDBRfBc3ANQoxBZiHkdwxijJAjkMPQq3SZiIRqlIvZVsNMHQjbLPRuSbaug9Qgxwi3kRBuKmqXxmP64W/PPSmTA0To0XLbalftHQztyhtwuCWYMxwCxKbqFYw8ZBi/6IfH5fGrQPSiH0kEjbFUdUtZNMzmBWfna+JYh3if1h97xpFnEXnu+7TKqqGug2N1rFitas5n66CwUuRZHCJiPvwaJIRgOsiZDt6+cCGkJE5j8qHvvV+crqjWNb1RTTXIwmddvL9rOuqH9bXGdm2C5atUVahClRhbYVyJtRWtXdLZZSBSs1C5WtPZNdY1IRPLoUSG1gMiNUb+YKf+HIikZjcZIwQs2jXLdk1lG7pwg+/rnN1kzG4yfi/ntJuENY6qaqnLlvn5mvPTFW3b+apbZ9m7MySKfYViMMowxrJeVfz5D69YLkoW5wVx6uWAw0lOXW9upnBytOD0ZMliVjA/L9i/O2L3wFcqyqJBSMF0d8B0d4BzjrY1HD4/RwpBlseQxT5I8xqrYetuzqw9YtGesGhPKc2Snfg+0+QeAz2hp0co9e4g3PeBlL75fF02fPP0mBcnc+KQQr4hFb0s5t7+iHt7H9YHcpvYEqP33S2CG5e++Sw5Q2c7GtdQ2QqJIlM+ePq2CQt4uWIiM0DQ2gqECGOusc73XaWyR6b6t06yhBTBij1huaw4Pl5yfr6maQxt25EkEUmiOTgYobUiz2OSBG9fe4tNhRZDbUtW3YzONnSuobMtnWtfkwiuunMW7SlaxuR6yM4VP7/rDKt5ycmLOat5cWMuaVk/5eDhDg9/ecBkbxjiKsJilIO2s1RNS1E2LNc1Ve0rtPoN7lXGOqq6Y7mqWKwq5suSuumYLUqiSNG03aVcwx+PxTlI4ojRMCdLvKvr4cmCqs6YjHL6+fvZnDsX8hCr1kvCP0IFK5YZu8kjjGt9hTgsyLpN78d7QMuYveQLog8JWf2ZYTpDtaooVxW9Uc7+o93tIkeURAx3ri43auqOV8/P+d2/PPXE7CrYuFUavzA63R1w7+GU+4+m3Hu4Q/KJLBx+OghyPVf70OH2X0EMgqX50gcAq/ugdr2dueyBPPbExK6g/R103158nByBGAXilYK6C24Bxnn7c9eA+IZt7pRIghV6ckFoXIc3zDiC9rd+XNsqWA/kAchdPwZXhLDkF9D9GRcs4p3IEM6C3ffvlWP/frkbxj/wxKz7k//7DUTffwc5CTleu9uXmqbj7GzF6dma9bqiKBrKsqUsG6SUfsGo7tjd7bO/NwTg5HTJ+XlB3ovp5Qlta1itqm0V/WMiijWTgxEPv74fsi9Baa9U0En0o9MyH2YkeXKbNu1eBtjZVSBRoTJlFrR2vn2u2z6WGOvlgCBRMgluggMiOSaSYyQ/P8HSQrGTjBjFfZ4XR9S2YW0qOmdwzrIXj7mf7TOK++TqdiQI1vrQwOWiZBH01FXZYI0nPFGsGE166EgyGGa0rWF+vub592dUpQ8Lnu70EVIyHOd0rcFay+xszcnRguWipC59KOF40iNOIvJ+wvy8AAGTaZ/JTp/VsuTZd6ecHS/JegmTnb7XzCpxrdXxtZlzXH/Pi/LPHFbfMW+O+aL3DxjXIRKIZUp64wTLrzCfLRoOTxdUTUeWxNtKFsDO2Et5/hoJFvDhJOmG5+AuVIY714WV64ooGEdIoT56ZsabIFE+c0loSrNAAAY/XnBEImEY7ZCpAVrc7sRECuEjGnopxsw4Pl7y7NkZRdFQFA15HpPnMW1rGA0zdnb6Pig6ud0+Q+M6aluw7ubUpqCyaxpTUtsy9L55rLoZy/aMTA3YSx5c/fM7w2pRcvxqxmpe3pg1fd5POXgw5eEvDpjsDYjiaHu9c3jpS1V3FGXLqqhpW9/DunHzvHxCWeuo6pbluma5qpgvK0+wliVJogPB8tfTn7qZp4lmfzpgNMyYL0penSxpO0uexh9AsEIFq+4wreU9CoYfjFhm7CSPyG9A/i+FJFNDtPwECVbrJavlqmLv4S6P/tM94vTD5jRbgvWvT6+0cCCEQEcSpSWjSY/xpMdkp8+Xvzzg1/9wnzSLb/168EnCBYJlX0E7B2SQ75UQ/W8Q/13Iuxp60wk59gTKHEH3PFSiAuRdn02lH3mbc7Xvc7SwF5lXrmErRdT/CPEvPaGxc1+lwlySLa7wxhab8fwjyF95a3UR++fMc2h/izPfXoQWdxZnlwh7x5M89RD0VyEs+VUgZ3PovmHrdAieUKn7/v0iBi4IVt10nJ6tef7ifOtYbYx3pPYy55qibCirHSLte4WfPjvj+YsZo1HGaJijQvtBFGk683FzGnWsGe+PePDre1fabtpLSbLr8ZFrBg1bivYJi+a3tHa+7b0K69cIoXz+lRxtn9/IcoTwAcNSJCiRoWROpu+j1fBaX+gqEKE/RAOjaIDDMYmGvi/AOcbxkEHUI5Ex6h0Ntz8XpJQkaQQOHjzeJY41bWvIewl5P2Fnd0CSekvx8Y4jTjTDcc7ufk3X+n6qXj9lZ6+P1orewDdeZrk3wqhK3zhtWsPunRH9YUYca3b2BkSRIu8n5L0k5GApqrJhd39AHgI1r9uL1ZiKZXvGqj2nNgWdaynNmkV3Sk+PGbrdd3/Ie0AIwbif8ejOhPEgo6xb2s4Qax+0vJnWDHoJo/6npeu/Cj50leWmqxs/7FUSCLSISFSKROIA48yVegp+bmy+u8C7mE3iO+RqSBNVOBy5HpKrIanKt9K220LbGo6OFjx9esp6XXPnzoidnb7vn3NuK3WNIsViWfL7P7zk0cMd0mDhf1uQKLRISFRObQsaW2Gx26rg9n1CYZ0hlmkIn70arHFURcPybE1ZNNt+l+sizWJ2DoYcPJjQH2VeRhz2f5ZG3D8YobVkZ9xjMszoTI1SiqYtyLPvqdq/oCPNwW5EZ2IGvY48W3Nnv8CJgijS7O+sGPYlSnb0csGwv0KpCgeMhi1fPHA41+JoSeKSQc/Lmr1cVNDvJcTx+39f5xxtY6jKhrbtsB+BYYkQNCz0TZxDwgdWfwJV8B9CCLbn2+xo7o2IQl9rnMYMd/oMdwZX+qy8l/Drv7+/zU67yral9IufWZ6Q5TGTnT537k1Is9jf564p7f/bg/RVKbXre6zUXU8+aD3JUY9B3UHIHETk5X1yH/Tf+cqTKwNh2nzcpoI19TbvaP+Z0X8Gtw7VqdBXhQV5D9SBf5/weayI3MsRRQLqTggmbryUUd0DdQ8hgoU8whMiBELdBTvHuQKxkS7KYRjPxH8/ALUDfO2rW64M5hsBlytY4seLzJsWAmtdWMxy6MibXCSxZjDISJKIddFse/ovm1g4vExaCLOVzn4sSCVDhE2Ps1fnnL+aUSxLusZgjDcM07FiuDNkemdMb5h5h+ZrnDLXDhouuu84Kf87rZmhZT88emjZR4k+WoXnRA8VXlMyR4rINw4GsiVQwdb940jyFF7KMYr65DoNkgXAObTURFIHKdMtESwlSNKIKNbEiWbvzsjLKUOzYBQ0rS4O/QLDbJtvFb4GWstAwiT9fkqWxXRdb9s4vZnjxokmTSOEFGg9YDT2LnNSSaxxjMY5xrhtMLGUHxZueRmNLVl256y6M2pbYFxLZVcs2zNG0d5rq9s3ASFgNEhRakodXPOMddtAzw2SSDHs344s9G8PPo5wY8+9WWQxrgv9mp8GJJJcDYhlinV26ySohPaZWKgb7wd8X3SdJ1i///1LJpOcBw+m7O4OghNTRF231E3H8fGSp09Pefb03Fdi7425ASX4B0MISSR9f5sIUkwpFJke0HttMU3Q2jpY+7+fyUVVNCxC/9VVJqJXQZrHTPeH7N+f0B9mr0n30iTi3sGYnUlv6w5oraPf07RdB+J7quZ7oviAg70vECJFqxalWu7srxkOC6RUZElCrBW9XLBjJFKukXqOwzAe9uj3ejjXYl2BEC1KOZSEJOkzGvRJIkMSv/8kxVlP2KvSx3B8jImORBLJFH1DLQDyFu/Nb4OQwmfqCMH54YyTZ6cIJb3Z0KTHw6/vMpwOrjRpy3oJX//Dfe492rmajHKzYBRInlSSKNIkaUSS6m0P9mdchgxEZNcTJv3rQHhCPtzWdW9jqY4nWHL0A7K0QRT6nTY9TMpXtaIxFw6Cmwd4aWDmiQ5zXiNYcheiXwcJofMn7tbJMPLv3RAsuQt4EiawfrtCvWE8BPLW84QNG8a1gf7x+wMEhOB0v0jTdT7aJYkU8WZeqATOOtZFTV21W4KlLgWnG2N9b/atEKyE/jjn8MkRh0+OOXl+RrWufW5sLyHtJTz8+j7TO2OyQUaUXK814No5WEpkxHKCJELLAVoOiOQArQZoMdg+t3leXSJYmwnYx8bFyrUgUZLkI4YcXxVCiK3Fchxr+m95r44UsdOvWWKKHziiyFgScWGG4BxvfJ/WCn7EL25etimEQLFxjvI3S4lCSR/w+nPcPNMg8/FOMu6NZWKl5NZO+TM+AI5gf25pbU1lK6yzaKFCNIKhdc0nYdNund32gmxW8R0O57y7YIsfe6JyUtlD31I1G4LMrGyYzwuGw4zRKOfu3TFp6L2q69b3bNYdxjjmiyI0Ht9upfAywU5Vj1wP0cI7NuaXCFYXjDBAEKurL3BspNTrRUlTtdeuYMkwQU7zmMEoZzjpEYeq0QZaSfp5TC+Pt3cv5yKi/KvI6gAAIABJREFUKKOzKXVrqZolsZ6SxjFKRli7xNgFWboijluEsEixRgqLDp9iXYl1S5wzRLElFS485yVIQqReQi8ssEKrHCmvbkdvQxh107TUZUMZJhY3VfUzrqUyK9bdOVrEaBnz40Bg59UryHfasf81QkhJlGiiRNOUNauQSaeCq1pTXd3OI4qUl+pP+9t7VReknU3d+QXVjWkGgAAdQuHjsDCrteKH7mifcRkCTyay0G+15ytBb3m3N6N4jxxH0QPe3u7gbAub80FoT6TkEOTuFcbTh7fOEH+IjZX8+0FrRb+XMJ30/YJe3aG1JE0i4lj7vEwtvSlb3VEnEWkaMW4NeR6T5Um4XidI6SvwUaS25OvnhmkN6/makxdn1GVDkicMdwfkw4yuNf68jSOklqznBeeHc6JEM5j2b8dFUCDpx18jRYZ1DVLElx7RD/4/RhCe34atfcZN4odk6affd/thurHM6EcT+t2U2la0tiZXA0Z6j54eE/0MZidSCSKhLpzz3vAeIbyT4GdcD8a2FGbNsp3R2Moflw4611Kbms51t2597t0Na1pXY1wbxlZSmTWNLWmDKcNucp+95BH6PezDbxqbc1tKvwCQpf7mtclB0lqRZoIsjYgidVGZveUTfUOwtIgZ6ClaxEihSGROfKmHxmIvJHjq6pMFax1N3VKsap/ld01CqSNFFGvSLCbNY5IsRv2E1f3lX1aICCn7KFqUnKDVFCUnKDlGiATjXtCY7xDosLLssG6FtWscXgbocyMVQiicK+lcjQsPKYdouYdWO3TmiM4cYUWKU3tX/62Mpak7qqKmXNcUq4qmurkKVmsrFu0xZ3VDrif09CTsb/+6Nzmp0SIhksnf5AxAKe9UlvVS2qpFR95F8LoTyM3iaV22nJ+umJ2tKcvmNVmsVJI0i8nyiHHooc5z8Zq89TM+40ORBIfaPE/ojMF01ve1K+9WK6S/R1nj6IzvzzLG27RHkdq6BXqVgSdYWRqj9TuCxW8Iddnw6tsjfv9P3zCY9Hnw9T3SXhIiaKRXNbWG1XzN6csz5qcLdCTZe7DDh673X49gCUUePSaPHl/nYz7jBnDVA/RTudAmMmcY7VKaFY2twDkG0ZRxvEdfj9HyZgmWD74V3LJr9X8YWGdpbENlCozrkEiMMBjXBVv+TyMHq3MNtfG9QbUtKcyCoptTmhW1KWlsSSRjxvEBzvmJ/+2cQ16W6+3Ag+MchErsJgQ5BOQGw4TNe24TQvieWyU0uR6Rqv62B1b+QHaphMY5G5wdrwZnHW3ThWrM9ciCED4WIU4jkpA5l6Q/JtVv2v8OHb6PRcohUgxQcoAUfUBgXUFnDlFyhBRDwOFcg3PNtkolRY6SI99b4Rrff+UaHC2SIVpNiPQDrF14cuZ6QaZ0NXSdpS4bimVNua6o1vW1A5kvo7Uli7bmtF7gcCQyR0ofHOycoTYrCrMg16Nt7tXfGoQUqCgcQ3lCWrdbtzSdRF4+eEVcLAT6nrmm7pifr3n1YsbhixnrVcVqWW1lsUpJev2EXj+lKn2wu3O9YJGt4Q2Klb9lOGe9U6UzODqs60L1VAOd10+JjRQuATZhv7cBwdYi3cW+/0rc5nh+jM1xNB5d9Rp7IVnd4E2qoY91PLZ1y8nzM/7yL0/4zf/+NXe/OuDul/tkg5Q4jSlXFcWy5M///C1P//CCYl5w54v927Vp/4zP+BD09Ij95DGZGrAbP6C2aybxXSbxHXp69LNUsD7j40AgQnDvAAEsuhmmMzgLCkX8iWRLuWDGY52hsRWlWdFab3ChhCZWKUp4kwY/0bFcJQj154JUkihWFEXN9997B8HNTW8jyzg5WVKWDXGkbz0D64dobU1ji20F6/IE22IxtsVekmteBQ7nV0zb0Fd6LdIufE9B6H19vxgKcfGv63Cuwrg1xi4QIkagUXKCEHHo7VBIkYKUCLtGuDRI6QTgkKKHkLGXFrpl6Fe+Zt9r3TI/W3MWMppu2memNgXnzQIqRyQThtE+EV6KVJk1L6s/8qL4d+7nv+F+/ptP0gXwurhs054PMyYHo62xRJLF3uDiirtxY0bSNh3Pn57x/MkJR4cL5udrlvNyO/G7vB9PT5YI4PnTU0bjnL07Ix483uXew+n2WiH+g4QNd66gM0sqc8y6fUbZPSfVB/4heyQiIVIPvbOeK4Oxw806F18ZIvbGGOjQT1WCGHiZ4GfcGIQUSC2J04isn5D0ElSkfVB8rMn6KUkejNyUvLYpzGeC9Rm3gp4ekaoeu+7+NnBSyQgtom1f1mf89SKSMX09JJYxBkNpCpxwCAGxTNDi05AJW+cwGFpXUZmVD8TFenMLoXAy2drL201Q7i2M0zeue5fAdVHz/dNTTk9X9PsJvV7KalWxWlXeKrdoiOMg27j9nzjA0dqawizRwgeJR1xMsJ2zdK71hJer9+c55wMwu7bzUqnr8SvvhpVGxMmHOKX6H9t3IFZYu8a6JYIcQYSSE5wz+NVziZQDpMixIsXYBEcDoTdRyh5KjukQONMghDeEug6ayldAzo+WFKvmxi2Sa1vQNS9oqoJhtM+BbbHSV1dru+ZV+Ud+N/8/kEKzmzympyfv/tC/MpjWbG3aJwdj7v3iwDuREarL79Hfu5G/lkXDk78c8T/+7z/z/PtTHxDdepfgvOfDr52DzvhtF+sapRVRpLj/aErXGkaTHHopOlL/Ye6sxhZU5phF80dOyv+Xs+p/ME7+nlHy9wzjXyLjL4n0XW8egbswhbgVxCF7yle3vaGF4vMU/ebgXTa9uiNKItJ+SrrJuRKgE42KFGmeeOfPt8RmXBWf995n3Ao2Dm2f8beF7QXJbSpEbCVhAoFxBmO7IBHkVqtY3tksJnEZtUjRMkIThb4RiXEdxnUkMr/1ipvWip1pn6++3KOs2uAW6qjrDmtL2tYgBPR6KaNRTp7HTKe9T6aK5XA0tmTdzYlkQiJznLyY4De2Yt3Nsa4jEglWDbe/91tvcqE3xQa7+uuQBi+xlOhYe1OC91i93I4VjZZTYv0lSo6RYugrVQqETEN1q0OIGCWHCJFiXR8ly2DJviFfXmYoiJAiR8qer2ohkXJMpB6i5AjxHs3qddlwfrzk+KW3J75pgmWdwdqKxq4xrg2/h39YZ4IEd0Zjy+35/7cGYyxN2VAsSuanS5IsJgomKVGi6Q1z8uHVJLBtYzg5WvDy+TnHr+Y0TUfeT9kLUS15npD1YpQM8RedpSxryqJhvapYLyuaxnD0as6ff/+Suw+n3IunW/Osv3V4dUKDsSWtnVOZYxo7o3MrrGtxSH/+fAKLUN7wRbIleJ/AmH4K1yEdtypPFQKpFTrWVOuKo+9PvLlFpJFa0oWFi7PDGV1r0LGPKLrOzvg8w/2Mz/iMG4d1ls621LbGOBMysByta8A6Otdx2z1YUvigYYmkdTWtq9Ai9sHCMtr2YKWqh5YRIpDE24DWioODEXkvYT4rOJ8VrNc+4LasvCRwMMjo9xNGo5zRKGcwSG9/MuWzL3DOBRI1I5E5fTV+zaq/sSXL9pTOtWR6EF4TV6hkO3C+D+0mNG9SSXSk3ptgbSBEjFb3kLKPIEHKHFBIN8Cxhw8RtSAkggQhNM51QIgucAYQXlYoYpwcot2BN9EQPUCh1S5SpAiRIOXVJU1V2XB2OOfo+RmrRXnjEsFN/uVG4vkpmKx8bFhjaZuWYlly9OSY5elyuxreG+Xc/fLgygSrqVtePjvnt//8PWXZkOcJ+3fGPPxyl/sPp+goZDiGn9hnExm61vD8+zOefnfMclFydrqiKGoQgt29Idl7BlN/xmf8LUAIse2xXZyt+O63Tzl9cU4+yIjTmGJZUq5KZscLmrIhTqOfNDi6Kj6IYG117g4sButMCA/1K9OWjf1xCB2+dCX3DFZsbVo3uScbSc677Futsz6w0pQ4fB7GxqVKy4jONrS2xrjOBwfjkGy2ExPJOARZ+jFtnMI61+KcvzkIEUzDZUQkvM2uDHazV2HgzrlLv0u3fThnt2O6CF0WF03fKF/ZkVFYMZehEfP9blJ+YljQuS5MByWJyraTSTZCHOud04wzWDaBk2F/iYuxiTA2HX4P3ygq3rmfGlv6YNFwTLz1ji7w+1B4meDmN7gpXD4GLRf7xboO48x232yP7u1vsFmd3vwO/ljaZiSFysab9tPlfhAXLME354nBbJ/b9AK96Tzxx4Y/LzbHhgz29vIdNse+ydfRuZbG+H0hQ3O5Pxe8VO/yMWrCOezCkbodD4TjP4wDtd1HkotJ/MVv4LbXAU9kUl+9ct22mnXb2PwWUkgy26dTDbHM6OkRWsZUck1l1qSqhxLRO3/vnxNKCQYDn2UHUJQNq1VFXXcURUOv5+VtSknSNCLvJcSxuvX5rWVDtEtKs2TZntOokkwNiC714Ky7BYXx5gidbXG4WzlGNiYAQnxYhIgQCq2mwEb+drln73IGjvjBa1d53UOJIeqKvRnO+R41ay3rZcnp0YLjlzPWP0MFa2NoIoSkczVlt0Ci6GRKYwtMyDY0rqW2BaVZfth2EKhwn/jUrN43Tp8A60XB8nyFCqvmbdUy2R9d7N53oG19BevPf3zFcJyzuz/k4Re7/Orv7vHlrw5+FLOyiV9xztEfZigl+P67E45fzXnx9JS79ya0zd9m5fAzfn50xlK3HW13cQwpJYmURAc53cfMWrPW0RlDZ32mqw1GTyqYQCkpX7OAV1rRG+Xs3J2AECxOl1TrmryfEmcxxbKiXJYYY0j7KYNJn7SfXuseeq0ZrMNRm4LSrCjNksIsKLsVtS2pbYmxzZbobAiNDBPTSCQkKiOVPQbRlEG0Qypz4neEERrXclh+y7PyjwCkqkdPjRjF+4yjfc6bl5w2L1h15zS2pnMtqcxJVM442mcnvscgmm7zbs6bQ06bFyxbH3jb2IpIxGiZMIx2mMZ3GcV7xCINtsJXIFhYalNQmTWrbsayO6PoFtS2DPIIi8OEybNGi4hE5X5lN5ow1Dve6EEmROL9V5vOmpc8L//Iqj0P7nkR97Jfcjf7BYnMt039i/aEeXtCaRYUZkljqy3pEPiJp5YxsfAZNuPwGycqJxLJW3OBjGs5rp/yqvyWwixpbbWVjbwJUmjG0R6jeJ+h3mUY7ZDrqyXeXxUbIlOaFetuxrqbU5glZfjunpi3W7J1QWTUlsSnm/2kx/T1hEwPtsTwbWhtfek8Wb52PGy2ay456222rUNIaywzBtGEgfa/Sywz4nfIgzyhaVm0Z7wov+FV9RcyNSDTA8bRPrvJfQbRlHU3Z9XNWHczVt3Mmz24ms42bGiiCqQslik9PSLXIwZ6Ql9P32irLZD+uJYpUkgSmZDbHrUpAUGuPzxb4qYhkCQqB+EtxSOZBCOGLFyr4lt3PLPWsV43rNc1R4cLXr6YcXK6CnkkLctlSRxpjo8XPHt+zmiY8fjxLo8f75AktzcJNa5lbeacN4ecN4fM2kNkq2hty7w93r5vYy6SyAwdFrSuNAsV3oZaKYWU1+852xhmmM5gr0VAfmog4h2vb167mXPDOS8NLIua86MlJy9nnB7OKVb1jRMsiUarHrFsWbVnPC3+jZ4ek6ohpZlTdHPAUXQzTusntLb8sO0IxSDaY6B3byy4+KYQpxGj3SFVUbOeFxSL0lu3JxHRe7oIGmNZr2pOj5eMpz3u3J/w4PEuw3H+k1Er/jnBcJTz4PEubWs4O15yfrKiWDcY++kEvH/GXxfWVcPLswVHs9X2uWGeMB3kDPOUNNYk0ccTxbXGMF9XzNclTWdoWoNWkjyJydOIXhrTS2NUOFHSPA49kZr1vGA9L2jrzveIFg06Ugx3B2S9hHyUM9oZsHtvei2ji+sTLFuw6E6ZNYecN6+YNUeswkRtU8EwWytZFzIwvAynr0cMo10O0i/8yxF+Zeot2+xcy8vqW/7X/L/jnGMY7bCT3OOB68hUn5PmOX9Z/QvH9VOKbkljC/rRlIGe8iD/NbFMydRg20x91rzku/W/cVg9YdWdU3QLUtUjVT3upF9he4ZYpQgliLhadod1lir8Lsf1M46qJ5w1L1l3c9bdLFQKWk9gREIsU08y9ZS95BE2M9uej0h9CMF6wR8X/8Rh/QSJrx6AYCe5HyoJHY0tOWte8rL8M2et329rM6e1NZ2tQ4XGE79cDRlGOzzIfo0WsV9B1CHt+y376aj6nt8v/x9mzWEgcD99Q9Ui5kH2Nffzr7mbdiQqI+emCZYPuq3MmvPmkJPmObPmMIzPLw40ttxW9NSmGV/GRCIlkdl2P+0m93GpQ0mNkOKdBKtxNatuxqw94rx5xXnzilV7zqqbhdylitbV25Eq4auFscrp6xF9PWYvfcydtAsrxZv9+tPY5DzN2yP+vPqf/G7xfzKODxhH+zzIf+0XJ/SItZlzWj/nuH7GSfOUWXNMZdZUdrWtwmkRk8qcXA/Zie+xk9yjSx4TyYxU9X5EloTYBMxCEhYJNhlYDkf+hr+5LQgEicyDPfjFmJTUfCpiGmstRVFzerrk6GjBixczTk9XXhJkvKwMNhUY34ullOTevTFJcnv5XZ1rKboF540I94dDrLOszZxUXoR1pqpPpgbEKg/XmKtNRAVexXDh+PThx5TDS7y6tqPr7LUztX4a7yJXNwfnfED14ty7B568nHH6av4zyAN9X20icyJRs+rOKMyMXI/p6x2fi9fNACjMjJP6CYWZf9B2/LVWkKsxmk+LYEVpzGhviLUOKX2gqVKSKI6Ikwj1HpJdayzrVcXZ8ZJf/d097t6f8ODxDlkev3UhQQgYjjLiRFNXLb//t2ecnawo1vXW0v0zPuN9UdQN3x/N+NPzi4Wxg/GAxwcWFapXH5VgdYbzVcmL0zlF1VLUDUmkmfQzpoMcgSBLoq2+JskT7v3yDne/PODwyTGHT445P5qznhfUZUN/nNMf99i9P2X/0S6jvWFYtPvIBMtYP0GvbMGr6lsOy78wa09Yd3NKs6A2JbUttlrsjdTLT6i8m9Q2g8aW1LZi3p6ylzxgL3nION4jkimRSN6cObKR3lmfHL9oTzmU39G5luP6+1C98kGNnWspuyXWGdK6Ry4HnkS4hs62HNbfMWuOKM2SzraACBUFT74imWBcx530C9K091aZUGWKUA0447R5yVn9gnl7wqI9pQjkxTpfudqsvFl88y+tr7i1tmZt5pxFL9lJ7rOb3AuhnNmVg06dsxi6UIHw22hsESbbJ5zVLzlrXnLWvOC0fkEV7KmF8zbaiDhIyxqccV7eiGM/eRRWzt4t8ZJIcjVgGt/xGThmSW1KbJDG+e9a0bnGS+doMZhQ3buoeF4XG5lmZxtm7RGz5sj/2x4zb08oujmFWdCFaitiQ5Y2v7XzMlL8Md+6mtIs0SEb6W3wfSe+mntaP+dV9S2n9XNPtM18e56YIIl6/Tzxk1NrlljXUZuC1jasuxnT+C57ySP2kgdE0hP0n6qwBJEuFrMN0i3kknl7zGH1HY0tOa6+57h+yrI9Y2XmNLbEYdEiDvvGLwhUdu3d2pylNGuqUKXdSe4x0FOG0c5rW/aEtqMLUtTaVlTGk2yJJFM5m/18m2Tr4hrzaRC+N6HrLCcnS7755oi6bplMcsZjT1DeZE2eJhG7u4Nb78HSIvIV03g/LCppBJCpAam6IFiR9AsYmRqQqf575fptnP909GF9U1s4L8uqioaman20wI9ku+8c0Qe+dpXX3x/WWs6OFjz50yuef3v8M/VeeSSqz06SMszvUJoFpVlgXUfRzWltFa4r/pq47E4vLSi9HyKRMIrvvNbD96nAdIZqXVOtvU37o+F92rqjqZpNO6I/X8M+eNcxtXE9Ay4Ft745uPjyc9aFfqzuIiNLfAK5eJ/x14uybnlxOuffvz+6eK5p6WUxo15KEkebzoqPgrYzzFYlz47nnC0LzpYFcaTZH/e5Ox0ghGDcz9gYd5rWUCxLikWJNZbx3pBskFEXPg8wzRPSXkKcRtRlw+x4Qd7PyAZXNxL6IT6MYLmOwixZtCe8LP/Mt6t/ZdmdBZnTptfIoYOsSgm9nZQ31jeTd8YHfK66GfP2hFfyL6y780A+Inp6TKTfvn5s6KhtiejO6VzriUw3p+gWdLYNk3UXpH8lOlQF1mES2ZiSRXfKoj2hNgUOh5YRxrU0pua8eRVIYEGicvbSR7ytalObNaf1cw7r7ziqnnBYPaG2a1rb4ILFs+8Z870r1tktCSzMnMLMWbZnHNfPGEW7PLRLpJAMo91Q2Xu/lWhHIEfW0gbyVpkVT4rf8qL4E+uwTYFCh4qVEtqbEdiaxlU0ttoGATe29r03Qr2bYAlFPxqzlzwiUwMf3GoLjPWT9Y0krbJrWvthN9qrwDq7lee9qr7l+/XvOG9esTZLKrPCuJbO/f/svddzHFe27vnbe6cvD0eQoGm5o+5j5ph5moj52+dxJibizo24x6mllqMnbKFM+m3mYWcVQBIkAYIUSHV/CrTUZBUyKyvNXmt9RqOE6nj90VoTqF2nUbMtrfPFcWVyFuKEfjChtfVaJ3cRHM6/Xp+wXz/kYf5f7FcPu2226yBEgSKUIUpEax2DcW2XG1TR2JqcGQs95aB+zGZ8p3O3S30oc2dtfxn48zln1h6iRMi8PeKgfsRh9cgbUOBYBcOGMkHbmtbV3dSzpnbl+v25mZHrOaVZsJd9wyDcWB8L5xzGGVrXUpqC0uSUJifXS9/pkikjNvjr8LO6PrQ2HB0t+MtfXrCx0eP+/S22tvooJS90CgwCycZGn+CaIt3rQomAnhqxEd0mlNE6ZDZTQxJ1ZtCw1hnK8Eq0LyEFQSiJ0q7AusbT3eHQrT4rsH4H3X5rHCf7M376ryc8/fmAfP5+tLzLIFEDtuMxW1nIcf0I2zzyjVgzp7JLWue33diCXJ+8ldHwNkQyoTL5J+lEaFpNsSjJ5wXbdzfZ2ttgOc05fHx8ltN2SQ2WEGJtuiKEL/6bRpNcEH79KqyxNLWmbTWOTp8p//pMR/6GD4eibnl2POfPj88KLISfYu1OBgzS35bv0RrLdFny5GjG0+MZz47nRIHizuaIsm4Z9VIe3DqLgtCtZn684OjJCcOtAaOdEWEcYo3BWYdUEqUUxaJkfrxgcbKEOxOS/sWDnsvg2vM86zStq3HOEsqYRPS9hqkT0Ucy8TSqbiHqdSerBdeSyuRre95EZvSDCbFKUTKgx+it2zbOF1ircErrNFIoRuE2g3CDxlbUpuwmBqcs9ZSjOlpPq7wmSNALvLZFdBk3fup0RGNL5u0RAskyndJ21LnzRhzOubVJxqw94rB+5Gl3zQtO2wMCERDLHonyU6hYpescGOssrauobUVt8jVVbN76YiTs9Gh+Me1tpAXy0mJ7h+sMCwxLfcpx/ZTSLJk2+yz1KUJIf7yl1xWF5zRmK3pn2y3wPbWyRygT1CXExQJJpkZsxXv0ghG1Ldc6LG01J80zhBC41n93b9NnvQ+cc12hWDFrD5k2+7yofuF59TNLPe2mlRCrlJ6cEKuMRKbdMT9XYNnGF5rGa7RWBhmhjAnkWfPgjcehE8s7Z2mdN1QJRLieSIbddbLS260aEa1raExBZTuNo174a8XMcVgGwYSeGgNeh3hZqozpplgLTrDOEsuEXHtzgUT2SFWPqNPYhTLuCqxmrbWsjNdYLs1pd915N8BBuMFOXBN0ZjXnDVyM0954xawmuDdrXrpoahZtTWtfXqCtO/tipYLx10I/jOiHMZG6uXLQWkdVaRaLismkx3iccfv2mCBQFxZRQgji98py+rCQQhHKmFT1sa5b7ImQXjB6Sbt3Zq7irmQmIqS3v05X4ZDXnGAZbamrlqpsqEtfaKlAXdtN6rdG2/hCcT7Nef74mCc/HXD47JSqaD7aNkMZ0w832IhG0LEQKrOgdRVKh1RmgUAQyYwsmJDI17Wbl91OLN/OJvkk0PmVnN1XrnZuSinIspjxRh/rHMeHc7JeRLvjDU5U0DVXzplcGO2nXCdHCw735xwdzME5Jpt90l58xfDsTwFn41Zja4yr/I+tMK7uppid8yYSgULJGCkS2m6CeuUtOovFxykYV2NdjXWNv391WX3uvGlXR9n3EQoxSsQokaBEgjxn5HO++bg6ORo7ozFTjOuatUIRyTGRGiPfITt4FdrmNGZGaxeA9WtyNSBSGwQi83twjQJbG8OirDleFOs/m+UVRd3SGtPp+y7ZPfgAsM7RakNZt8zyisPZEtVR+pIoYFnW2HM0b90a5sdLXvx6QBgHbN/dZLDx+j0onxecHs4oFxVxFrOx+/55fe+10lEyIAuGSCHZjO8wb4/RUUOqBmRq2P17sF6A+huhP+ht1xE/bQ7Yrx52i/4FpVlSmAVH9VNCmZCoAZvR3lv3w1iNxk+qUtknUX0m0W5HSwupuwXpk+J7nhTl2tihtnk3WQvZiu+yk9ynH4wBgcPyMP9vHhWWQs/QtvV6lO5nJYI/H9fnpxRTjuon7FcPOagfoW1DKCMm4S47yQMm0S3STmcguyLJdhOm1lZMm4O1jm3avqCxJcfNE1pXIYB+MPaL8i6j53LwF7FxlpPmOb/k/w6Atg3DcItJdItJtNsVf13htKan+aKxMjmFWeCcZTu57xfzInynRkIKRRYMu0LF/y7rOgqgM0Qd9dK7PjYfvsDqKGqFWfCi+oXHxXcc189Z6lOsM95gRfXZju+xFd/tKEs9Ihn7GyVy7YLnix1P9atNTmULduL7DIPNt9LzVtoeEcqO1nfk6ZKvXCeRSl5yJATW50Vu5utpaKFnlGZJYyqmzf7aeGUc3bq0VmjdlOj0WbFK6akxk2iXYbjJKNxef29KqM710JDrWXd+elOYk+Y5jSmZcUQgoo4GOyeRPa9ZFIJABljCtUV7IAMiOSJWCYnKbowW+LxY8OPsiFlTrf/MOrd2IUL4R7UUAiUEXww3+Hq0SaQuZ69dfdnDAAAgAElEQVT8MSCEDxlO04heL2YwSBgMEqQUbyyiguDTChpeGQs58ToF2DsN5jjniFWGUpd7NEkpiOKQ3iAhSsLrFViwpgVWZUO+qFjOS9JeTKriT5lB+hqqoubF4xOe/nrI4x8P2H86ZTbNaeoPe589D4kiFDFpMGCTe2Rq1N33NaftC4zTTJvnTKI7/KH3rwzD7ffezjDcIXgPA6iPDRUo0n5CNkjJ5wX5vEA3mqZqidNoHWp6GQShYjTpsXd/A2sdP//wgtlpwYMvd9CtJc0ikjRaF03GWMqioSwaHj884tHPBxwfLnAO7j3YYrLRu3HK8HXQ2BmV3qfU+1Rmn0ofYFyDdXVnGBahZEaitknUdhfOTVeAXv7idRiMzWltTm0OqbTPz2rtHG2XGOsLrpWUwRd1vqCK1RZxsEWidkiDXRK5feG2vWuwYdn8zEn1P6nMIVLEBDJjHP8Tk/h/I1JvHzC8isocc1r9O/PmLz7/y9WM4j+xmfwbvfB+t2b7fL//VyGFIAwUaRwSBp69oI2lqBvmRUXV6Jco3rrVzE8WvPj1gNHWgLa5uPgulxWHj49ZTJdMbo2uZQb0fgWWCEhVn0imbER3yJM5AKNwm1G4xSDcZBhsIjsq2XkbUeN0Z4DwEClUNxWwlNZPtI6bZ4QyYju++8798Doj/8CQQpGqITvxAx70/kSqBhRmwaI9oTI5+9WvLLWfQpU2pKfG9IMx42iHL/v/zFa3PW1bWtswbV6sdS+1zTtXwKIrRIL1otrhuqnQCw7rxxzWjziun5GqPonqsRXv8YfeP7CbfOnd19TwZVvVTuOzX/3CfvUrUkgKMyfXc++61RzQD8bsJA/oBWOElFeiCjq8Dum0OaAxFWngNQ7jaId72R+5l/2JRPU6+/rg3H55J71SL5jrY2pTMgq3O8vqd582UsiuoLy4S9m6moU+8cYiZkFtiwtf975wzqCdpjBz9quH/Lz8965AKrppVZ+N6DZ302+53/sH+sG4m9C9/tDWtlm/1xu4TOkHE/rh5MLXryCE8O6QKmNidlnqUxKZMYy2GIXbDINNBsEmsUpfuk6AtXZpqadEIqHpXNZWlM3T5gDrLJN490rF6cqKXVNT2ZzE9tiI7rCXfsNOcp+t+B6D8PWOzaI9Zr96RFb93DkTHnl6p/ZT3UV7QqEXPshPhh3dVHVWynRZWIos6JOpPolMbqzAOq5yvj89Yr9crMNp/eLf/70UK3t8/xNIxV5vyCj2BdZN7LUQgiBQJElIkoTEcUAUBW/sSJ63b/5UsJp4Wic7S+lzDz9XU+iFd+8UivicAcbbPoeUkigJ6Q0T4uRqLm0X7qN1WGuoiprlrGBxWiClIMmiT8aU5W2w1h/XfFHx/OERP/7HEx7/tM/h81PK5cejYoMPSw06A6tUDZhw1iA9qh9xXD9GiYBRuMu97B/ZjO9/1P25CajQF1h1kTLdP2W6P0MqSZzFZIO0awBc7jwKAsV4s8fdP2zx4tmUJw+PfcFkHUpKBqOU4Sj101XXdejnJYt5ya8/HvCX755RVy239ybcfjBhstknCD+vBba/RfjYkMZMWba/smh+ZNH8zLL9FeNKjCs7WntKKIf0wwf0wgfEaoNIjXFd7Mjlt6lp7ZLaHLNsfmXR/kKpn9OYY2pzgrEF2pW4zvVXCEUg+wSiRy+8Ry+8Tz/6CiUiIjXuplvq3NfeNZrQ5O0jDsv/h0X7M0okhHKEEgnD6GucG/CuqdPZPdRR6yOm1b9zUP7f3ZSvxLqafnifLNzjZpXOHx5CCMJAkkQBoVJIIWiMoahbFmVN1bQYa33TzDrqvGF2OOfg4RG3HmxT5RXtBQ2nfJZz9PSY2dGC+3+8+9sXWCtIBMNgkzvp1wDroiKR2RuNEISQKPwEbCu6i7YNFsOiPV6bVpRmiXaXpzIoEdALxmzHdxmEG92Ux4eIrkTTiep5DZDTSALvyhbfYxRuEYlkPZHxltI+C6fQM2/00NEAa1vQWl9YnsGx1FMOqoccN56Cp0TAONphJ37A7fRLxtEtH156gbbAZ3ooBuEG0AVu6pNuWw1tt/A4aZ4Ty8xPK67RSc/UgFvJF+zE95hEu56O2WVuvbpfEkkoY3rBuKM5fjrOb+9CZX0xdNI8Z6mn1LbAOUcgI0bhFnvpN9xOv2IjukMvGL59EiUkoYhA+ZtdJJO1Vf1lkakBO8l9RuFW51LZJ5E9AhlcfJ10OqhIpkyiW+zZbwAo9JzWzGlsSWFmXc7Y1bUioUzoqSHDaJud+D7bSXctvKFgjGTKONzGOcu8PeGoeYrV1l+/zlDZnIU+JpABscuQXb5W6xoKnTNrp74wFxCIAO1Sfks6wXnczgb869YdnhdzjqqcRVMzjlPGcUok/Y26tZaTquCkKojU9bQ9HwrOOax1HB0t+e675+wfzImirtB65bUrDdbGTXetO2W/7ZoDS3NKZBPvGnhuilWbknl7jEUTioheMGJFM30bpJKkvZjRhqdAXbfAWqHMaw6eTnn66yFCCIaTHpc0NrxRFIuSxazk8U/7/PzdM378zyccvZihbzj/SHTPklj6JtZlXSI/NwSBIu3HWNNHhYpskHU6QV94xVmMNca7k71j2hrFAbduj3HOkfVigkCRLyv2n51yepITxQFxHPrf090bmkbT1Jqm0fT6MTu7I+5/scX9L7bZ2R0TRTdLz74qrGv8FMkcMq9/YNZ8T6Gf0toFQkhiuYESSSfv8BRB42qW7S9U5pBQ9jvq3Mmlt2lcQ6n3WTQ/kutHFO1jWrsEHJEagxqfBah7pTvWtVjXUJlDtCtp7bKbIjUkaps42EKtafxdhqgLCdWINLhNaxdoW9B2lMFKH6NE2v28fZ1hO9pkY09p7CnGFSiREodjYrWFEllX5N38M+xDQggIpCQKvL5Q4J+RrTZUtaYsaop5SXW0ZHY4Y//XQ5788IyT/VOe/PCcOIt58YvXkznAWW8g8+KXA6b7M6yx2GvqcK91tQkkg3CTtMsrOh+AKt9wA/X0OEGmBmzFewghmLfHPO+mWc7klGZBa69QYMmwK5juMggmXY6KIpYJKLsusAozxxrfIe0HE7bjewyDLb+47vbXoTxtKhixDPwUbDVNqE1BG9QvdUMcjqU+Zb9+yFH9tKMRhkzCW9zv/T1b8R7jcIcsGLzxoaKEYhBMSNWAyi45aZ6z0FMKPaPRJYVZcFK/6KyM+xBuXfrYvAxHpobcTr7gbvZtpyOKkVzUVRMdX97rwJyy3UTy83gwVibntNnnpH7Oop1Sm5JAegOLYbjFXvYtf+j9I7FMiWX61s8mUQgpUfhcp15g14HDl0WqBkQywWJeuk7EG0b2q8I7Vr7AUiKgNAsOqkcs9Yl3ntSuC9y++k0gkjHDcIud+B7b8X124vtvnU5GMmEc7RDJhOPmKb1g5K/XLiy5NgWL9oRU9RkEGucib3JhGwqTM2+nXYh0QCzTzpnyZqZBu9mAcZxyq+jz/ekhz/MFXw4nfDHcIAsiAilZtg0/nB5SG70uum4WriuwvJvgfF6SpCH9XkyvH/uH5zn2URyHfPmlYzhMb7TAcp3HoXP+XM31DCNbtK1fcj+sO2c5bVt6wRiLXet23wa1KrDWGpMPWGA9O2X8yxHDcQ9rtz4Lck2+qDh4NuXxjwf8/N0zfvqvpzSNRrc3W2BJIbocwb634f/U9VPvCRUq0l5CEPjiSu9097luAh2lIUZbCDzr5m23lTAK2NkdMZpkhIHCaMujXw558XTK4f7Kat+t3QmF8JpEKQS37oy5fXeDe19s8eW3u3z59S2fxfUZFlilfs6s/jOz5jtm9Z+pzUlHyUuJ1SZJsIsUAda1GFtRmyMK/QQpQpRIsa6lNtMrbLOm0i+YNX+m1M8o9XMAPxGTY5TMCESGQOKwaFtSmQMqc0BtDinaJ9TmGNdN3oisp/uda7ALlG/cyiFpcIfGTMndYxp9Qm2m1OaYUA2JpUK9QwBgXOW1V2ZKa2doWxCFE9LgDkmwRSDTG9c9fwwIfJhwGKh10LG1jlZbqqalLBryRUm5P+fx9095+sNznv+yz3R/xuMfntE2mt7QDyscnh5utCGfFSyOF2TDDGvttQyt3+uorx96Ai/Sv6TA/rwdciAjsmBAbSdripTFQmcs4AXRFpx85b2vQyK7omhMrFK/IO6Eh0oGBNIbCQQiohU1EkkkU/rBhERlnVGBWH82PzlI1pMwH5bsQ1tt55Lo6Y5t51C3YNlOKbtiLFIpWeCds4bB5hsXri8dDxER4OkVvWBETw1pzIoWVrLUU3J9SvNejnvCf95wwiDcoB9OyIIR60/8yrE9//9FVwx8bmisd4ictUdUdonFEsnE00JXVNZgo2sGvH1CsTKqAHmliuD84jCQV3OBFB1vXBEQqx4DHInqr10eV9Mhg+50bZariFhDkTAIN9nogreTN9Ajz/bHnwexytaZRYVcrKmLZxPexi+OBQjnp6CiK+BX+73S490UkiAkCUKWbUMo5NpYIVYBaRASSEnbBXLWRqOtXVMJVxqt3xpSSrIsZmOjT1W1OM6sl1cLrbP/pdvf33w3X4PFdNTaKQt9wrw5opQxSoQvNdHm7ZF35ez0uu+eXXmoQNIbpGzeGtH7gMVkmdccPpuS9RO274zJFxVpFhNE6oMVcdfFirqiW0M+L8kXFY9/OuDxj/v88ufn7D+ZsvyIroFXQSgSJtEe97J/YhLtEb4jJP1zhW40y9OcfF52kSZnZ3GFw536760/8pk7UeInUBfpKKUUJGlInATs3B7RNJowVF6DOUxpW03bmrWQX0pBFAWEccBuV2DdubfB9q0R/WH6SUzhLwvXmXNpt6TQz5g1fyZvn9DaOVJEZMFdeuG9bjq0gxQK69qu2Nmn0hNaM6Oxc1o7x7jq3RvtIERAKAckasfT/OQYIQJiNSGSEwKZojrTCK9xL6nMIbU+ZNk+InePaMwpRfu002Vt0j9ntnF+3RfJIVm4R2N9UVW4lsaeUuinhLJHECaEb80DdbQ295/ZHKJtDjhCOaQX3usmWJ/Xd39ZrGjw57OqrHMYa32OofAT5TiNyAYp2TAl7u7hYXedhOcyIm2gsNYSxSGjzQGDjT7j7eHNBQ1fBxK1DtlVIuwWLb4Xb8/94x+373Ks8wWKd+h7tTsm1uLblTmDEIJQRp7mJePXumkretYq7Ne78dlO8G/XuqbGVmsnxNoWXg/WFZ2+kz9ZL4ovi0CE6wXsUs5Y5XIVZk6hF1eiTp4/PmkwYCO6zSjcJpbp725c/CoaW7FoT1joYxpT4rN3vO5qFN3qvhfvdvcpYxVb8KrBietcgvz5aLC47iq5ZIElIwbBhI1o1+cOXTrYVRCKyJtZyAQl1Fnh1DVGcG7dqAhkSCRjP03mLDrAXqct9IFgnKW2hrxtWLYNi6bGOgil9E6DTc28qSlNi7nhakUpwWicsnd3QtOJc6X0XXGlXjeziMKA5AOYPlwXxvoICh+uvc+03WflJjtt9tevW5nSZLJPuLpPX+JcVoGiP0zZvj1mMExR4YeaYDUcPjslCBR7f9ji9GiJ23T0ZPLJFFjgF+t11bL/dMrTXw755c/P+OW7Z+w/mTI7Wd707q0Rqx67ydf0gw364SbxuQy03xPKvObg8TFHT08Iu4nRaoFmtKHu3Cl3/7DN7S92kLKPCgPeZPa5arSNN/qEYcD2rRFf/+k2+aKmqhrqLk5ACE+XTdKINA3p9RN6g4ReP6HfTz67BbbDYFxNa+YU7VPm9Z/RndYqCW6zkfwLG8m/Ecgegeytp0nWNbR2TmtmnNbfMa3/F7U57PRSl4MSCVl4HykTXNdUlyLwdD2ZIgkQ59Z0vrBbom3OUfX/oktPSazNEaJVDKKvcFxsqBCqIb3gLq05JZcPAUdrZhTtYyI5JFbvYis5WuuPUan30bZYOxH2gvtdkfj7bGaALxvkOeaGw2GMRTvrp8mDlEESEUSKKIm80cXRnM07E+58eetlF0HfPfXU2zSiN8rYuD25uQJr1UFbPRxt5zhmu8Xf2jWKs9d178R0AbC1LXzRcE6st/7HOZxw73zMCiHWuT0XOdzJLuNIri21Ber8ovVV/ZGQyM79cG3Hjg9r7QgvOOx6erWyV9euRRGA8NO41jVUNqe2+aWPaWF8KLI8p2Fbufl5DdnVXaCEECSy5+3rgwmh/PxuuFdFYytyfcpSn/ocLwSJ6q/NJVa0wN8KK2tW1537thPeroKVV+f7Galq9T7rs7icXgdVr2DPXSv+fZcvmwPpdS7DThN2ecqOv3ZilRLK+GzC63yQsVlfI2JNcwxlRKp6OHyUwzrqgJuV3XrakuwmVoZ5W9Nau6YI1tasDS/gphRj3b5KSb8Xs7U1oK7bdeDomwS4Uonrhe5+IFhsZxRU+GBx622Ocz1Dn7uXJbJHFnhXzVAml3ZKVYEkGyRIJemPMuIkQgUSa958bC6DpmrRjUYqyYvHJzx7eOTp5VL6H/Vm98aPiZUOzxrr3ekazenRgsc/7vPjfz7h1++f8+v3Lz6p4gq85nMS7zGJ3+4M/LlDN5p8XnJ6OCftJyS9eN3k0I1mOSvITwt6w4yNWw1p33S6wdefRWtWjYB+Vyxt3bIYbdHarB0DjbEI/LWQZBFpGiE7ytTqDtDU+iwz7+ZvC++EdRptc2o7pTL75PoxSqREakIW3GEU/5HN9H9nZSBxZhzmCzNv596wbH+5sv5Iipg0uEWkJp10IPAMDtSZM+E5+EZni0NTmyNmzfc0xrsOOm1ozWwdQQGvMFtEjzTYXVMChVC0dkmun/jJV/TFmp0CnPucZ2vq1s4p9FMqc4BxFZLIH6dwj1htvmQV/3uDc50D8Pn/362lVKiIs4h+GJL2E4IwYHGyYPr8lFv3t9j9Yofh5tl0UEqJUIKsn9Ab90h7yfo6el9cPwcLg3GG2uQUZk6pF95xraMLadesF2CrReUqn2lVYL0of33pYeuxygq4DEQX4Bt0YsdXKG8ddWp1w/EOYd7tTAr1GuVHXPBfZ/vi/31+grXKAaP7XLXJeVL8mdbW3hzhCijMnHl7zEKfUJgZK8cZn8nUvpehgadkhj7rqrME/71jZUfemBLjNILVZHFAojKCK2ZMXBcO22mSVtPIObUtqE1BY+uXrewx6xBi22mcjNMc1o8ozPyD7I9EEcmks92/vEOaoBvLo7rGxNn73LlrdlVIaquJZMQwHPuA2aBHpvpkwc0bpvSCiAeDMbEKsDhO65JTPKXKOkc/jPjHjVvc7Q1JVXjj6xIhBUoJ6qplelpQ5LV/uNjX75NJEtLrxdzevZrV74fGKvNqI7qN6KjZQoguaDg79zpP445V743OoxdBCuGnBELQH6eMt/qcHi8o85q6fH9Lcucc1kGV1zz6ywuEFHz9D3t8pe+yszchSSOS7Gr39g8BZx1VXlPkNcf7Mw6fTnnx+JgnPx/y5JdDpgdz6vLjZV39DW9HnEZs7I6QUpD2E9J+si7E21aTzwry05zx9hAVKB8+fIlGgDG+sGoa3WW0tdR1S11prxPBT7SLvCGM1FlxtVJzCMFgmNIfpoTy06f8G1dR6yMq/YLWLrpMp/6aGhjK0RsKJ4EUAZB0RcYdGjulbJ+jzeWciv36MFz9V9d8fPlZ99o7unWnkt7JMJAZ2ubeyY8W3qCTliIikEMiNSGSXuPl0FR6nyo4oLVLHBqv1b6goeMsrZlT6ufU2uu+AtkjUmMStU2ohsgrSBM+J1jrqFtNXjY0rfYxK0IgpddmrXTTKpCEcUh/3OP2FzvoRnPrwTbbdzfJhufdav0zNoxCT91V4trNiA8QNGwwtlkbMZy2+yxab79ddlOXZhUwu85CWnXv/WJS2/aCAus83tU77vRWBG801xDntCDAuiCTFxRkb+6rn00XfGe2otSLtdX8ylGmMjlPiu95Vv505UXk2aK6C7NjdYy9vbZ7rwLLL3TiLuz4c9RUXRXGaRrrs6tWgdKhjMmCQaeJ+21vOqsw5doWzJrDzsjkhGU7pTBzKlv4fbUt2jXra2NVYHk++lkswRkcV2tGePgA2IRYZgQyutJZKjqDj5VT6Nnc7dyM2tm13ioUvsCKVcIgGJKqrJsy32zJ0g8jHgwmTOKMR8tTHi1OKU2LtpZYBdzpDbkzGrKRpGTB6059vzWkEARKUlUtR4cLjo+XaGMx5nX6S68Xs7s7wlzTBem6UOcKrLjTvXrX1yGJ6p17pThrhF3BSEdIT+kIo4DBKGO82Wc4znxg8DUKLPDFTFnUPPpx3zvxtYb+MCPrx2vr9t8azvl9mh0tePSXF/zwvx7z8IcXHO/PON6fYbRdL7j/ht8ecRqxcWtMb5iRDlI/XV0VWE1XYM0LwijwBZa9nFbSGkvb+vDoxbxkuahoW4M+p8FCnDXAXoXstJppFhF+Blbt3qzimFK/oDVLHJZADuiFe/TCe14XdaHtjEAQojrNVBbs0Zgp2i6pzMElty4QBFeSEPh9UWureCUyNDnaVd106+IQXilipIiI5MQXWWqCtktK84JKH6DNsqMoXnRfXDGp5hT6GbU5BiBSfSI5Jgl2COWQz8L+9D1gnS+wllVXYFnPdlNSeFfBrskglSSSkv6kx+6Xt0j6CaOtIaPtIXH6yj1cnA1kPsQD/70KLL94rahNyaw9ZNYe+KlLe8JSn64786uiQwrpK3Wi9TpwNckyTntzCL3AvaHKfxP8gWBdNr3p5oJ4tcxZzbEuK6V+Hd7kwqzpW6sP1iXo+AmZCHivb+mVt6ys71cZXO/z67yuTJ0zHfh9wznbFaWtN0/BUz99PlP4m7jCOWfXuVULPWXWHDBrj1joExbtsS+qTNE1F/zNIZChp5muH7qrTDJHZZYU7v10eK9idT4EInxtEnVdrAiCUkgUCovtmiw++K+1LYlKSeTNBfeehwMqo5k1FbluMNaSBiHjOKG1BtPpLm+SVmuM5eQk59dfjyjLluEwpdeLu/2/YIIVh2xs9H1Gzg1iVTApEaBkSCgjWltz2h5AK9bh66vzfGXnHV1SN3CeRjWc9Ljzhy2KRUVTaxan18/Ws8aHDhttePLTPnEcMj1asH1nzPbtMb1h6jO44pAgVKgPYLJhrfOOVsZ6zU7VUuY1+bxkOSuZHs45OZh76uKvRxw+P2U5L2nqi3Uer0IFkv4wpT/K/O9dlDSVvhal8m/wUIEi6SUEUUCURgRRsC6whBQ4myKDFc1UEoTqjdECaxpgXnN4MOfwxYzZtKAsGqqy8VRR57hMhaYCxZ+MZbzRI3l1UfkJwtKibU5rFmuDCiVjQjkiVCOUjC+8H583kJAiJpRDQjlEXjmU2rcLtV3Q2iXG5WhbYlzV6bJ80eTWjXAHWGb1nyk6Mw7jaljl/Z3vgZ7b7bWZlUxJgx364R/I28deR2YXVOaQUr8gUmMiOWJFJXXoztZ90dERFwBEakwa3vH5WyL8Xbp1amPRxjAvKo5mOU+OZkyXJdpYlBTEYUCWRERd+PCqWDrPYpvun3L8fIoznYHVBSyQOI3Y2ttgc2/jvZ/971VgadtS6DlzfcLT4nueFD+w0MfUtkTbZv3Aj2XaTU28I59f2K7sqf0Ot7bmuHlGZQrMe9Lf/AG8zuLnfd7rOnqkXhtfrKiHSgQkskessjdO1K6CSKXEMvOTF/l+kxd/cq3G3X8FBdZa52fWCwfJ+anlx7/xWByVLVi0U/arX3hSfM9R/WQ9WVtdJ97YpNflYq1Cel+erjoc0+aFp92aD1BgrWh+3fX4obH6/UoGaK0pdI7DUuqcVGWMo03i6ObChgGsg9ZaatOSt40vsNoG6yyttd7ooq3ph9GNm1xo7e3Z//KXfUajjHv3NtjY6J3pKl5BECg2N/s3m4H1ClYMgtIsmDb7VDZnM95jK9oDnNewdpmGkby6MHswzrj75Q75ouL44MNQaZ1zmNZgjeXpr0csTgue/HLAva92uPvlDrv3N9m9v8lwnJGI+IMUWM76aUVTtcxOcmbHS45ezHjx+JiDJ1NOugIrX1SUy5q6aq5kwx6GARs7Q24/2OJ4f4Z9bLtJCBcuNP6Gy0MGkigNCePgNf2GlP7vVLha+IGQ8o1GNEZb5qc5Rwdz/vLfz/n+v55yuD9Ha4PRFrHq0l/iFhqEitE446u/2/1QH/WjwjmNdgWt83lS4JAiIlQDQjlAXkJ6IQkJZI9QDs5lUF1y+/jCqbFTivYZldmnPh80bAus86ZOFg0dy6QxpzR22v19e85g4u3XlRIJidphEH2JtjmFfuqnbnqfUj/tGk/D9dPSupbWzqn0Po2ZYmzhc8HUlp/wqfFvssa5CWhjKOuWWV6xP13w6GBKXjW0xhAoSRKF9JKIKHw5BmF1L28qzeGTIw6fHFPMy3Uz61WMtgb8/f/xLRu3J+89BLxSgbUyrGhsyWl7wEH1iOflTzwrf6SyORKf5J50PPpMDcjUkLizgA5F1C0cA4ToHJA6vdZJ/Zz3MW5+3+WZuNa7z3DeuMObUnttyzDcWucXXRehjAllzDjaIZHv7760mtf9zv0tgPN6IHfO/uF6U8tLb9utzCxaFu0JB/Ujnlc/8az6kWn9Yl3UJF0+2+o6SYMBoYgIpHe8XBmt+N/nqYKz9ojSLD7IfgohXmp2fGisfq/XK9berAVvBpMG/ZdIhTdRaLXWsGhrTuoS6yyDMCZSCuccoVRY5zipC4ZRjLFnWombmGRZaynLltPTgsEgYTLJ2NvbIAjkhUWUlII4DlA3YMRwMc6s/Euz7GixOT0zoraF167asnPMTF6aplz2ePdHGbv3Npmd5Dz56YA4CdeGANeBtQ6sY36yZDHNmU8LqqIhX1YsZgX5vGS02ac3SEiyGBX4ondlHyzkWfd0LU7vuqZ+AOH/21qLMY620VRFTZnXnB4vOT1ecvhsyotHx+w/OWF2kjM/ya9M/wxCb67yUjUAACAASURBVE882uyz98U2X/39HkkaUeU1Td3SNpr2AwQSW+dorKa15lzzEZSQKHEWu2Kdd/uyznV/d2Ymw7nXG2fXzdfV3bu2mtq0BFIRy4BIBh3t//JRFR8DKxOUiyCkIJABwSV7pG1rODla8utPBzx5dMTBixmLWUkYKaLIF3DyAgfRixCGChVcT7D/W2JtVmErX8AAkmAdvisvQfH3zn9JF0T87nXYymTKuLoL/J2R60fk7UMqfUhjT2nN3BdWNLhVc90Z6AoybXOMq3H4P+t+87l/X3z8pYiJg216rqRonyJFgHEVlTkgb58QyAEpd9avt66lMVMK/ZTanmBcTSB7JMEWWXCeQvnm71sbS6sNrTHraejb+ojzoqZ55V6qjaVsWuZFTRZXJFH4gc+x1f2Std54UVbM8opfnp/w9HjGybxAW4sxljQK6ScR415K+sq+mNawPM05fHLM9GDGcppT5pUPFL5ogpVF6NZcK+7kSqt/i9dV5HrGfvUrv+T/waw5pLYFoYjohxOG4Rab0R024zudlXNMIKOuWx6sF3QremCuZ5w0z70u6LNqnq2oL+osu0XIzjFtwG7yBQ96//DWbKHLYjXNSFWffji5/q7/FUB034fsKGrQ6dtYaQA/3sm2MrSoTclx85SH+X9yVD8l1zOEEPSCEf1wY32d9IMxkUjWrnw+HkB2GidPyV1dK6H4+aPt94fE2uSiewgB3WJL01j5Eq32plCaluf5nKf5nEEU889bt9eLvNoYjqucg2LJJE5prHmnEvRjQghBGCpvwdyL6fcTBoMEKcWFHXAhxIX27TcFB5Rd+Hdlc99YCIYksnfOMGhBIEL6dvJehXfWT9i6Peb0eMnW7ojxVp9iUZEvK6y5/rm2yhuryobDZ1Oqoubg6ZSf/uspvWFK1k/I+jFZLybtxYRRsKYNqsAvhlfFlNEWo816GqFbQ121VGVDVTSUy4oyr6k6OlixqFjOCpaLirqjh10VaS9eT66++ad7/PFfHxCEisVpQVW2LGfFBymwjLPMmoKTOqfpok2kEKQqIlVhF9IuqK1mqSsqo+mpiDSI1u/3Rij+z0rdUJoG2zU+BIKDas5BNacfxtxKRmzGfVIVkqpPn/52WTSNZv/5Kd//5zO0NuzcHvHF17fYujVkc2vQ5WddTisipeTeH7bI+p+Ho5x31TXddGhVqEjE2snvMvcF0VmqX46x4qdWhsaeMqv/m1n9HZXZp9QHWNcgRYQSEaEcEMgMIQL/+1GdDEWSt08o9GNqc9xlUl0OSkTEahNwzNVmF5DcUOkDcvmILLjjj0P3sa1rqM0xefuQxky7aVlKona8CYgav5MeWLea6aLgNK+oW90ZRbz59Q/3p8zzl/PEqqblaJbz+OCUvGo4XZYftMDyzWXfYKxbQ91qjuc5B6dLnh3PeXR4Smt8EeSAKFRMBim3Jn36afySFKSpGvYfHvL9//iR4eaA3S+2ibMYIS9uPGSDhO27G9eKOrlageWspweaOQfVQ35d/sfaRTAJe4zCLXaTr7iX/ZF72R+JZMwqd+pVGKtpXc28PeZJ8cNHoSl9THj//c7OvbOclkgCEZKqPreSB3w9+DcS2ete/4msdP5KsLII9wW9XE9fzSpG4KMWWH561diS4/oZj/L/ZqFPMM4QSx+IvRPfX18nw3Cz0+29fg14upp3GTysH3+Qgv23gHdhe5lCa/H3DyFk9+cOsZou3sDlUeqW/XLJk+Up/7q9xz9u7tIPIySCk6rgfxw+4bvpAbd7Q9quwIKbKbJWBVaSRGRZTK8X0+utFpMX79GndcvxGsLT9gBwDMMtesEIgcQ6S2NLSrMkECGtrc9NnS+PrB+T9WMW05yt22Mm20Ocg7JosBcYgbzXp3Css4yOXszWfx4lobf3HSaMNvqMOq1LnEREiS+0gkhhTWex3hqauqWpNU2taWvNcl76ImpeUiw9/e+DQfgCdGdvgy++vc3X/3SPP/3bH2hqzfPHJ5weL2jqlnxx+UDWN8E4y6wteVJMqWyLdpZASIZhyjBI/GRKSgrdcFQvWOqacZgxjjw7o3UGJQTDMMPimLcl86bEOkesQqSAX5aH/LjYZzPu4xzEMkAJQaKuZtjzKaNtNAfPZ/zw30/Z3Zvwh692+OKbW3z1d7s8+HLHv0j8XtcWvthxTq81Tn4K3NmyX+Jb9pII1RVZlzlGdj0ZmtX/zYvi/6IxM1q7IBAZaXCHMLxDEmyTBLuEsk8gss6oIkSKkGn1Hzh0Rx9sL52/JUVErDZQIiEKNglkSmNOqcwBUkeM7B87zdfKxXpVYD2iMSc4pwlWBVZwj0C+O9uybjVH84Jnx3Pyqmb5jsbN85M58+Ll+0PZtBzOloSBZLosOcyWH5SN4tcRDm0sedWwrBqen8x5cnjKyaJEW4M5t89xEDDpZ+xOBgyy+CUGR1O1HD4+4i//38/84//5R249+IpbD7YJooAger0U8nrK+LfLwWptRW7mLPWU2pbYjtSnhKIXDNmJH7CXfcMo3OqocW/esdU0bBVO+rnpawXehS1VfR9WjMRiaF3tLepd7T9XJ9z+G35bKOlzziKZ4WxO65out2xJbXJM8PHsq7VtKc2SuT6mMjnatWuzl1ilbMZ3uN/709pZ7e2hqr5Qaa2PO7iqEcxNYUU/VJ0o13Z6OF9kaZZ6zlGz7y3bVXblOIMPCYenC5a6QQn/+K6NpjXe4MKuqIHcrHrRWk+RODpa8N13z9g/mBNFAVHnCnZ+EaGUZDLpMZlkn4wOa2UAZLtMt8oUnfGO8lRxU2BljMVci8rbG6Y8+Ltd6qrlx/98QrGsKJY1ztqP9pzxroWN5/lrS7ms/AQrUKhQIZWfKK6yy6yxaG0xrVnTGJu69fbbVXslTdXbIISgN0zoDfwx+faf7/Pl3++xvTtCSkmchow3+4w2+ixm5QfZpnOOxmhyUxPLgM24TyQDKtNy0iyxjs5AwHTFlKSxmllbkAUx/cAbGBxUM/48e8Yk6rER9+gFMaH0webjKFv/jKKUQZgQyZuPUviQcNbRtoaqbImTkJ3bI27dGdMbdLqe39OHfQ1+WnWmlxbrvKkzV753oKPWny9M3obWLqj0AcvmZ0r9gsbMuoJnTBrcZhB9TT98QKjOjDOkCJGE68IvUg/XFu9X+4K6Fr0IiOSYLLgHSIwracyU2kxpzCmhMkhCjCupzQmFfoZxDaEaEKkNQjUikL1Oo/b27VdNy8Hpkp9fHHO6KL1RxFscSOd5xeny5QKrqFr2T5dUjSaJApIw+LCdvY62aJyjaTV1a5gVJXnddrR9/zIlJUoJRv2Eva0RX97eZHOQoc4VR0IKwiQkHST0RhmDSZ/+pIdU8kLtrJCCILyexOdqBZaryfXMOwWaogvE9RdBpkbsJPfZS79Zh4m+7QHpaVSdJTWGm6YLXRVSSCIRrwssKeRaa1KbktbWXaCsfSms9G/4baBEQCRTYpWiXUNDjbYNpfbB0MZeznHrfWBcS2kWLNoTSrNcF1gKRSwzNqLb3M/+5HPJZPyO68R1jYh67cL3eWBlouFvMSuao3UWg2apFzhgIzJEMiS8ogj5Q6O1lkK3SASBVNRG01iDtmcF1s3CrUNmj46XLJcVSRrR78X0OtrP+fMojgO++GKb4TD5ZAos7+wl0M6HsAtb+GgNoWhMSWNLfENBX+t+2R+lPPi728RJSLGsefLzIXXZYlaOXh8B1hjqyuunyrzu6JkrI4NXdEFdgfGSBmsVIGwtzlycbfY+EFLQH2bs7I19gfUv9/nyT3skWYRUgiSJ/MRts8/Ri9MPsk0HNFaT65peErObjEhUyKP8mGdNTmM0jdUoIcmCiFiGNFZTmoZIBvRDr8H7rprzP49/5Z8n97mTjdlOBkghMNZ2hVX3E2YMwsuHU38ucM6hW0NZNkRxwM7tMbt3JmS9+HdeXJ1R/Ff0OwCHwboGR3OpyZCnGZ53+Xs7WrugaJ+wbH+m1M9p7YwoGNML7zOMvmWS/BOD6BvvIYCn8bNe2/kfX3hFa7e6q1zFnu0VEKkxWXgX40ry9hG1OaExUxo79dRv0UPbisacULTPCGRKIAfEakIkfYF1mRiUstEczpb8/PyYg9MlB6c+9uNN0MZSty+vm4q6pZ0uOJ7nvqH6EcLtPTPbrTVY2lraLo5irddUgjgIGPVS9rZGfLG7wSCNXzKAklIQxSHZIKU3yuhv9OiPe280yVvdu6+DKxVYPii1OrNc7owdfMZSSqoG9M5NBt72kPT27EuW+pTGVh+VsvUxIJFEMvGBmTIjFF4/45wXc5cmZ9GeIJAkKnsPm9C/4ToIRUwvGJKp4ToQurIF8/aIQbjBhr2NdXZ9jn5ImoXPSGtobOmLq247UgSEMiZRPXrBeG2A8rbrZEWfWupTKpNj3ccrDD8kVjbtgQhIVcYonJDabH3PiFRMtG7E3MzCKFYBG3FGkbYI4LDMmckKJQSV9ov8W+mAUeQ75zdJxRFCkqYR43FGVbfrBbk2lrabdpynWkol/APok7mtChKVMQg2qWzu75O2xQqDcH6hkqh+17BK3utYr94TxSHjrT5CwL2vdjh8NuX5w2OmRwuKRflRjolzeMtfA3yg6dN1EISKOI3oDRLufb3Dg292+fJPd9i9t8lo8yzk20+weow3+8TJh2pydLqJzrwiDbw2SgioTbueCkvORPVSiG5awVk0gnMooTpjLW+akaoQpQICoTwx33Vkso5u/InxYq8FIQQqkMSxp5jKc5k0v09a4BmEUN6gQqbroFzrNMaVaFti1bufgw6DcVVnlPHua9LYitqeUJkjWrv0uibpqYG98D5pcIc0uPX6dl66oUisazG2udQ2zz5vtw5xikhN6IX3ae2MUj9fOxOW+jnWtYRy2BVcc7TNidSIVO2QBDsEsn8pAxCAQErSKGSYxeRVQxKFFHVD03rjC2+H/vZJobEW09wMq0YIQaS8ydP2sMfWqMc3d7bY2xwy6aeEwavPbOFdO5WkWJQcPDpCN7rTyKrVS9YIgoBsmJIN3z9O5sougqt/ViNa2WXpqM7A4rLQtibXp5y2B5RdkNznBCkUkUrXC4NYZYQmRndUrlzPOG6edR0H9dloZ34viGRCP5gwCDcozByHozQLTpoX9MNJV6zYj+Si59ZGF6vzWiAJZEggI2+McsltWmcozIJpu0+uZ+8I5P50sIosCCWMwgmxSjBuNan214QSqotwuJmk+V4Qca8/Ig1C5k3F0+UM3S3spJCkKuDbyTa72ZBEXd8N9DpQSjAap+zdndA0nauWFASBIghWZhZn51QUKuIkvJZA90NCAL3AsxyW+rQLol+irb9GYpkxjDbpBeOXmnTvA6kkSRrhJj0e/N0uRht6g4S//McTyrwG+/EmWZ8KoiRk89aIW3cnfPvPD/j2X+5za2/CaKP30qIjTqO1ZixOP9R16CeVgexc/c6dl0IIIhGQqi6RUQiMs2RBRKYiAqmYNQXaGnpBzB9HtxmEKbOmIBCK7WRAL4gxzlIbTaFrlm3FMqy8KcbvyORCSkGaRYwmGUpJ8rxmMSsJAkWW/b7XE0IEKJmds2QXWNfQ2iWtXXTW7W+HdS3aFWiXX+r1jhZtC7Q9e30o+6TBble8vM3B+UwbpW2OdgXOaS4OQ34zBIJIjuiHD6jNEQv5I7U5ojEn5O1DtC2I5JjKHKLtAochkH2ycI802H3HPr6MLAm5uz1CG8OolzLMEk4WBbO8Yl5UFHX7QSJhPhaUFGRxRD+N+GZviz/e2+Gr25vc2RwShYEPG37pHQ5nLdZYDh4eUZcN/XGPtO/dX4GXGjTpIGHvq13SfoJQ7/ccfb9Vw7ln02oh5Y0E3HoqcL6bup5OOdZ206XJmbVHTJsXlGaxdhr7XCCEJBS+A58FA7JgRK5nFG7ltHjKUf3YT/dkj0ima8OF1XG5aJG9svj2x8kXsrILLl5bjf/Ou1cfApFMGAQbDINNTuUBAkFtCmbukNNms5sILQlXLpfuzcf2bDHWRf46y8o18rxW5Px7X12+rQJXJbKzHF3pTOTr1wlnJhF+enXCSfOMpZ5+PgVWt7CSQtKXIX2GN71LryFSio0kQ0nJsq05qnIqrbE4ekHEaDDhXn9MP4zQzlK0TbdolHjzrt/uWlRKMhik7O4OaRqDtRZPl7+4UAhDRfjJUAMBBLHMkKGfSKzs2gFwPjNxGG7RD8YoEVKbYk0/X10nlz3Wq2wwqSR3HmwRJyHOOmbHOYvTgqZqabop4O+tzlKBD68dbfS4fX+TP3y7yzf/dJdv//k+/WH62vQjTkOGGz1GG33iDxRAKwSEUtELImIVojo31FAqYhmSqIC4y3NsrcYBvSBmEvU8tbCtaZxhFGZsxQNaZ2isYakrxjbzahUh1o6f2hpqo4nkzTZB3gcrWuhFLpfGOuI4ZLzRQwrB7CTnqD9HKT/VWgenvtJcuRDCF2xKfR5W7ZKQUPQJ5RDVZeKt7dPtDGOr9XMYzs7pl57Vrqa1cxozx7p3G8ZYZ7Cu9mHCnTW8EklHvRu/hYXk1towbXNv1W7LztnvqvdgQSSHiFBQ6KeEsg/gLePbR2hbolVOY2edS6EjlAPSYI8kuHW1AiuOuL0xJAoU/SxmmCUczJYcni45XhTM84ooUBhrX6LmmXM6LSm8k6VaZbKdW/d/aKx+rezO+yQKmQxSNvoZ397d5t++3mNvc0g/jYkuevYJgQwUQRSwPM1ZTJfEaUR/3CMbZt298WxLg40+w43BtZpxV7oj+WIhJVEZqus6G6dpbEXVZZsUekYkky4o8tUj7SjMglzPOKwe8aL6hf3qVxbtCfaSbiufHgT9YIPd5AuccxzVj1noKbP2CFnKztxA4bCkakCmBm/9bcZ5d8XGlJRmQWEW9IIRvWBEJDPf+X/PuvivCYnqMYl2qWzOSfN8PUFsbcWsPeRJ+QMOyyS6xTi6tZ6kXNRxWnG5jdNUNqcyOUqExCrpiuzwpbyzVRZaqnrevEEIrDVe2G9zSrNgqU99jIFKLvw+a1tS6Bmn7QEvql95Xv7ErD2ktdd3+fobPCqjOSiXHJRLSt3SCyImcUovjMkCvxAsdMNJXVDqlkQFbCU9NpKMNAhIgxD1G4khhBBEoe9ca12S5y1V9eYiIYoCxuPeJzSpcZ0ucUphFp2jZkYsUyKZEsgQcCz0CY2taG1NLxjTD0Y+R1H8/+y9Z5MkV5am91zlOmTqUpDdPT09vSRtyaUZ+Yk/m7+BZuTucpsz2wKiUYVSKUK7uoIfrkdUFVBVKAU0MN0HlsiyzMhwjwgX9z3nFelbG6FIISgGQ4CPfnOBtZ7xvOTbry759qtL+q6n792/i3Dd/UL76GzCycWUWx8f89Gvz7n3q3PObs9JUv3ShU+SGkbTgtGsHHRZz6zk37W0UBynIwSCyqTk2qCF4jQbo4VCCYke2C5ucBjdW7K74OmMxQ3sAiUEPgRc8KTKUOoEJSSn6Rg/CSRSM0sKKp3+IgFW1/aslzXbzfev65t1g5CCk/Mpfe/44o+PuHyy4uLOnPNbU5LMxKw7JaNl+2uAkxCC0SRnNMkx7ync/ylKyYxUHZGpM4wYIZDYQSNl5JhCX+DpiZZEL96zA0Por19S9w+p7bf0fvOD24wNnRQpMsRwT/ZYbGgi6HoFPd+HjsY9obFP2dlvhwnbGxpxfK8EUqRoIJFTEnWEkVN8sOzsQ1zoBtpjjQ01QmiMnJDrCzJ1ihJvTmczSjLK05iZmBiOxyWbumPTtGzr6Ni3bVrWu5Z13XG53PDgasWTxbP3skgN0ypnXKSkRpOYN3VsfMt3RQxGFlKQGh3zrvKEaVUwq3LuHE84nVYUWfJKzbFJNLPTCXd/fetg/66NIskTknS4tzyHD4tJQVok70U7fqszTUkz3BSLA63HhR7v40Rqa5fs7Aq0GMT7L1YAahtpWo/br3lUR4Dlgn0rvurPqQSCkZ5xnn2K9R1be8Oyf8rKXlK7FQBmv3hPBLmqfkCb1tO5qLm56R5x0z/iKLkdM52ERpDyjtPKv6vKVIkSmtbXlPoLjEij2YVvWfZPkbWk9Vvuht+SyhKhJVLGjvn3KwwOkR1bu2TZX5LKjDJMyTUkQrwAkuRAfcsODpMiOgHS0LgtO7diaxcILdDyRXC2rxjm/ZQnzV953HzJw/ovdL7B/kI0WL+Eaqzlab3hm80SIySlSTjOSi7KEbk2LNqGm7bmwWbJN9slmdL8anI8LGQyUqV/snNRiHiDKIqEzaalaXpWyzp2F1/S/c4yQ/OOeUk/RsUcrA033SO60B4MX8bmiLE5Hmza16ztDYvuCcv+KSfpXXx6hzGR9ve2RihCCooqIx+AQznOmZ2MUEpyc7mGTcA5/4LN7y+19plI89Mxn/3LbT7759t8/JsL7nx2Fmmk5uWLjjQzaK0YzwqyPEFpibPvF2OhheQorZgmRaQKDjmRZ9mE4zQ2GPcGAPtw1xh5EkHXfvEjnntgAKQYolEQnGQjpmkRveaGqfIv0Uiqay3XVxsunyy/97u+cwgBp2cT7n99yTdfXSKE4PLpiuvLI6pRRjXKMIkeJravfv1SSs7DjLxIMX8bRvZbVZwcHZHrFUZWCCHp/WYI3a0YJ7/Ghz5aOYjnDR3CYIbR07sltf12MKxY/+A2BQolUpRID8HEYdB9PQsP/n650FLbx6y6P1LbB1i/IfDuTBMpEqQwJGpKqo5I1AQfOmr7MOrJQhNdeX2NQGHUmFzfIlUnh2nfm5TWipGSlFnC8bg8TKr2tuhN19N0lseLDY9v1vzpwSVNZ18EWFnC+XzExXxElaeM8uzDnoV7TbEQGK1ItGJUpEzKnGmZMa1ypmWO0RKjVMyFfAUgMolmejrhzm9uHa4pMQhevBRD5VVGmn8fx7xNveUEKyFX1WGiUqgxdnAC3NoFj5ovCUClp1R6eqB3hMGa2YaeZf+ERfeEVX8FwMgcDQ5SDTb0QwDpz7+ev5jnqmKWnNH6LVu3og8drYuTjkX/FFP/hc7VXHcPGZvjIZ9Jsw9cjto2NxgaNLRuN0w5bljbG6TQjMycQo0J4udNpbS+p/cNfWixwUYAPmRQMXwPeC7bb1nbG1q3ww0ue63bsbZXXHcFUihqt2FvYb6n2Cmh0SJqmbRIDg6O3y0lNEhBNWRO7YoVi/4Ji/4JLvRs+htCCAfqYK5GZCpHi/SwrTDYikcXv35w0VywtUsm5oTTLGBkEpsN4sVtZ7KgGvQklZ4SBue01tVctvf5YvNfGJk5pZ6SyOxwPO3PgU1/w6J/wrK/pPMNlZ7R+ui0trds/0e9X1nvWHcdN82OaZqTa4MPgVXXsu47bpqam3ZHAM7yCiMVvXc83K2QQjAyGeYn8udwznNzveX+/Wt2dYdzHqUlzbZnt21JU0MyZHlY62hbsPbndK0I9L4dpleWTFVIIel9y9be0LgdO7ei9TWJzDhKbqFlws6tkUKjRUKmyrfaYgxbFqAk5SgjhAmEmIeiE83TBzc8fbhgdbOlqTu65pdBv92XNirmb5Upk6MR06OKj39zzsf/dMHtj084OptEx7nXlJASZQRpllCMckbTIoYb7zr8DwjcX/mcQmCEwnxnsiC/87P9dPX5zLM36X6HIXBYPzc//iXQ3l5W9a7l22+u+eKPj773O+89bWvpmp6b6y3bdUMI8OThEts78jwlLxK0kchXhKXuS2mJlIKj4xF58fPXqUmh0bIgUTMyfUap7w1aqpbaPmTZ/n9IkcQsKjlCoiJgx9L7Nb3fsOr+TB82zzn9vb6UKEjVMZk6oxYPAEHnbth0XyAQg8HGbqDBRU2Y8y2dv2Hd/YV1/xdadzXse4X3b59jFz/DuK9alOT6nELfZmcf0rrrwRUxaruEUGT6lETOMLJCyeytNF9ycM9TL7mHee/ps4TeOoxWlFlC01m+fHSNURI3mCzlieZkUnLvZMZsVDAf5R/0XHz+/NZKopWkSBPK7MWvNyllNOOjUWw6vobZ0exadqsab/17sxveCmAZmSDFmJGeMzJHjM3R0I23bOyCb3b/xk33iErPqPRsEPNLHJbW1ZF3byPtTUtDpaaM9Jy1vWZtr2ncltZ/mCyOn7LitMQM4bJx1H/ZfkPjdmz6G6xvue4eksmSVBUHCmWcbETbaus7+tBhfYcdvve+ow8tlZ5xnn08cI5/3t1WGzq2bnlwvWv9LrqFBTeAyPh11T1g0UWDk953hOCp3Zqb7vGg0dtQ6slg9S0HE5U99W50cKx8lbnKPmi40GPO80/RMuGb3b/R+ZqdW9H4LV3XULs1j5uvyWQRjUpkerCOjmCnP3wOdvje+47b+ecUesRIz/Dyxc6WEppMlQQCIx3PExt6gl3S+ZrHzdds7GI4T6YkMj/cAPZ5QJFyGxejlZ5ymn3Mzi5Z22t2bk3r6l/s1PfnUjZ4drZj1bUUA/Wotj3LrqFxlk0fgda9asKvp8cAPNqtebBZUZmU8+L1dN8PWX3vePRowR/+8IAsM8yPKvI8YbNuWG+iLXg5LKb73tH37oWckJ9D2dAPDoKeTEWtwM6tWNurw/1BC8MsvWCWnLHqr1gPjbhSvZ+GL0kN46nAGE2WG259dMyf/3CfP/2/9/n2q6dcP1n94gBWfE0lxxdTPvntBZ/80y1Ob005uTVjPFD+fqjEoCXUiaIa58yORyyvNnRtHx0Rf4J618nTLxNSvVjbbcv9ry/5w3/+6/d+F/PSAs57ml1H3zkCgcXVht2mjRlrA3CC14NMbRSzecVnv7740V7LhyyBQsmMRE7IzW1G6a/Y9ffZ2QfU9hHXzX+mcU/J1AmZOkWKZNCttwe6nvVbXGhQIsOK7Q9uU8uCXJ/TuQUb+WdA0LinhNbT+xW9W9OZxaC9lli/oXULWndJbb9lZ78FAkoUJFLQsXztQv7N9ueCzizo/CpOr0SLvAK7lgAAIABJREFUD+1gAFKRqVNSNUOJDImCD+TIuwc0Ugjmo4IyS1huG6ZVTmI0vXX03pElhqNxyZ2TCWezEWfT0Wupqu++Q3vtFWilDmBLvwwdvqK0UYzmFekPGMTcPF5QrxvapsPZ92tkvx1FUOjB1GHMLDnnLPuYRf8EgTxYSW/tkpW6plBVnNIIcZjMdL4+UALG8oRJcsrEHKPbBB8cIXjsG7i9/JwqdutSjEyx4YR+6FoIwPqOxm0HjdqOlbhEIDAyIxnCid0APPbAam/2sTcPUULzjDDxrLvxcy3rOzb9Ddfdw3g8uCX9ECYdw2YjHTQ6iS1o/PbZBMvvWNtrbOjYuTXpoDmTqAPAylTF2BwNYdZq6Gp/n/MgBmF1KgtmyRmpzIdw0w2L/skBzG/sglV/hRYmGl4IgxQaNQCs/RTOhh4fLBKFEJLG7145RdqL8wOBiTnmJL13mL5t7fJAE1z3NxR7GuEAEjvf0LloKxuCJ1UFpZ5ykX3Ksn8Ke1AeYk7TP+rdy4dAPwjkXfAIoHY9l/WORddQ257G9dwpJ5zmFYHAo92a67ZmZ/ufNB/LucB63fDo0YKTkzG3bk3JMsPNzRZrHcYoxuMc7wNtZ+k6O9ADfx4IK9p2O6zv2Wd67Zsq26Hx0Pl20JpmzJNbtG7HlW8QiPc2d9Em0uSS1FBUKad3Zge9UZLqgQ6yoO8sXWuxncX2DveOU5wPXVJJ9GBgoRMd6S5HFUdnEy4+OuZX/3KHz39/h9G0oBrnJOmb8cDEYP1tjKYcZ8xOxnStZb3YYX/kBs67drp/qdOqt61o0y5QSJJEM56+uYHB957rA+7XT1H74F4tKwp9i0ny2whqQk3nrmncEzq/GADWk2hAIaJzYDfkRilZkqgpWha40NK5m9duU8mcVB1RmFvk+oJcnRNwcXI0XLN6v477JhTWb+ncgt6vcX4HCLQo0KrE+l10FAy7d34PlCzI1Bm9WbPpvwI81vc40ZEIQS5PKc0dUjVHyRTx1oYary4xmMgoyWGCNR9FrVWRGmpiLpbRiipLmY8KTsYl57MKKf/2eXQxxiRmCgopBgq1JEkNyqjX3haXl5K2bqk3Dd2gc37Xeie1Y6ZKzrKPSGTKZXufS/2AVX8VKR5DAPHWrZDIQTsUEX+mSkoV6YWz5JyT9O7BkjdmBnU0/oc7DT/XSmXONDlDy4RcVkzNKav+krW9ZmtXwyIi8mcbtz/x9h+eQIsUrQxGJCSyiO6Easx59gmVnkU63Fvafv7U1YeWlb3maXuflb1i1V9hfcc+TT0MNv/7PLUIvmJnrvcdgc0BmO4zkvbHjxBiyLXa4YMlVQXjcPza/ZFCkcocoSUX+WekqjhoPNb9FbXbUA+TokBsBCBeMBZGIkllPgC6ikyVHKd3qPR8MB55+WJGCc08vQAhGJsjLtsHLLrHbAczGAE0fkfrmyGMWg7W5jHAutBjxuaYk/QuJ+ldkjanDx19iM2Kjn8YXrxPHbK65DPB/c72LLqay2ZH43oaa1n3DbWLIcQxeNj/5OYRQkR3vCTVjEYZxycjijxhsdzFida84u7dOW1r2dUtdd397Mwb9u/33id1z2zY2iWtr7G+RSLpXI0bqLIHevGH2gchUEM+yvndOdoozu8ecfV4xdXjJZePllw9WrK4WrO83rJbN39zoxAhBGk2mFFMS+anI+YnI47OpxxfTDk+n3B0Oo5OgJl5IVzzTUsbRTUpODobs1nukPpvv0j6e6jZvOI//MePOTl7v2iCHyopBfc+OSEvf/70wOdLioRCX8Smp8xQMmPXPxhc9NZ07gbrt0hhEEIjRYISGaX5hFyfkesLbNjifMuu/+b12yIZHPnOmaT/TDTmeUxjH+NDT2Mf0bmbAWANaxIUWpaU+g6Jmg/rHEdjH9H7Fda/B8ASGZk+xoXdAKJygvcEHAJFIueU5mMSNUe8pMn8oUsPeq1JmRMCNP3PV6YQQqBvetq6QxtNmsfw52bX0mxfv25aPlly9e0Nzbbh4pPv5569Tb0TwEplwVn2McfpbUZ6Tq4qnrb3uW4fsgiezkWaE0RRalwwjoaF6W1Os484Sm8zTy5IZU7na9Z9pD4p+wtQYL6iksERa6KPmJpTztzHXLb3edx8xXX7LSt7jbeOzkWXrIBHCIkSCj1MwXJVUagRlZ4xS86ZJWfMkvMDwPq5C3l737K211x297npHrPoHr9x99mGDuteBxsEpZ7gQo8Ukkly8oPukzEQOn4umSo4ze6x6B7zuPkrl+03UefUaXZuTeO29L4Zct7ckO8WdV7RtKJkYk6GqdQdRmZGqnL0S0wq4rYV8+SCqYmT2kKPyVTJdfstPriBCriNlu1CoISOTpN6xCQ54Sz7iJP0LrPkgnlyjkCws8uoA5NL/sEQfL965kwUF5M2eGrbs2gbLpstrbM0zrLqWmrbk0g1AKyfPhZdiKijSBLNaJxxcjyiLFMeP14NlMGSO3fmbDYNDx8t8H5zMAv4OZSAodmmhnM24IKl9Tu2bknramxoD8Y01veHHLk96+FD7YjSEqUl5/eOOLt7RLNrWVxtuHmy5ot//ZYv/vUBSku6pqce3N3+VhhLDDbIaZYwPR5xdmfOR786497nZ5zfnXNyO9IB39ceWRvFaJIzPx1z+XDxTiDtH/X2NZ2XTGYlv/+fPvrxNyZeLub/OZcUyRDwe4GWJUpkaFGw7r+gdyu6sBh0UQolcxI5YZR8RpV8wsh8yij5nNZds+m+fINtGaQw5EISUk+q5iza/0YIlp39lto9xvrt0OyVJHJKqo4p1Jxx+mum6e/jPvkbhJDs7H0anrzza1ciQyqDD5ZERhqgo8EHi0CSqjmV+ZhUHb1xuPD7lJaKIkuYVhltb1nufr4N3uADXdOzW9WkeYI2CqEkza5hff16R8nF0yVXD69pdx31pv7pJ1j7RB8G8wWPp1ATjpPb7NzmoCECDgvHqDvKGZsjRvpo0J5kKGGYmjPulZZpcsqt/HOMSDhNP3oh++mww8Jwln/C7/z/Tu03+OAp9Iiz9KMDzer5iovccz6p/gPH6R0at0UKxe38VxRq9D2ThOddAXM14iS9Q+87jtM7HKW3qfT0lcGohzTuwaYbYJ5coEXC1JwOFt/R1MF5ewBYe/rYs/cpI5UFhR5TqAmFHg8W4m8m1pwlF/yq+p85Te8daGzn2afMknNyNXrlxOVDVKYqzrKP0cKwsyt2bv1BLfhTlTPSM0YmglgtX96Rc8NC2HpP7xy98yRaYJSm0BOO09ukKmduL6iz9cEaej/J8nhWdc+q7lFeM85KxknJJJkyTaeMzZxCjeKUbTh+Nm3Luu2QQlClCbkxw1QKCjXmOLlNKnNmyRnn9tOD7i4Ef7jxhbAjhJpcSRK2eP+U3klqC0Z4jtNzlPCUSjLrFKXs2HR/RIUVqZqhZYEPXaRK+B2d2+H9U6ZK8FF+ipElRlacpPdIhWfbfzNMEC0+2BiOKCR6eJwSCVKkB4pF7a7x/iGFbDlPZ8zMGCHMQNs8QoU1i/b/YdenaFGiZYEWGUrmKBE7kOo1dttSSW5/csr/8n/8ls/+5Q7trqNr365TZhLFya0ZJ7emnN89In+F0L/UCXfLCZIYiqqF5DgrKbThUzenc47WW+ZZwcPdGj1Mu+5UE6ZJhnpFiO/xxZTf/sePOTobs1rs2CzfTlcqBMxPx8xOx1zcPWI8L9mHt0opDzkggXic973j+mrLV189ZbvruHy6ZrttaTv7TlOsybzi09/epigzPvvdbRaXa942prAcZ4wmBae355xcTNk3R07Te/S+Pbh1zpJzSj2NNFzfoYQhEHjYfEHnago1ptATzFu4Y72uvksv27szloM423lPOc64/ckJN0/XrK43NHU0fWjqjrbuaZtuyNKy0YXQuui+5WKI5f7f8b4c6d17pyo55MVEyp865FbFr0j9S9LYcU0zQ1YkZHlKNcmZHMVA4NGsZDwv8UJwdblhtW5IU3MIlhZC4KynaTra1pKkmiTRw2PiLX+1qFktd5SjjPGkIM0TTm/PCQGCEGA03jrGk+IFo4za1ezcjta1QyMqcHo+5+RszPijFDkK1Lam9g2Na8hUSqlKlFDs3I7axQWLH5wDjdAoqfEhToYTmZCpDImkGZ5DDcC89z1bu6VxDZWpqHSFEvJAP+18R+c6tDQYaUikIZEJUiku7h3xP/5vv+LeZ6dsVjX19t2lCPPTESe3ZpzenjE9rt75eeLx94Y5Vj9R1bbjqt1y1W3pXKShtzRMP5/yv+b/zHq5Y7Oo35k6m+aGk4spJxdTzu8d/aBO8Nl7I0jklMp8PGiTbjFJ/ikaTYRuuM8alCjI9EmkDuoTjBwjhOY4/08okVGYu5TmDrm+OGRMPdvWsH4LmkRNho0HEjWjc4uDm+B+TaplgZYVqZpT6EjV0yLHhBFKZBhZMU1/zyz7PVqWvNtn/Iy9E79rFAEtKxI1J9NnGDn6oPTAV5VSgjJNGBcZy23zgtaq847HzYrVanvIijRSYaQmkft9E9jg6FzMmkykJpU6rtOCRwlJqWNY+Na17GyUzOy303tHHxxaKBKpSKQhU/Hru+WdZ/l0xaOvnjA+GqFMZC18868P+Mt/+YokS0iLFPUSS/cnXz/l8sE1Amjr7r16e+8ciBAhlqDSMzJZcpTcOuhU9gG5+0fuqSESdXB/29tTCyTT5IxCjwcdUpxO5GoUQdx3DkolNOfZJ0zMMW7ohO47/+IlAj8l4hShVJPD/u3pipkqo16G5wGWZGTmpKrkJL1LH1pC8CQyjzQxaV4JsJ49R7SpV8IMgbdHg5uew2EPVLlnjx7+L+QhVHivv1LCoAfw9abTq3l6QaFHw5QsHh2pLMhUOWiMfryTMVcjLrJPOUoucMFGwPIB279SKLQ0aJEcsqteVj4EeudorGXX9dR9zyTLSPKUQo1JZMbEnByoSM+CnWO3PITAl37Bl9sFAsGxqDhOKqZZySQrSFWKFskLn8u67Xi4Wg+Us4rMmEMzIh/A/H6bNtjBPfKZcYkPPZv+SzbdlwRalFjhfU9nPTscWmScpGeMdM5YBVY6kMqWbfdHQlgyMvfI1BG93w6J91t6v8X7JRMt0PkphT4nN+dkckQqHZv+m8EdqT7kawhhKPQZuT7HyBFGVvR+xbr7ko29j/M1peqYmDmpOiVR02EKq9n2X3HdfAHBkukTcnVComakw1ec2L4eYN397JTZyYi+s8OC9e1u5kJI0syQZIYsN68MUC1Mwt1qyjjJWPctq65hnKSMkjmJ0ljn6L3ncb3m4XaNAI7zkvNixDTNUS9p6AAcn08oRxmf/+4OtrdY+7YNBkGSxsV2mifkZULX+8M0Q8hhWhGizXjfWS6v1jjvqeuOJ09X1HVH19l3mrxM5iWf/+42dz49oe8cfWd527uM0gqtFWmeUFRx8l6qKTLTUf/ottjQM9JzUlXEIIRgad2OVX/Fw/ovgwvnlJGZHRpWP0YpLSmqlDQzlKOMi3tHEVBtW7brhuXNhtX1luXVhuX1htXNLi40lzVd29N3ln7QbO2/Wwa78RCvDnKw0d4HIJt0ADx5QponZMP7VFQZ5SRnPC0Zz0omQwhwMcrIioQk1VgXP/fNpuH6yQprPZNJznhSHEBb2/Tc3GxZr2pGg533aFwgZQwbvrpc883XV5xdTElTQ1mmnN2ZM54VCKNRRUqWGe5+dMTJ2TODkav2hqftU9Z2jfUWh6PKC8qsYDxKkaMIwm76BTf9DVMzRacR7Kz7NVfdNS44XHAYachVTioT+uCwwR5AkxaGrd1y0y8wQpPIhJ3d8bh5zKJfcJ6dc56fk8hkoJf3bPoNa7shVxmFLqh0SaVHFMpw8dExk3lF1/Y4+37aOpNEMJtmJubk/Duq2vXc393wx9UTNn3DxrYcy5Lf/vqM/+GfP8H1Dtu7d6btSiljfldmDsf9m5aRE6TJyPUFPmlxoQP2a01xoOxFmmAa7c5lig4Fx/l/Ypz8E1rmKJHH37/imiKFwchJ1HDJKaPks0OuVQjukIsUt6UHYBcbiEGOCcGSqTNGyWe40JLI6TsCrGFlIQQMa2GJJgiJkSWpmpPrMyQG+RNko2opKVLDpMx4utA831/svWXVrKlDg5GaVGkKlVDpjEInh+FA4zo2tqX3jpHJGJmM3nta35NKjRBjMpWwtS1PmzW9t2gZ3UJ3rqO2HakyVDplZDKgfCnActaxeLrkm//+gNN7J0xPJwgh+PpfH/B//Z//hdGsYnI8InnJ8bd4suTy/jVZmUYN1vu8Z+/yR88mNYJEZO9988tUcXCV+qGSQh1s4vcVQo/3K6z9CikrpBwjhtRtISS5qsjVm3WahBAkIlLK3rXEkIukBBje3l74XSoESwg7fNiRYEh1CWKKQB8yHX6ErQ7bBugIoUUGSyocqZJIMUWI/IN0V3yIoKdzjqa3bK1lHRwhbFBSYmTMQUi0IlWKXd+zqhu2XU9rLb3zpFozDlk0zEAjhWfX9zR9j/fhYBesZMxWkU6j3NBh6XKaOmftDKGXpCaQaodR8W+EgMvNlq+vFwgBvfO4EEiUIlEKoyRGFeTm+8ehDzYGCPodKlwjfIULMQtDyxwj80GbVZCoMbnK0TRk0mP9Dhd29G5FK68Ho5jdQWQbQo8RmklyzNjMMbJAy2JYn+/ofMwM8fTDpDF27Tq/IvQOo8YkcowLDTY0g3FIRabGwzQsOi9qmaNFQWe/wfoVPnQkYTrw4tVzWSUvv8mEwfbVh0BWpWRVeujuCiA6q8Zj4MV/x79z3sebt44OQ0LEiU8g/r637vCz/bEkg2BsUjKtSVuFFpLCGI6ygkIbnI+dNYCt7SEE5kkep1zKQIj26eyzeobQ3yRLDp1Z78EHj+09vXUoJUiMRuv4fjw/UHmdeN/5jvEk5/atGUfzijQZ8otGOWdnE5SS9J3DuUBVZVRl/JKvmLK9rvaL/g9ZIYTIWJAaMzQmrO8OcR8AHsfWrmhci/crtMgp1IRUjgBN791hhv8sQ+nZFKBzjs5FMGtU/Dz34vS9aDsQH9c6O3RYFUoIUAKlFGkqMaOEzOb0naVqesbLinrVsLzesLjesF7U7NY19aql73q6PajqXQTUvY+L0OE4OwAsKZFaopTEJNFwI3luoZmXCXmZUg526eNpyWg2hADnCVrHac3iesv19ZbeehACreXw/ALvPa6NQLvedey2bdQj9PH4z4sEpSR13bFc7BhPcpzzhylamhtmpzvmyx2jUc7dz8+4dWd++BzLRqNqS9YLnH8GlBKZkBiFSsRgWNSy6TekMh0AlWTnahb9EiM0Rhp88NSupnENdgBYCslIRwv/xjWs+hWlKtBC4/E0vmVrd3QD7bz3PbWrD187Vw+NvXgcpDJF6pJqnFONX35P3/U9276jdfZwXBXGUGgTjw8pXupU+++xXPCs+7i4XXY1y74mqTTpNOXW0ev1zj9OPbt+KZmiSJ9Ni4NHqng+vdb4RCQHR77v1v4cDQF2m4bNsib4EM1iJgVGv9va7UNwhCKrpDu4IfrQRzAnc1J1jJGT95iMvX1prajylKNRwdMqp8pT8sSQaAUCat9z3W0Zm5gRGQhsbUvjOvb3Oj/cs4WA2nV03tJ7R+cthU4ZmxwINK5n2e9oXY+RGiXE0IRxJGieAeqXlxACkxryKifNYw6idx7XO7qmQ0hBVmbko+9jl7buyIoUkxrke1Klf/6R3m9QPtT09gu6/r9j9Gck5jco9Xorxn9vFUKHdY+w9j5SjpFyFr+L8kcEWIet4/0a56/xYUMINYSA1rfR6jZ8AGMO7wPWO1ZNy6PVmsebLc55rPdkRjNKUyZ5yjzPmRUFy7rhrzcLVk2LlhKjFRObHhbXvffsup77iyX3Fytaa/EhIIWgSAy5MSzrhs46rPc8Xm+43O7QIqaJT/OMo6pknCaHoMv7yxV/urzE+8Cm7VjWDeM8ZZKljLOMcZqik++fsNH5aEHnb6KtrMxIxIxMHQ3ToSwGIMoYgiiDodDnSGHo/ILOLQFP7zdYXxNwhOAGgFahRDp07jJq+4TaPSEEe+jyKRHpfErmaJETsNT2Cev+a4yrMLJEiRwjC1L1+fB3KZ1f0tintO6akfmEIrkgUVMSOQEClfmISfKrw7bj/r984b6fOPbPZTdJKQawFF307PB5O+fiv12kgDZdT9tZEqOZlBmjPDlYuTofsM4RQhTpKiWxw98L4qQlU4ZZKih0gpGSTBuMlGgRMEFxqxxTGoMPUEhDoQwGhbcBKyK9Mwxgy3mPes4+1rpI4dtsGtbbhjQxTCc5VZkhRBjAwQ9rI4xR3LqYkaUmAqgqRUrB7dszkkSx3bZsti3BB27dmpJnhlu3pphXBMz+LSouUs3gDqrxwQ3g3AxARJHIikqdY01GpUZkskKR4ryg8Rb1HEh2g8ZMi0jxXLYN122kY06TjNIkuBCPGS0lqYrNkuum5rrdMTIpkzQjVcN7FKAfHt9bR2ctXniSUcK8TMmnOaPzEV1rETYgbJwk7aes3kXnKu/D97JWDp+z5EARVEqi9jRBrQ4gx6SaJDUx22yYxGotEVLirWO9bnjyaEGSaOZHFdUoIx2ohXXdU++iwYnS0TXL9o5ls8MYxXRWot4DPMf5fpz0x0ZipN74gZGhZZw2qcFFda+f8yHQh57G1ZTpEcfJEYHAsl+xsuuDcUypisFRWNP5jtrVFKqItEEhqXRF69phOlWyszVru2bZL5FItFDRrMbtUEIx1j8cpXDT1ny9WnDd7OgHavmdasydasw4zUjRJD+f0+jvvrz3tE2cHKeZQWQm5t296/O5gLOOJw9u+PLfHtJ3ls//5Q6fT25/wL1+h/0KHZ1b0Lon9ANF0cgxmT4n17cwasRPSS01SjEuUk6mFVfrHVfLkmmVUWQRZKnBHGxkcm7nM4xUXLUbrrtoXBeAsc45SisyZbhq11y2G2xwA+iKJlKBOBHb2pbW9yTBkUpNpgxjk1PpjJHOKHRKKl++tlVGc3L3mCRLyKuMclLQbBrmF1M++u1d7vz6gju/ucVo9n0A/e2fH5Gkhr7rKUb5e+kWfzEA6xnNLACOfaq2QBD8it5+Rdv93wih0PoOMkyGxz1bsEUK4f4r/iQ6BfjXPE78aLawr3pN+70Qz+3DoU3+ncftCYYhNDj3hN7+GSWPUKqLr00GCHJ4LvHc8/GK55Lfecx+my97f57tlw87nL/C+Su8X0FwCJGj5BniNZSwNy0fPL3zrJuW+8sVf7m8PkwwRmnKUVlgvSdVmknu2bQdj1cbbuqGMjVUaUpr3WFh1lnHZqD0/fHpJbuuxw0LsXGWMs5SXAg4Hxf+rbV01sWAveA5LktqazkqCjKjybTm6WbLNzdLeudww1TlxJZ471EyTkde/tp6er+isZe40EX3IHXMKPmYXJ8eHheeo96maoaUKcqlSKHp3Yp+6HQJosVtomLnLlVzMnVMqmbYULPs/oj1OxI1Jhm6YIkax5BFfYTzNY29ZGe/RYscLXNyfUalPqY0d+MUTBQsuz+x8n+m9ytKfYtEjknkCKNGSDSlvsU4+fRwnLzuPPI+0PaOpuujDgTQMqa3SymwdtDS2eHLebrh3+tdy6ZuyVNDCB4pIdEaoxW9dbR9pMqlRpFofXgerSSFUmRKk6l4KXzZLma64qyocM7TDROKYAMdURsWp4GBro/PmxhNMqzIutbStJabxZbrxY6yiJOIJNFxgS0lUv6w9bTWitPTMaenz+haIXjOziYcHVU8ebLi8ZMVUgrms5LptCDPzTAp+9tX1BAoJKCVJuXFaYIbFtiCjFTOGesRuTIYoSEEGuew3katnIxBl9ZHeq2RkZN/09Y83K4HR85oYNI6S+csRqnhfPZcNVsebNccZwVSCJyOui/nY+Ol95Ea2jmLEIJZkVOmGcZnpC7+TWUSKpO88Pp+iupDoN61XF9tIriqMk7PxgcAZ3vPxnmsi9oFYxTbTc9u05IXCV1nSVIzgMBnejE3NBwOP38BLHr2JhrPQFMEzPvXHenVDDKASJt2wQ/TK48Ujt73NL7FiIRZMseGnkW/YmufOQd3vsN6ixSKznc0rgYCqUzRQlPogp3bkaucTObsqNnaHctuRaELSl3ggqd3FiMS7Cv0v89CjuG62fGnmyu+WS9ofcyP65ylMgmp0gPl+x8I629d+8/M9S6GwW5awiTHJIqXpuW+0XNGvY61jqvHK/70X+/T1B2z4xGf/+6nB1jPUy9daGj9NbV9ROcXuNCQytMYPmxuR33ZTwmwtGRcZpxOKxabmtW24XhSMspTUqMxQSGDoNIZ5/kUgOt2y6J75qRYqISRyRibgutuw6Lf4kJAIkiVofU9dohO2bmW1vU45Q/AbZaUjHRGpTPSl1AD96WN4uhixtHF7PAz1zvm5zM+/t1dPv7dHT7+/T0mx9/PVyxGOV3bs77eUE7eLzj5FwOw4qXQHiY1zj+B4EFoQtjh/CXx8PSE0OH8Dc4/wbvrwzNIOULKOVKOEBgQGu+ucP4p3m/jNgRIOUXJGUKUSJEBP9Y0bAAvocO5R1j/GEIPCBAJSs7iJEpkCJETQo11j4fX6iF4hMiQsop6nrAmgp01wTmcv0SIFCHS4TVNEKJAiDgWde4pzj+F4SYkRIZSc6ScERPBNT6sce4p3i+eex/HKHkU30eRAAlCGKTICSIjsP0OWPwA71R4lltUdz27ruN8POJiPGKSZRSJoUoTJlmGkpJRmnA+GZFoRescu66nc5G209s4CVvUNQLBPM8ZpfEzViIu6hMl6eyQRaU1RWLQUh7AVO8827ajs457swnzImde5EzzHAF8cjTjs+M5VZowSlPKJMGoV92ko2m1xw56RTO4Ar14Yvd+Q+dX2GFS5UKNH46X/ZQy0qEG6hQKdeCjm2gv+70Lshhyv6L5hETjUeyh7n+rAAAgAElEQVSBc9SmRYAdhcQ6HhsHykwYgN+zuIF3qc46btY7rla7A3BSKr7fRj/rhu/pmMABxPY2AjPrPFIK6rY/7EfbW+ou0oli6nuK0RIzJMKn5s21GE3bc329ZbEcbhhCEIZphXWOtrW0nSVNNFkaF+1Na2nb/jDVEMDl1Yaus0zGBdP3uoCLoXMbM7D2Bgd5kZBlBq017/p5/NS17juumx2Ns0ghor7N9ljv2fUdl82WZduSKkWi9EH4LIU4mI/ctDXrriXTOk63QqCxPcuuhRBQMk40b9qauu+ptaWxltZZbtqaVdsO1LAktt6GBs4ju+bRdk3tLLXtybXh3mhCOuyH+gmt2YQQJImmLDOc8zx5vGS3a8nzhDw3LG523FxvqHcxp21vugFgrY/TrQDrZc1qGY0uVssdSkew5JxnvapZrXaEEFgtdozG2cFEYy8OeGGfhu8+OFrfoqxkYzds7IZEJqztmlSm2OBirqH4/lVIElkAve+57hcoKw86r302ZATBls63NK5h53a44EikodDFML1yaKHJdEqlSxL58kVYgDgN954nuy1/Wlzy58XVANrhOC/4ZDJj5nOyn1Na999xRUMZz3pZ8/jBNdePV9z6+DjSZ80vaCn7htX7Ndv+r6y6P9G6KwKBRI4pzV1Kcw8j3y98/W0r0YpZmSOFINWas9mIUZ5yPh+R5pJNt0W3zyZZhxXBcD1XQuKC57LdsLFN1FNJc6AM+hC4GaZdl+2axna4EDAyDOuieK1XQr4TsDSZ4fjOHCkFs/PpK2nw1azkzq8uaLYts7Pp3wvA8oRg8WFL7/5K1/8BgkWIyNl0/gpEgOAIdHh/Td//md5+wf6jVuqcRH8K3IqghQzrntDbf8O6p0DktBv1Eeh7KHlCkOqg5/qxXlMIO3r3DV333yK9DoGQFUZ/hNYfgZwhhcGHDb39ks7+CXAQHFJOUOoEKXK8HwCWX+G5grAXpwu0uovWd1DqGCkihat3X9P1/wZDuLOUU0z4FKMVQiQIEpy/orN/xNq/Ht5Hre9g9KdoIZCMIojDRL0VGQh9eM4PVWFPM3FRN7XteqZ5xj+fnTAr4kkvB/qelpJRlnIxHmGk5NF6w2UTF+6eSDVbNQ03dbQZ3f+9knJYWMUbbwjQe4+RinGWMsmzCKTKgq+vb/jDoye01nJrMmJe5MzynGmekWjFx/MZvz09iXQxKSO16RUBfPG1uUOQsRTJENL94uOt31L3D2nc9cDJbgcno3yYWj1/WeNgKHEAWAfgxHOPi8LZgyh42K4QzwBWGEKPEfJ7QC0atgzGIM+2/Nafb2cdN5ua+08X7NqebdtFUW2WkCX6oItLjSY1+kDBC8M0su4sIfR01rHQzWHSVQ/PJRBMq4xplTMuMsZlhlKSwr/5dLVtLU+v1jz49mage4lIXbSOrrPUdc+u6chSQzFcvHd1R9v2jEcZoyon+BCzqnYdSqkBYL312wXEaZtScQI2meRUVbxOSSkPYOuXYsu86VsebFds+45pkjFJM1zwtM5yWe/4YnnNo92aTBtypUlUdKfSg6uiBFofNViS6AYYgNpaFk09hEnHqVfnHa1zNLandj2ts3y1uuHbzZqLcsRFOSIdJpq9dyyahkVbs+k7NrZjnubkWnNWVBj5csDwY5UQkKSaskrZ7TqePFpy9XTNdFYwnZUsbrZcX23oWovWatAexMahc1Gb1feO9apmvdyxWuQsFzVKx9fhfWC9rFkPWpTlcsd4VcA4Gq8c9uPw37NyA8AKeLZ2y9quB3OLDU45nLco9qZS3zWvkmip6YPlprvBB8/WbemDxTO4rIaADZbWdTSuoXYx7D2RCYXKo/dr8GipI4XQlCSvcJkNhEOn/Mluwx9vLvnD1RMCAS0kH09mrLtu0Kj+PMKm/97LO0/f9myWOx5/c8ODr56SFQmnt2Y//Me/uAr0fhMBVhsBFoBRE0q9B1g/TH/9kJVozbSSjIqUs9kIa91B91yHjutNiunVQAV/cS2ihSRRBhs8V200jLLBkypziBMJRIC16mtWfR2zJ4V4NjFHoIUaJufvsP+p4fj2nOnp5ODa+rKqpiV3fn0LZx3FuIimUu9YHxxg+WDp/JrerRHCoEWKksmg9XgP7ndoh6nUJSHUCFKEzJGiHLrs64EytsK5bxEiI+CRcgzouCgUJlLYQo0UFUKUeH85TK8se3qc90t6+xVBdWihkbyfFetrXhVxKtcSBg2TQAzTpumwjzkhOLxf4vxiAGAeKfL4+uUYJafDaxz8/YWOgcRCINDEj9nj3EN82KDkBDCE0CBFFQdmIoIqH9b09s8IkSFENrw3IOUEUINhhcS5J4TQo9UdtKqIJ9R+svHhlxvP9xDloLnItKZKU6r0+wBYSUmqIyUs2i9HgEaIv8t0nERt245F3aCVJDeG3GhKk5BqxfWuprMOJePvxmnKJMuY5hmPtcZ5f6Cf7TU/ZjC1yI2mTGMnfE/feVVJoTGyJJETrN/QuUUE3nis2wzAx8RwxbDDhXrQW8XA5UAEZ/47U8M95VMMHZ+DW+ULjyEeJ0IOgO7Fz0+LnETN0LKk92vW3Vdx0iUTWn+DEgmpmqFEnNxJYdCiwAdL629YdV9GAwxZHIDeSzM7BsnKflIZfMASKXkQDtbkUgjyNIapdr2l691AwYyvLgrSI/ByQzfaKHW4IHfWIYUgSzRZYg4arzcp5zxN07PetlHPJQeL6GFKIKWIQn8lDlMDJcVAB1QIOYh8rYtUw8HeO1IEX7/tl/9eHH4nZXTt+6XWnorbWEstLUZFyq4dNFPrvmVn4w03kWrQAMW/td4PtDBH5+PXnuq3sz3LrqFz0eTBD0Y5vXds+o60aWifyzrzIRxAU+cstbW03tLvjyUZJ2h7YPdT41chBEWRcnQ8It+1tM0wna0yssxQjXIIcVqlBkMNayMFqihTqioanxyfjOg6y/HJKGq40nid9D4wO6q4c++IPE+YTIoDnRUEqUyZJhMSab53TctkSqFiIPs0mXLLd1R6RKkLUpkyMRO01IxMhZYKvGGiR4TUo4RCCXV4ThccqUqodMlYj9BCI6Rgaia44JiYMYmMbsQgyFV+cCfMVUahCnKVY14xwfI+sO17Fm3NTVOz6lo2fWwKainpXKQ2+sEA4UOU9Y6d7di5LhqyeBuF+95jvRv0f9FdbZYUpEqz6htWXU0/NP0yrTlKK2ZJMVBjdTz2vaNxfXx8Xw/ngMX5cGh97U1dKp0ySXJGOjv87G279J2L58XGtly3W67bLbOkYJYWVDojU/oFCtfORve4Td+wHf7th/dXChGd56RikuSMTU6mDIlUMdx9MJBZXm1ZXK15/OCGB18+5dE3V5SjjDQzTI9GpPkzd8I0N2xXDcubLc2ug70p0kCJzYqE0bSkrFJeF7O3Xdds1w22i+wXKSXlOKMc5bRNN1j+tzgbabbBx+2kmaEc55Tj/KCv3BsOPd+KtG5NN5hC7a/nPjS40LDq/sim+4LWXSIxlOYumZrHiXloCMHggyFCj2guw3NsE4QghG54bh+ZTCLFh5YQWkChxOAs+gYlpUBKhUHxPWsIG5inJXf8nHlSDtdomCUlnbfP7Nr3gGnQXD1jygz/D/F7KjUjk6GEJFMJpU6YmIJMGcxLmThvsP9KkqiE5Ac8+bwL0Q22s6SF288o3ql+BIDVs7NPWHdfo2VBpmakakoiRyj1PgCriTQ69y2gMPouQhRIMSKEhuC3WL7B+Wt6+wVSHiFFhTanB7Dg/BXW/hXvv0SKCVKODxMjKUZxAiMSnF9g+8f40CLlDNT5B3t/Xqz9BKslhA5Ch1DzYXJ1bzCqmOH9atA23QABJacodYGWF0hZIkQ6gLQdjsdIUcT3Ro4ORhe9/Zrefg3uEU6OkKJCyhFGfxaneTLD+xrr/krb/2UAcAVSlEgxRpuLZ++je4y1f8X5K6QoQP10XGUlxABgzLBwfvsjP1GKaZ7hQuDRas395RKjFNMs47gsmOU55+MK5wOrpo2LZK1IjY4udf8/e+/5JMeVZXn+nnDtoVJCEJTFYhVnpmesd1bZ/gP7J4/Np7W13dm27e3p7uouSRIgIVOFDtfi7Yfn7pkJJECAAMiqal5agkBGhMdzfy7ueffcc4QcKErv4tkrcXDlFLRgU27J6hMyBHkzx5UTHBnjyFFHCawtVcYUVO2uoxbaJKu3IHiXANdRYyLnAySKslmSVI86Oqjts1DSxxdx5ykiUMLDVWPKZkVWn1I0KwJ1iK8POgGM8Y0AS3bH2FLrup4WY6xCFBYg2yoa+K7GUYq8qEny0ioPOrqjFDpXepskgWtAWNAlO4AW+g7TKGAceq+gbb4YppNFr6vGgknZVUyVxut8jnrBi8sCoTcAw76qRLd/pqum2gfXD1uV+2sJe+w6WmdTsysFeWPpe+sip2pbtLT9cpHjEGjrfyKFoGhqisbWWvveqbKrZqV1yaYs7Dmi9SCQUTbNkFBXbUPZtJeLNo5LawxJVZLVFQJhqYOOgxAw80JGjjfcB37MaZNSEo18HEdR1daDywCua72u4lFAeRBj2l5AxSpZGmPQjsJ1NUKA5zsc3ZpYefjQxXEvUwHtKPYPR2gtCUKv6+WzixShCpGepHZqnlfBlFjfG4FAC4eZM+uk2H2kUMQ6ojI1gfJxhINSmn1vn5Ez6qi/V2nH1o2wMS2hCgY59iP/mLE7wZcenvLAQKRCGmMrTS0GLTSO1GihX2oC35iWbVlwmu5YFfmgPvk+o2wb5kXCSbbpVumtDHpal2RNSVKXpHXJh9EeX05vM3UD7m8vuL89J60r8qbiwI/499O7/Hp6i5H20Y6kahs2Vca8SPh2d8GD3Zx1lbGrcvLm0qohdlwi7fFBNOPz0REfRnvE2kPLN6dc5U3Fskx5kq747eop/7p6yq8mt/j15Bb3whn7fnwNYG2rnEfpksfJkifpiifpirKtBwGakfaZuAG/GB3y2eiQfS9i5Pg4KPKsJN0WPHt4waP755w8nHNxsmY93yGVJE9L9o/HTA9GzA5GzA5HOJ5meb7hm989ZX66tirBraGqaqqyYf9ozMdf3OLORweDuMxNsV4kPPtuTrLJu2tIcufjQ/zAZbfOePTNGefPVhRZSZ5XtLUVvZnsRXzw2RF3Pj4giDyU8uGFSoixJsjVA8pmRa+2XDZLinZJWj1mVz2gareEzgeE+i6+2gOTUDenCBoklnFiUJiOvWW9LDXCKJp2S90uMTRoOUPLKXW7om6Xtv1FHSP54YrZfThSceCNCDsfq37uj4MJYyewNk19znRV/ZWrOZTp+q9N1ytvrUksBVzhSY0rdeeL9/56i4u0YHm6pkgLlFbE0+gH97q9lwpWVp+xLP+Ep2YYms4n4O2k3A0FTbuiac9Q8hZKHiLl1IKkdkfVPMDS43bUnKCRKH2AVh8iZYgQEVQ1Zbujqh/aCpGZdr1Yquu3siCrbbdWDa/dYTo52PcX/cnmIKQdg5QTpBhbkIMDVLTtqqMACgt45DGO/gQprbx90647uqSwvVRyhlIHKHmElGPq5oy2XWFMQttGXa/VGK3udKqDIU1zQVV/Q1V/h5Qhsg3R6i6OPr52HI1JaNo1xuQ46pP3fHyuhxACRyk8rboHw5Uj2fVMGGMoOv+rpCzJKivVnnc/9vOa0HEom4bT7Q5PayvP69okKnY9vC4hs0BC4qqOkjQkyuIawLLmevZhldc16yzH6STae6XBm2SzbQUrRgiFFk9tVcQUVB3l0+63AgxKuGgR0oiMRuQD9U8I1VWIe2NCdVk1Qg/ASwpvADmOHKFljBbBNQqhQKFFiCtnBOqISN/uKtNrymZtb95C4coJvtrHVwcDXcFKyO5jTEvVJtTtEiV8dBujpfUSuSmUFPiewzj08R1NWFludjez1J1CX+g6RL5VCcyKys6LVh1VwVIIlVLkpcYva2QnlCGwprx10xIHHqPAI/TebMFHSitOEQSuTWgdWzXSSqK0VarUWlqFw04NUWurKNj/rpftdl3bW3Z9PfPfbjhSEmqHqmk6UYHLaqaS0laVlWbiWuU/C7BsMp/WFVldDQqDvnZwhL03qK4/SwirEqll7zVov9NggXfkOHhKMfUCxq5P2dYkdWnvFUohsD2UjpRMXJ+R6w2U4h8zpBRdv5U7yEvDZYVTXE1inmuLvLoYNXqJZDlwzVj4+fBUB2y+J0L9erYrz/dI3XQ1DHRkDFN3AkxefG0QrTDD719pe2AMm7LgJOkAVvv+AZaVQM85zTecZBtO8w27qhgqUIsyYVmkbKocLSSHfsyD3QXfdoBpW+UcFiNi7THzQkwAobZKmXlTs6kyTrIND3YXrEoLsIq2B1gGT9lrJq1Lm7QKxa1gTKjdF3N/eGGdznQCUa1pWVUZT9IVX2/P+NPmlN+vnxE7HneCCYf+yKrBGTNU6ObFju92c77ZnvMsW/MsXVO2VnZbC0WoXSaOzRGFsJLcUkjG0rMCR2VNss1ZXWxZXmzZbTLy1FaQlhdblKNwXE0QedRVA8ZQ5DXbVcribDsItmRJQZYUFFlJPA6IRrYaFY78js0BpjWUeUW6zVld7Dh7siTZ5CjHLjhkSU5RVGxXKWdPFjz9bj5UsOqqoS5r8qy0CqCew97RGM93UdcEh+x5WrZLtuV9svpkWGAomguKZk7VbqiaHUq4BOqYifdrPOkCBXVzYe9jaITwkcLHmIrGJBhTIEWAlD6tSajbBcbUSOFiiG2O3FwgRdSxn94+tFRM3JAJ169719XM3Eulvp4OePX0unrPetlrbxqmY8FYJsmbPWHTbcbyZEm2zRnNord6Pr97gEVNVs9ZFfeJnbsEan8oAL5VmF4Qwnr1COEMP6ZvvEdgxR+sMiCd8zVXEsxLYYkaY2oLrnAQA41Qo9QRQgboDpy8v1AIESClsb1WKAwlTTOnbXcotY+UB7TtGtNmdt+FYvC2eunJZ/vGhPBBOPbfnXKi9Xq6ehx1l7z3KzgGOkM9IyxNDfHccTTdcb5ikvvnEK0xFJ3i3/ku5el6w8lmy9kuYZnl7G22zAKf/Si0QhWtlWIuaivjnVU1SVmxzHLOk4RdUVK35rUlej1HMwl80qri2XpLXtVMA59ZGAxCF/6NsqLCAiQ8Wy0SDoYGgUYKt/OYsgmRpcOWVO0RtUmtyaBwhpvzJRFQomQwSKxL4QKCUB+D/ze0phqk37WMOpl2u9KsZUDsfoSUHr7aw1N7g+x7oG/Rm2Ir4aNliCMinM6Pw5UjIv0BnprRtDktNa4c48gxWkbIlziEOFoxiwPcDqA0TTucWVf9riLfJQ6sRLmjrKpRTx9Unay7FIKqU1Kz9DkLknvwPQ59nB+grhcEDnduT4lCD6U6r7Tu+4QUXSVKDFQUYADjPe3RmI5MqyVx5Nk+mb+gXqn3FZHjcScas+cFQ8WvajvJ9LYZaIC+toqPTtd/BQzv6al/rtJMXZ/AsTS2ieuDwFKOhBjep0RH8zRmkOfe8wOmXf+XrzSHTT0k672ghacsjfjPYcpeed78OQzwR47XXWluWlvBsgAro/oRKlhXY1flPEtXCCH4KNrnyB8NFZ7WtPxpc8rTbMXI8fmb2QfMix1n+RYlJNu64OvtOUpI9t0YgcCRkkC5HHgxH0Z7fBTZpFd1Cw3GwLzYMS8Sirbm/vaCpC75j3zAoR+jX0MlscV0lbaCB7sL/mX5hCfpCldp/ueDT/j19DYfx/scerH1ETSGVZEyLxK+2V5wf3fBRbFj34v5ND4YhA8q05B0lbxVmfL3F9+yKBLUviQI93F8zUiGHN2dUVcNnu9w/nTF8mLHx1/c4qNf3mLvcEQ48gfAJKVk73DE5//hA25/uD/ck1cXO1bzLVJJyqLi7MmKwzuGILKLbVIIqyh4tuHBH5+xON2QZyVe6HBwa8LscIwfOOzWtocxzyocR3Hr3h77xxPKoiJPK8rCKnd+9a+P+OzXdxnPwms9jH3UbULenJBU39peZzpfyk5N2HP28NQBE+9Lpu6vwWxp23Mas6VqJYYKLQ8QysFQ07Q7WpPiKKdjHHk2NxYGgduxm1yb84mf5hbxY9yyjDHWBD6vaNs366HczLfMny3JdjlHHx3yNhzh91LByps56/I+Uiiq9tO3GmAfVkXMAiMb2gIsnC75vwRQfVO+7SvpV+av0g868GCqKyebM2xTqyOEuGsrSe8dYNneMC0UUu5T1fepqj/Stmt0exetrYFva3LAdPvrAS9XCLOgyYp4DPvXg0vTdsCpp3h04PI5ANqDUPvvlxxHrqrH/fRhgLKu2RUl57uEh8sVT9YbVlnOriiZBj6TwKc1MAt9mtZShWwflbEGxqXtyQqdhG1Z2j6e16SR+Vox8X2KuubpZsvD1YoPphPuNRNaY02H/RsbK23VSAnVKQTdvabMZ0UlrgKCtnu9GapV/XZe3K649lqgj/H14Q3vEcN7lNDEzsfEzj36ihiY7nOGq+tMAnnl83RAasQA0mm7Cpu+9r7nw+0A1jT2Ox729ehXt6ToqQWCcegPCkTDnl4raXLJ7b66pz8Q0ISBi+853D7uV9DF8JAa1s9Nn/T2X3D5uxf6334GVkNY+pIzzJfpeO/XDs+VY/si2eaq4IoY6KBT16cdXc4/dD1+GMSV+eujV6syxjDzgxfmrv+c/Hni/qJjqGCl2x+tgnU1dnXBs3TNxA04Dkb8x9k9Am0b/h+nS/60OUVLxf929Bl/M7vLSb4hSjxWpa1kfb05Y9+N+GzU4EqNlopAO+z7Ma0xzLyQQ3/ESHvIznD7N8sn/Mvyia1yFRc8y9YcejFfTm+/Wie5O9VbY0jrkkWZ8mB7wX+fP2RZJvynvQ/52717fBTv82G0x9jxEQiqtmFZpnyXzLm/O+fB9oKirfk0PuR/OviI2PEJlcOmynmws+/5enPO19szdnXBnXDKB+EM19dEoUfbtGit8EOrGqhdzcdf3Obf/edPmOxF9t4gLsV9ZkcjJvvxZXXTGE4eLTh9tGS92JHucs6eLgkil/2jCb1wUV01LM42PPjDCVVRURY18Tjg1gd73PnkkPVix3qxY7tKKbIS7WjufHzAl3/7MVlakmxznn13wZ9+84in310wnkZ8+PnxjYe2ahOy+pRd9S2NKSywkj5aBAR6TOR8xMj9jIn7K8beF5T1d2TVnLrZUpmSpt2BdlBy2onAbWnaLVpOkcJHCg8hVJcPXwIs+GFKfH8pYQxUeUW6SWmbNwdYi6dLsiQn22bD+fND4r2oCJoO5IClP1n60dtxJoXwUGoPY1KgpKq/pmltf5AxZScjLpFiilKHKDmlbZcU5b90KN4q4gnh4uh7ll4oJhjyTsghw8gUYzKkiBAyRpiG91uhsRLtxmQ07aLzkTq3gh2UGCqMaSzlT0S2D61d0JpTjMlpzaYTwvC67eyuj1e8mNBKEVjaoNrHmJyy+j0CK+XemhSMQat7Ax1QdkIgRZldOY5nCBGiRYwQGmO2NO05dfOUpjmjaS5oTY6SezRyD2Om3fZ+uBpjT9GbBj4fziZErsvxKL7WQyOwggah43AURxhj2AsD0qqiqBqOxzG3RiOUFMyTlF1RErkuf3vvDr7WjH0PVyuqpuXRak3kutyZjBh3whYjv6MNYr1xvjjaJ69qDuMIAYx9n3uzCWPfI62sxPR+FLIfhsSuOyjfPR9Xy+AWxKqh6jskglxSXoyRCGEwQ2XyTbzaVPcdr45+HJdhEEgu+z0v/yZeSFH7Mcpu/N8/xkuw8eJ7TJdtP99rqoS49pi4afs3ffaH0g6E6GXRX4yXjfFdffdfe8iugc2CpEvUY08Jcfn3V0QPwq8da3H9bDfGoMQltfdl2++WlTAvrPJeuVZ/4rn8vuvpLzFelfS98rU33F9L17ukCFZvmIS9bSghcZUm0h4TJ+DAj1mUI1ZlRlIXrMoMKQRjx+coGNvqUSfCsixTdnVB0da0xqoeBsrBOAEKSaRcIsdut+9TbI3h2B+zjjKrjFmlLIqUtKmuLExcj34hoTWGrKlYFAlfbc/4enPGs2zN1LUg7hejQz6O99nrDGT7/hgryZ3w1eaMVZkxcQNi7fFBNOXQH3W9OlaoozUGLSWLIsVsIKkL5sWO82LbCX5ElmbfCbcoZdkCSslrPVSXQhaG9SJhdbElS0ukss+fxdmG5dnWClM0DdrVNI3d+7qqyZKC1XyHaQ3prmDvcMTe0Zj94wnhyCrP1mVDssnZLBNW8x1lXvHwax8pJWVZU+QV6/mOIq/wfMeO7YXT0y7LhfoOB8H/SKjv0nb5Xi8I56oZvjrC10d4+tCCpYGJ1ICpaBG0JqM1Oa3Jup6rNbrd0LS77t+bjj64pTH2d027wcjQfictNz/L3338WPesuqh4+s0J3/72EW3T4vruS/vsno/T7845fXhhF93T4q0gwHuVaber8g6qk3Z+m5DCR8tDUC118x1V/QghNFKMQUiadgEolJziqI8QQnd+WX/E9lk5XTXHx9FWPELJGVX9kMac2Z4rE9OK1PYvITAioveIeh9hsLLzbbuibp5QN09omgWtSbi6Li5EhJQT2nZJ1Tykqu/Ttgtk86xTG5wghB5k2l8VQkZodQelDqibE8rygf0u4SBwOwD6MVLGSDGiNQlNc0LTLq8dRyljpBwjcGjbDXVzQlV/2713DaailhOknKAxXaXuhwMsLSVSW2DjOw53JzWh6+JeUU7r/Rm0tGp+e1FIVTed7Lq5Zgj8eLXhbLfjKI75dH+PyHMJHM2uKPnj2QXfLVZ8eXzIh7Mp+1HQ9V8oVCdmsB+GeMfWvDTuenkmvo+nNeWoHihHvVph34v1ZvG8EPLzr70fxcbXi9f5Xnkj5HiX3/i6W/6xjtLbjPHnsPE2x+tdnw8/z91fZzSt6UQutpYi+CNXsBypiLQ1XZ24AVM34MCLWfsZq7nr08UAACAASURBVDLlothhDBZ8eTF125BUJWldsCpT0rqkahsMFpgEwsWVFrDte7F9BnYUQbDA48CPKVvbq/XN7pxNlZE3Fe1LcgYhrJl0a1qypuSi2PHH9Sl/d36fULvcDiZ8GO3x+fiIe9EenrTU3T4aY5gXO77enqGF4m445cNoj3vhjD0v6kRipFUQVA4jx+f+9gItJXkH6M6yLY5QTN3X6+nD9MbBLRcnK7753VOW51u0o1Bakmxykk0GgBc4jCbhUKGoqoZkl7O82JLuchZnG8LYY3ow4uD2hCD2BupZss3ZrFJWc1vJqqqGxdl2EEIynahGNApwvUvQ+dwRJnLuWQErPxsWVUWnZt1rFyjpo4T/XJHCWBaSMQO4atukA09rarNGt2vqdt31y1c0zZpGbuzr7RpF26kJPt/59JcfVVnz+E/P+If/+s+0rWG0F+GHr5d/rs42nD+e40ceRVr+efVgCaySmCNHKOFiTEtjqq7n5y22K5whWW/bFUKcda9IQCPlDEf4aH0Pre+Caa1YBQt6sCKFj5QHVuBBjJFy3J2YS2hVVz6NsGa8VlGQtwSG3x/99EkE2qoCGttj1ZsiKzlGyilWQXBCI+KuzAvWbLlbb5WRJfHJqd0PXHpaXy9oIUSAVneRckrbpjR0psWYrv9sDyX3h+pV0y5o2w2C9TBeKQLrpyVnnUy+wdIMXYSIUVJ0JemQq0DxbUIKgVRikFO/KazijJVw97Rm/BLiw64oEdiHrJZyAFe9iEX/E7puZyD84s09dB1C9/o4fEfjO3Y1ru/36alKb7o683orPT/mDfH1qgjDu9/hGN9mZevHWsn/S60Y/LnF+57r193+z/P51xlW+r8l6dQll0VG0rENfszQQuJJq4TZ/4TaZeR4xNojULaHyVcuobY/kbbqbAasAp9pu+4Lm3rbakZL0Vbsattn2HTVqdYYVqUV0EjrkqwuyZuK2jTXVU+vRieOkdYlT9IVu6rgcbpkXiTEjsfdcMovx0fcDqdMnEvD9B6wNKZlU+WcZBt85TBxA9K65DTfIm8wi82bkm2VX5OcX5Up+150SRkeKt0MkuhXozWGIq/IkoL1PGFxtmE93xFPrJBF21jlTYSgbS6f03bcduxCWK+5cOQPvVpFVlGXDa3fv/+67HvbjUUIMciy+4FLPA4Yz8JrAhdX99tVU1z1+kITUgRoOcN03mzW6zK2+ZdwkTJC0ViFQGwLiBQxRth2GIyxbDA5QsnILpr/FYZpDUVasF3u0I5mNIvQ7uvBHe1q6wuo1Ft5YMH7AFhC4aoxsXMbLUOqNiFvFmj5diqCtj8qREqJ43yOUvvdF9qyqfUNqlFyYqXVMQjpo9sPYKBY+R1VLejAgIej7lmQ0PkCILRV7xNBB7jedtwvDytiECGkvTiUnHWqhVbMQoq4Uza08uhKClznS5S6hfW3UvQKMggHjKUVXh17z7fV6i64tsdMyVn3mkYp21fTX4xW+j5ECAdwh221+uMrxzHojqPfHUcH9EdIOcWYrNsHY02Qe7D33sya3zwCR3M8ijFA1TR8fTHv1Ma6PiIl+eXRAcejCPcNZLz7EFhAOMiN/xw/x8/xc/wcP3mUXSVokWdsypykskbTrXn7RcA3id7L0apaXtKzZCe84kiNMr2/X8dl6GWtOzW/Hhi0xpom7+qCp9mKp+mKVdmZtdYVjbGg0toeVJxkay6KpFOhNPT/PQ94WqyX4LxI2NUFWkiypuLIt0IaH8f73A2nxM6LOVKLVRssmmrwykrrkofJglh7RNp74dlYtw3fJXNWZUqgnE6+vuqqi32OcikaVHfA5io6bJuW3TpjcbYh2WYoJZkdjrj94T7H9/Y4e7Lk7MmSPC1fkAbQnUrg/tGEDz8/5t5nR+RZyaNvzki3OUJ8gB9ZqlkY+4wmIeNZiOc5fPLr23z66ztDQi6lRGuF62km+/Fr09O+L5Sa4vEZjrp9+TsZo0Tc5b8RrSksgBIjpPBRcgymRUlrzeMJiZYThHDRao8+r/trCqklk8MxH3x+m9FezL0v7jK7/XpA9tk3pwSxT13VhOOAt0nh3jnAkig8OSHSd5DCoTIJWTPHUxNa0wkrAG9K0rDCDRoIUGoKfHrldfHC+8GAOuLy4rusFF19v5Qxmg+6FYFeFc+WaN93ctzvkzEhkgmo9uqLw1gvb3xB14dmuFTxE/Rmsq8Kre+g9Z0rvzEotdetX1y9SfXf28cEuMX14yh4/rhbMZB7r7fjP3H4jsPRyDbFPl5teLRa07QtUghGnsudyZhP9sfMguAaBfF1o38QvtWV+W8set+LXn1vIBaKvip+cyXw6grmVYGEQSihe8VcfdOVTVy9F10Vy7hJTOFd3g9eNm6G8T837hviGmv+2tjf37jfdJ5eZ35etZfiuf2T4vqs/BQLGJeS4Nf3h5vm7Qb2zdV5G845cfV3P94+NW17LVk3XN62rGripX/N1XhhXrv+t6tSy6+eV/vn95278OrjcdM4hr9fmxP776QqmecZ51nCqshJq2owkb4aVjq9tYbAnQH2D43+nG3adqDjCSHQUqE7c+X+HLDXkPX9MUYMFL/hOHQLd01HQbeeiLbisy5Tvtst+P36GafZhvN8x7bOBxPjHlDlTU1SF4xdv9vGzdEaQ9U2rKucbWdefCuYcCsYcyeccjeccRxMXpgvOw+WIli2NWlt6YVn+XZ4Ln7fGd4aQ22sGXNjLo+ZVDYvM62hqRqa2poQ17U1Eq+rhmSbMT9bk+0KpBJEccDtjw747Ms7eJ6DaVtWFzvy7LoFTy+gMTsa8dmXd/ib/+UX/ObvvuHbPzxju0zZOx5zeGeKVJJw5DOahoynEe2o5aNfHPPl336MVFfnq9vXdyhmpOUELSf9Ub7yis3HHHX03CduABXvQbjt6nXHC/fDnyCEYLw/4u7ndzj6cJ9f/KdPrCLga8Rkf0xTN2wWO6Jx8Fb343cPsIRDqI/Y835F3iwomhV1m2FMTd1mnUKKjxRWBe/7LjUtQxwZPlfKvAlQvSx6itrrvE++5nvfRzwPbL5vVeESgL39eF/neL7ucfzzD0dJIteFGHQnnNF25X1fKyaBz8T3CV3n2gPu53h/Mc9T/rA456vlfEhapbDywyPX4/PZPr+cHtxoDNxTMpO6ZF0UbIqcTVmwKQuKznS2aq2PVt0BaSX7RMb2KgRaEyiHyHGJXZe4+//I8W5M+t5FtB3NZFuWrMucbVmwK0u2VWl925ra0ny6JBjsFai6xNdREl9Z2fKoG/PY9Zl4HiPHG+ip7zIusoTfL875ejkfktje/23seXw+PeDz2T7OFWp1n/j2c7Iuc9ZFzrYsO5Ngazhat1Y5UwqJEgJHKlylCLXDyHUZuR4zL2Dq+9ZwUgrUT3A/6u0gyqZmXRZsSrsvtkemomoaym7e6itUYXWlauEra1wcOS5j12PsekSOS+g4eOq9tkZfi/vrBb9fnHOeJQPgtdeE5G485vPZPnfjyQufM1yC7XVh57Of311VDlL4N82rltJS5JTtTw21Q+y6RE5HkXNdAq2/NzdgGINVg00qOwd5Y6+dvLbn1vD3umZbFayLgrN0x/3Vgsa8CK5aY3iwXvJ/PHrA7+ZnhI71j/qhMfV89oMIXyuSxvb/DPv23IJBH/Zp+3rn9qJIub8757vdgvN8y6bMmLoBd8MpbucVJ4Csqcg6ut/X23Pq72nbyDoz4aptrOmvtF6RT9IVh96Ij+Mte16Irxy8F+xHzJXFBzjwYu6GU4780UB5fFUuse9F3A4m3Akm7HsRQggcVxHG3iCpniYFjx+cI4RgdjRiNAnxfAfTGqZ7Mdm2IFlnrOcJCEHSeWatLrYUWUXTmhek0wWd36HnEMYeh3emfPyr21RlzeJ0w2//v2+Z7EdM9mLGs4ho7LNZpjx7OKeqmiEZdzxNGHu20jUNGU3Cd1bFuj7aP4+crDWGomooq5qsrMiKirJuBv/Knn75Y4VpWgg0H/77e8z2RwSj1zdTjqchdz+/zd4uZ3o0/XMDWJpQH6GEy6L4A9vqEWWzpm4zimaDp6b4amKb9kQvAf3y8NW+NUsVz3NF32Sn36Ra9lOdrG/63e96rK+zrZ/+Qn4X4ShF7AlC12EaBNTTfkXoOeqGtAnBz/H+Y5Gl/N2zR/yXb/80AKYe+NyOR/zv5pd8Mt57KcCq2oZNUfB4u+bxbs2T3YYnuw3bsiDpjGhtwtXgdKDKVQpf2QRv6gfMvICjMOIojLgVxtyKRoTaQb2nanZrLAVnVeQ82a15sttymm45SXdsioJ1kZPW1iTbNrTbGICH4zDpANVREHMcxtyNx9wbTwi0g+bm6sPbxDxL+W9Pv+O/fvu17e3A+ksFWnM3HmM+hk8ms2vN7j2laVXkPN1teLxb83C75lmyZdsl5VmXDNt5t/PTA5ADP+RWNOJOPOLj8RRHKYTTecf9BJdnYwx5U7Ety+F8O0l3nKUJ8ywlrUqSuhpAWK+QZoGVxtcOE8/nIAg5CiLuxmPuxGOOgghHyh8VYH2zXvBfvv2KPyzPh34UXzsEWvOfj+8SO+5LAJY9d8u24SJLebRdXzmHdxbsdOdu/ty8ep2XWQ+Y9/yA4zDmOIy4FVmVV0+pF6qVN0VrzED7O88SztJkAPDrMmdT5KzLogOBBbuqIKmqYY5u6r1qjeHb9ZKzNLEm8S+p4r1ufDia8PnsgLvxiNCTBO6lZ+HNW32z71qUCb9dPeN3q6fDos0vg2O+nN7mdjjFlxpX6sHI+DfLxyzKhLN8+8rt5nXJskxxhOLAj5m5IU9SS0E89EZc5DtudxWs5wGWufKDgQM/5m9mH/Dl5Db7fsy+F73ymDpS4Uu72OArB4nAcTVCCoLQAqxsl/PkwTmr8y37tyfcurfPwa0Jfugy2Y85f7qydMFOtOLs6cr2SzUtQgiUls8BLJtTSSlsD1bsc3RnStu2nD9dMT9Z8+TBOV/+Dx9z56MDC7BGAZtlytOHcx5+czaUbMKRz/7xmIPbU27f2yOMvPcAsPox//TRtoa8rNimBctdynKbscsLC7rq2vaqtT+eqY+nFZ8ezfj0wyOi0MPxXr/XLJpG3P3FbeqqIZ5Ff14AqzUNebNgWz1kUz0kqZ5RtCuqNiVvlrhyhKtGqEFy8tWD3/O+wFERmp7nezNdoW1tUtaXJwWXxp99/LnK2r6NAEJdNVRljWlbtKvtTei1tvcmoPOvK6xghr3Z3eD993P8BFE0NlH7brMaVqX7ZLNqW1ZFRtvRXMAmuUW3Mn2RJZxnKSfJlqfJhmddkneaJiSV5fHndW3pPm0zrKA7SuFJu4reVxFO0pDDIGIxmqCk5DiMra/2O9tPO+akKlkWGcs841my5enOAquLLOEiS9lVJbsOeJRNQ30FYPUqmYHWxI7HyHE5CxKeJVtOUvtzOxqx54fs+QGR4xJo5wf1E744fjtP326WQwLVz1PdtizyzBr/Nk3nm1OxyDMWuU3CH+82PE02nCQ7ztPE7mdlK1ll02CugJFAOwTa4dxLuMgTzrId8yzlNE04CiMOg4ipFxB0Cfv7uIdfpb5tq5JNmbPM82GeTpLLeZtnKasiJ6srsg4Ul00zVPkscNB4Hbg4T31O/ZDTdMeT3YZbUcytcMRBEDLxfKaeP5ghvy/fraQqOUm3w3XXGtOBQM0H8Zikrq6tPJetNXLflAUXWcpFlvBkt+FpsuUk2XKWJlzkaXcMepDZXAOZXnfdRY7L2POYeD6n6Y6DIOSLurILB57/WmvzZduwKXLOs5T7qwXfrBdsyryrBBe2KlyVbMvuerpSMX3lcakrkrp65XteN5SQzPyQkesitUvQLyqL4Y8b4/v2ve+dSuqSk2xtK0v+iCN/dIXGN8WTDk53DjVti68c9GswM5SUuFIzcQI+iva5E0yQSLLaimM8TOa4UvFxvE+ovc4xsadbi46BoPCUZQeEyrWy8/6ID8LZq/OxfhtcguzcVOzanJ1b4R/53P78ANdx8FyH8TQijD380CWMfMLYY/94wt1PDonGAX5kX+tzQqWVpQRGLuNZhOMqJnsR9z47pCxqZodjlJbIWCH2FbLSOJWLccEbuXi+w3hqzY+FFGS7giwphmsliDzicUAQugMwvCnKJqNoMwwtWrho6SDRKKG+p+3jp8vLTHefaFvDLitYJzmrJGOxzVjuMjZJzjrNSHNbxaqaZhAB+bGKWHHgsj+J8Ec+QWD7/+uqIU9y8l2OH/n4sYe+wZfUtFYJsqkbzFuK37zz9LI2OYvijzxN/i+S+oS8WdKYgkKsUfUJSjhIYdXtXueBKIVi5N4DNXvpe4yBpmmp6qYDWyClwHEUjlB/1a0wVVGxW6cWbU9CHEf/NWKin+PfYDRdZapoOtn7K69VbcMyz7jIU343P+N3F2c8S7asSktVSitLh6k6ilJjLM3O0hUMjbA9FoWoSWrJriy4UIqTdEfkuFxkCft+yJf7RyjeHREjq2vO04SnyYavlnO+Wl0wz1KWhaUIXk3Oq6ahNrZZ/GqvRNsaamNBTFbXrIucizwdqgLTrjryy9kBv5wecCcecRTG7wRg3RQ92E3raqBkAtRty2m647fzU36/OOck2XGSbFmXBWlVktUVZdt2NEi7n6bfv9bOT1pX7KqCeQfQvlktmHo+n033+PXeEZ9MZhwFEX7w/lZK2m4OTtMd36zmfLtZ8XCz4vFuM9DSLiukVt2t7van6Rb9WtHQGEHdGvK6Jqsr1kXOSbrj240FksdhxO1oxIejKb+cHfDF7MDaPAjnRzU27gURysbSHK+e+2lVDXPxu/kZv5+fs+oqRrvKqtNldUf57Owx+nk1/bw2DZmsSeqSVZHhac3T3YbIsZWJe6MJ9/qq2ffsdl7XzPOM7zZLfnNxwj+ePR3GXrV2QaVq2gHsXu0f/EsPw2U1dV1mbKuCT+IDfjE+4oNwxtQN8aWDkta/sOyEMLKmor6BGvl8BMplz4u4E0z41eQWn8YHeMraoKR1ydfbi86vS3IrmOBKhZZqAFpa2IptrD2UsNLrmzrnqG2+l758rUevi02d8yRbsNEp8WcxXx5HhI4VzAgCSx30AhfHUdb895MDorFPkVdorVCOzQV7oQwpBcpRRCMfL3A5ujvD9R2apmXvcARApmqWXk55CLPJlNC47B1PUK4ingR88Okh+8dj2wdWXVIutaPwfAcvcAkiD/WSXu6s2bKqTmlMTajGhHqMKwMrtPa9M/TTRd20lFXD08WGPz2+4NvTBRfrhItNQlHVlNUlsGrN9T7VHyMmkc8v7hxQX/G3q4qK5cmK80dzDj7Y4+CD/RsBVpEWLJ8tydMCpSWjWfxadOWb4p0/lYypyes5q/I+VZsAIFC0pqY1NW+6JpQ3Kxpz86d6RFzXDWlekmVVV4Y0KCXxXAfPVTjdakU/u39Nym5VWZNsMoqsRGmJH3m2ERQsv/sHSIT/HD/Hn0MYY4ZG87ptabuk22D7lp4lW77drPins2f8/cljTtMdRdf38apougoZVyBbT5a5StFaFfnwQHibK8iYS8Aw76p0X63m/PP5M35z8WygyL1s3Ja4Ykdgk6qWGihp4LlVdi2sIffE89iURfe9zdBr5nRVhHctfNH3JWV1bX9MRVKVfLte8pvzE/7f08cssoxFng0ArN+356Pulzm7922vvNdVClcqFnlG0yXKAhi5HvodVnv6ylXTtiS1pZR9t1nyrxcWLD7YLHnYVX1eljOI4f/i0rqhO+fSG6ojPVXuLE0wQOy47PkBMx987byXnrqbol+EKHuQ1MmBt8awyLMBXP396RP+4fTJIATxMj+lPnqlvgrgSvuPgKGy9+FoSlq9fpZQto1dHOloin9cXnzP9S9QEqTp5uQlY5b0Yi32M29z1J2uYq7E9zVEvFn0ohV125A2VnbdU5ojf8TMi4iU24llGCrTkNQFiyJlXWYUzfeLdnhSM3Z8Dv3R4HfVH68/dYbDiyLhdjDls9EhI8djpH2ktJ2RSkhC5bHnRSghSJqSeZFwy7fCG1oqe4y57NPs2Qu9wMpVin7aFJwVGzJZcXxrzKE/JtZW1t6VtuojhTUrbzFMjmJmx6NLERHoFj9sr1RP/aw7IK6nDofT2fBabVpyVbF1CxqnZezFzLwY7ThkVDi+YhzEzMTYXpu8ea5VtCmb6pyqLaidkpYWX1W0pumKEQqJhE7WvjUNLfUgFQ/CvkcoMAYro2I60Tb7urCNfgO7SwmNFMpSvE1DO/TiWb9SibTboxdfEcP5BvY6TvKSTZLz3emSf/32Gb9/eMbFxgKsH7HV6loIwSCwVNQ1u7y8pg5alzXLszWP//QU5SgmhxMYvbidPC1Ynq5INhnj/dFb9Y69c4ClhM+e/+tO3aZ46+3t+/8O7yWqJ7Zq1ZKkBafnG07PNtbZW1uJTK0kjqM42IvZ34tx3wsH9qeNumrIdjnpNsf1HOtYrSVSdY7njn5P3N+f4+d4v2H5+2aoZOVdJSupSp4mW35zfsK/zE94tF2zKnPKTlnrbcLXDntewFEQEbvuO0nYW2M4z5KuAmJFBb5ezbsepHKgUD0fAkvT0Vd6QPqkv6/I3fRdVduwq0rur5fdCn/Kusz5dLLHrWjErTB+q/15WTTGzk1Pl/tus+L+esHXqzkXWUpWVYOoQA8albQ9j8CQxL9s3wwMyfOzZMs/nT+zPXZViUAw6/rofP32jzWrYtayKQq+Xs35ajXnm/WCb1YLnu42rIv8pefa5b5Z6weBoOlpNS/ZN+iqMVmKwC4CnKY7fr13yK/2DjkKI0Lt4Ov371szCFh0ixtpVQ0CHr+fn/ObixP+tLzg0XY9LH68TXeFFILYddnzLKU16MDk6ySrSljaZey47AcBd+LxKwFWa9ph0SGtKtK6unHkgaOJtIuj1Fv3YB2HMTPfJ3Zd3Dc2m395WMBtFQc9aStLWVNxnm+ZOAH7XoTXeUoldcGjZMmfNic8TOZs6/yNv09LxZE/Gs7PbZWzKlKepEv+77Ov+Xx8xC9GR0zdcABYR37MF+NjLoodiyKhaCpC5TBxQ0Zd9UkJaReNugrbtioIlMPUC4m1N4CXPopuH7d1gSPswtHICdhzIyLtdcI5VUdNdPGVg9uZIC/KhPN8g5aKfTci0C6n2YbTfG3PG2GB5cyNmLohaV3SmJa8qTgvNmyqrFuoUtYk2gkZO8EgPf9Do25LdtWCvElQQqOFg6dCAjXClzFaujjSI63XbOsFZZMO8CnUEyI9wRhD0aaUbUZtSuq2RAqFEg4CiYWdLbGeEekZjanZVQvSZj3I9fsqIlQTPBXhSA/nOXsdY6CsGx6eLfnDwzO+fjrn/rMFF5uUtKh+MnCllUQriedoQs/heDpiHHiDzQHYXHm73HH68ILZ7Rl1dfMiQ5mVrC+2bJc7st3x243rrT590wZlwJ73a8buR4MZ2tuEI0McGd34WtMayrJmu8t58mzFV/fP8D1NELg4jmXvOl1pdjwOcJyfQnPq/UZdN2RJwW6d4HYlae1aozvH1XhSwM8A6+f4C40+2avadujTmWcpX6/m/MPZE/6fpw87KtDbgysAX2n2fCt2ETsu6h0oCLYYLrKUPy4v+M3FCf989oyvOwWzpu07Ka6HoBNc6SpSTrcSbYBKNBS9SeYN39W2hroseVAveLhZseh6Yqq2RXd9Ze/jPti0hl0nNvDVcs5/P33K/fWCZZENgOTqeKW4FOyASzGMsoHmJQpnjTE0TcOzZMtFJ2oghGDkeLTGEDsu/jt4rLXGUDVWgOR3izP+z8ff8jTZcJ4mbKvyeypXff+JnTu7St4n9rZP+abPZh3FclMWnGUJv1uckVYVsePhK20pVz8CwIIOzBorYpHUJfM8ZZ5ZOu7fPXvIN6sFZduDq7cL2c3fURix51uA/LqARnXXR+S47Pkhd6LRK+lvddMOdNbWWMru8zMpgEA7zPyA0HFxpa2M/tA4CiNmfmDvJ+rdZaC9LYIWtldKdzS883zLoT+ibGuqth58qB4nC/64OeVhsmBbFUTafaPv00Jy5I/Y8yKypuJZtmZXFYPwhURwO5gwcQNERxE88Ed8MTmmWbc8WT7lSbpk6oYc+SMO/RECgasUVWOB4Gm+5SzfMnUD24epLDi42udRdPtUZ3ahqaXtVA0POfBGbKuMbZUzcnxmbmSBiBBoFMtix/3dGZ50ULHd5pN0we/WTynaGgHEjs+H4T7GGNK6GGiYmyqnaq1gS9N9591wj9v+BCnE2wEsU5LXCbWpMKbF0BDpKVPnmLFziK9iQLCtF5zlD9jVS2tsjGTfuwvY+8quXrCrl5RtStGkaOngyACJoqWmNQ2H3kc40qdsc+blYxbFU1v5Mi1j54CZe4dxd3456jmAhaGqG747XfF3f3jIw7MVi13KLit+dC+5q6GkwNWKUeAxGwXc2hsxCj3klT62pq7ZLRLOHl1w9/Pb1OXNAKvIK9bzLavzNdku+/OqYAkkWgYo4/IuCJdCKAQ3A4S2tX1XVd0gpSAMHKS0Uut1ZZOXunvdvGPetf3u1gKcwspS5mVNWdaUVU1Vt5R1Q9NYatPAQzVmaAAV0q7gSilxtMLREs/V+K7G9xxC3yUKXKSUtjnzhoeOkhLH1WitqYqK9cXWNmdqSRB5jPdGuP7r3Ui3Sc6j0xVPz9YD/VJ2Y/Q9hztHE+4cTgbQ2kdPVWiNoSgb0qwkzS9/qrqladrOGNDOS38MlBRIZVexXUfjOgrPc/BdTeA5+J5D4DuDVPa79iLqucFZXlmaad7NZVFR1Q1lZeew9x3pT2nZzZuSEtexNFTf6+fNIfQ9wn7c4sejpbbGnvN13Vq51LyiKCuK0kqolt310HQmjfbcvDwv+zJ7f87Z81LhXZmXMHCJfBet5PC+9xmNabvE3SZ5D9ZLvlpd8Hi7JqlKnE7KO3Qcxq5nE1Kt1XfzbwAAIABJREFUh34B3a2G93PdJ7tla/1t8saKTqRVyUFgFeuOw5jYcQea7Q+JsrGVpHWR89Vqzr9cnPDVcs5ZlpBfoeh4ShFoh9hxmXg+E9e3wg3awevA1VDlgUEGPK9topjWJcs8Z1Vkna9P01X9WipazlILeKQQBEoz8wIri92t0L+rKJuah9sVf3/yhCe7DQ+3K1YdsIodd1BqjB23q8ZoCx77MRhboepltrelFSnoFeF2ZTk8Ufo5XOYZ36wWuFLRmJax6+FK1VWP3iwpvvogXRY5j3drvl7N+ePygse7Ncs8I6muK8+F2iFyHEaux8T1GbkeQbdvjlQ4yhrJ9mA670QW0qrqxBcuZevr3pOqadiWJXnd8M16Qey4pHXJF7MDPK0H6tT7vqeUTcO6yHm22/JgveT+eskfl+ecpQlFU3dCK/aaG7neIGfuKT2IevRtF3b/O8Pb7prL6oqkqmjalqPQqinu+SHeGwiWeEox9XzqeIwBJq7/SqpiVlWDQMfXq/mNlUghBIdBxK/2DjkIQkLtvlVVdOr5HAYRgaNI25y0fXtmz9WYOAGfjg7ImwpHKp5lG1pjmBc7Iu11/Wc1WVNxN5wOz+rhnv+6XyQsoFVIDjvgpIXkSbricbrkSbbi6805dduy50VE2mXmhnwU7ZM1FUlVcF7sSOqC366eEmp7rWihhspu3lTkTUVjrKT7TaGEzZcksru/23vkpspI6qKzB2hQQhAql1q73Rwb8rZmXWZ4qiZtSoLWJe0qfI5UTN2IfS9m5kbEjseycjpl4b6/zENLhSMkUkg2lU3APeVw4I1+8MKVFApXKFwClFAooRFCUrQZi/IpvorxVETZpLgyYOwoJJYaKIRkXZ1RtQV5s6Vsc6RQhNrCJIDG1NSmpDElSbPCLQMaU1O2BSDQwkFKRWNqNtU5tSnYc+8QqMs5KOuGbVYwXyecLLecLrcsdxlZUQ10bYDIt/lB4Dq4jsLVasgptlnOxTphk15eA9PIZ28UEnjugKPbrnfT5tE1RVWTdnl2r0aolST2XeLA43g24tYsZhoHxIHHXhxy92CC1pfPgL6dqMwrmqoe8tbno21a6rKmymua+s9M5AKs2bARvafU28WrlAbb1lBVDU1j8H2HvVlkk+HGUDcNbdtijKBtzCAX+q6WbpvWUJQ1aV5ysUqYr3YsNxmbXc42ydllJUlW2Ga/qqbqwUVj+8OUFOgueXUdRRR4RIHLJPaZjUP2JiFHeyOU6hJ4oa6t4vShtMQPXYrUpSobimw7JPTxNMT1XUazmyuAz8dqm/GPv3/Mf/vn+/YkbvteNs3eJOJ//Y8fcziLXwBY0DWmNy27NOd0vuVsseN8seVsuSPJSvKioiht82NZ12gpUUrhagusPFczinxGscdsZPd/bxKxP4lwHYVS708qu21btmnO2XzL+TJhsU5YrOyqzC4tyMuKqmqouovNGNDa3uR9VxOFHnHodvMWcTiLubU/suOWEvUjakmb1lBWtidxsU65WO1YrlM2Sc5md3le9nNR11ZgoDdaVl2pvQdWUeASBR7j2Gc6CobzUuyNCHwH5zn6xvuI1hh2pfWuebBe8o/nz7i/WrDIMwzgKs3IcTmOYj4cTbkTj23vSkcX85RCCznQtPJOSGJbFSxz2xd0kloBhuMw5k4PsFzvrbovisYqHD7ebvjD4px/Pj/h6W5LUpXX3hdoh30/5E484tPJHp+MZ8z8YFDIU1fsAnqaXNWBt15B8avVBV8t55yTkFbQXAFwqyKnXtuKw9j1OQgjbocjnEi9U4CVNzUP1ks2hVVuWxVWUTDQVm7989k+n0/3uR2N2PdDpp4/9Ib1PQK1aQcFuofbNY+2a77dLHmwXpJUFTxXOUrrkm83S9ZlTuQ43BtNGHseAc4bA6w+DLDIU357cco/nT/jm/WCs9SC4qvVkb736ziMuDea8Ml4jw9GY6ZewNTzcfoeE9HRHzGWltZV+Z7stjzerXnQUTkN9WBGa0Fyy7frZScpXhI5LreikZUwV/q9szGKpmaZ5zzebfjt/Ix/PH/GebpjUxZIYVUeR67Hh6MpH44mHHYVqLHrW6XArpexMfZ5nHWgalVkLPOc8yzhJNmxKwuOwxF34zH7fvBGnlOe1uwJW2mywi77r1xx3pQF51nCd5sV26rg/mZxrR8MbP/VrWjEfzg45uPxjKnn28WWHxiusvegyjScZCvS/N0CrKkX8MXkFkpIHiYLvtsteJKuUMvHndy5JtAut4IJX4xvEWufbV2wLNIffO8+8GK+nNwhVC5ZU/HV9oxn6Zrfq2fUpuFzcWwpdK6dzwa7QPldMmdZpPzz8gm1ueyX7c2VQ+UOPllFe3MV25GKkfaJHZ+R9hk5Aasy5VEy56LY4ikrSx8oh8rY66i/a5SNrX5VpiVrKsrGVvmqtmHihtwL97gTzpg4PmMnYF4ktkoqFZGyNMCxGzBxAs7yLd8lF2yrnH0v7r7jhx1PJTSuDHBVSCBjfDUibdYsises6hM8GdrXVEysZ7gyxJEuSjgsiifMy6fkzY7W1AghGTsHjJwDmraiaBOKNuvo9g1pvQUjup6uClf5OMLHlR5Fm7KuzkiaFZ6K2OPOsE9FVTNfJzw8Xw3gKi3Ka0ISQsAo9Li9N2J/FDEKPUaBZ/MJpXh0vuK37QnbtBju4/vjiC/uHXE0iehNqKvGLhL//+y913PkWJr298PBgUciPU3ZrjZjdnZnNasIhS50pT9doSt9Mvutm57umTZlWEWTPuGdLs4BSFaxTBdZ063RvBHs2S0mkQASCbzPeR8T5wXbJGMTZ5xvYsqqoWyVmZ0tTWbDgONJxO8eH/LbR4dMIx/LNLEtSeQ714yd2lb1tI1eXG6b9kZM0DbKQfAX6SKomuBPE8x503sJYSBN0Te6aVZQ1YoLaupGUcrbtYBN0/aTsqKsyMuaNCvYxjm7fcbZasf5cs9qm7DeaZCVqOY8LysFsCq1glfXDVLro6SpwJVtSULfIfQcRpFqYuejgM0+Y5/kRKFLFLh4rt1PS7oSpkDaSmdVZCXJLlX6KymwPZum/vALJM1Lnp+u+O9/etHnFqhza3E4G/DFQ+XK0qd2t62a4tU1uzhnG2dcrPacnG14ebHldLHjdLFlnyiAleUq7LEoK82Z1dMRPbWLQpco9JgOfWajkOO5Eo+OIw/xfkf/D65KO04WRUWcKcBxuthxcr7h9GLHYh1zsYrZJer8p1nZTyWBfvXEliauYxEGDoPAYToMmI4CVtOIfZITp4UCKL6DY0nlbnSHHHx1/hXwK0p1XtO8YhcrkH++ijlf7ViuE9b7lM0uZZ/k7JKcLK8oq0otUOipYg+wpFp1sqSprkvfZhiq63I6CljvUnZxzijyiAKXwLu8Lj8FCC6bhos04dv1gu/WK/68WvAq2WMJwcT1OfADDv2QB4MhT6IxDwdDJp7PVOs5XFNiGkYvoO4a+E2Rs9TUp3m8Y+qqv3kUjbgfRkT2x1E+utXhfVnwfLflj8sz/rJe8nS3YZMr7YOByvpxpOReGPFoMOTz4YQvR1O+HE2YOD7jK3Spq9PrSocm78uCszTmLNnjSjWt87cWr2JlG94db1ZXZKkCXN+tl0xd5VA1cl18TTm7i8+tahrO05hVpsJUW2Bg2RwHqnnu9ET3w4i55zNyvTemMf0EqyqZeUGvyaGlP+Z9eSleLuqaizRmlad8OZzwfLdhYDlMPR/nI6YOXSjty3jHN+tFH8K7L4p+MmIaBq608KXF42jIZ9GYL4YTvhhNeRyNGDtuf2xXp+6KclSSlCVnaczc3zB2XdUEGCpjbKNt3jtTjIssZlfmOFLyaDDkXme/73VC9E9XcVnyYr+lbhu+WV/w5/VC5VmZJhPX59APOAhCnkRjPovGHAYhU70w4OiMuUuKb62dPbVtf55yGu+ZeVs2ec7jaMTjwYi5H/ykaVGnh/EtZRLyvlpmKb5lU9Q1A8u+GWAYENkO98OIJ8MxU1fZ5t+24ionbwriOmfmhBRNxcQJdOgu2ELFLkxsn2NvSNO2DKSLoY/TN21GtsehqzTpI9tDGiYINcWaOQPWRYov1cSzCyo3LYEPTGyfzwczQsthW6acZTttQHH5TDINQWg5zNwQ17QIpM3MCTRV7/JcBdLRk0Z4lW55Hq8YWMpav2xqmlYt2HVgqQvetoTJD8YF+yqnqGrypstIU9eyKdXfuKalpkRa0Xi1pCHwpcPYDpjYARMnoGkb8kbRIyPbI7Lc3qCli/foaK95XfbGM6Yh8EybyPYYSFe/r4kwxLWFHGmYBJbDxA6ZOiFTO1RulU3NrszI6ttZ+gvDxDZ9AjkkMMeEckRbNNRtTVytKUSG3SRYhoNj+QysGbZwMQ2LTXlGWm9Jqg2GIfp/D8whhZFRtyUFWW9qUTQpLS3SkBgItU3TwxE+NbX2T6jekPjkZcVil/D8YsPFNibOC4pKgWBTCELPJvRsHs3HPD4cczAKiXyXyFcAy9a+CM/O1+qeqD+TYeDy5FD9Tae9VACrZp8WbJKM1T5hGLiErs02ydilBdI0euZX5LscjQccTQa4lsS+wR1QCIHtWvgDj6qoWJysoAWhPQsazezZXOxUHqDvYN6wnZ9S/59OAbKkSeA7tC2kWaFWQKuGPKswDAhDl2jgEQYO0hQfbddeNw2bfcp6m3K2UtOZxTpms0vZ7FPitCBJi54mmBelmtSU9TVaXEdJU/930099Cp2AvY8z1ruE04stTz2bKLwgCl0eHY95dDzhaDZgOgwYR/61/ese4HXdUOQVXuDgBg7eW3z+f0o1uonPi4pK59R0VVYN233GZp/y/YsF379YcrbYsd4lbPYZsZ4Adeeh0iCzs5nujr8sazI9/l3vUi5We174Gy7WewLP5rN7k1sdw+uV5yWrXcpitefZ6ZpnpysW64TVNmG7z3qqYF4qymdVN5omeHnsrZ58VbUaYe+TnPUu5eXFlqcvl4wGPtNhwMPjEQ+PxszHIePIJ/Q/nqf9erUt7JKc9Vads9PljotVzOYKmFI0TTU9zPrrsrr2WXSAQC3oqH+r60aDystjO1vu8F27B8L3D4Y8Ph5z72DYg8tPUUVd8eN23ecsrfMMSwiOggHHwaAHJUpM7hHZDr7OUOpDozH0A0a5enVTlbHjchxEfBaN2RU5ng6B7X4+5pZRt5f0tW/XF/y3Vy94tt+QV5dTJUsI5hoY/mYy5x8mcx5HYyau14OKTr/z+j4IwwB9DHPP73Og7gUD/rS64P85O+nzttIrIv6sqni62yCEAggPB0N9jHezINY101XbKHtxKXkQDvnDwTH/PD/iwA859EIix8GX9o3mAcIwsIWJkHBPBz0PLJVRNnF9vtWNfl7X/XvWbUurLeH/uDxX03ExZ/wBDffV6lzyTmNlRvJ8t+EsiUmq4ppOx5MW98OIB2HEbyZzfjuZcxxGTByPoePiSvlW7V4HBuYEOKbJxPWYej4PB0O+Xp7zX4szTva73uFOrfBXXKQJXy8vcEzJb6cHDGznWpjzp6h1nvL18pwX+w0n8Y68rpi4Hkf+gEfRiC9HE74YThk5LiNXTXm6BY0ua04Rs1rsVrk/BpZNYNvMKkUJ/KqYklfVte+c91fSmf21yxImUyfAEiq490k5xTNtDtwBwjAYWp7So0mX+/4IgAf+uNf3HHkRnrQ4cAbsq5yHwQTXtLjICpZZyibPOXCGHLpRT9G0hIkt1P1h5gyYu5r+Jl3iKueLwRxbyP4O4JkWD/0xvmmTNxVFXRFZLjP3ujGOMAwkgpHt80/j+4xsD1/aBNJhZHuM7es9SiAd7vkjfOlw7A357fBYRVG0tVoMN1Sgs7p+LKaOouqZxpvMlU7jKPXfdK/pKOC0V1xX9XOtC2DuHAaFYWiXRI8H/hgpBFldscj3bMuUqRMysQO2ZUqlbeUtQ51HW1O2L42H7oapZRoSy3AUXc8w6TwnlUZXga22c/rTv1fmFZeZaOpfFH3R0D/KidC8ck4a5eqNQAqpXAWRGIaJZw4wHWWy4cshV8FtUdYsdwkvF1u2SU5dX7kn2pIvjqd8dX/Gg9mQ+7Mh49DD0WDHFMr053wT4zsWQhg0jfp8fNfmYBzycD5Swwch+p65qGpNDyxYbhMWu5TvXy349mTBchuzjTOyomLoe/iuRV5WHE8iZsM3+15pS4bziPtfHpHGGf/xv/8R27NxAxVEnCc5WZxTZCVCCOYPpwRD/5cVNHy1biMOe71uOkjLMpVxhQHrrVotq6qGrCixLUng28ynIWHg3opiVtcKSLw43/Dnp+d8++MZz07XrDZqYvVTq2m0PWwNb/ATdBkGSFMh/n/61T3SXNFjXNtiNLjSOKglUloD6qqmzCu80MX1HbzQRdrmtc/hp56DpmkpuWzKOxmSAVR1zWavQMV/fPuS//M/n/LqYkteVtfGxjdu9x3H300lV9uEJ/c15eOWl9LVc5AVFYv1nu9fLPi3b074t29P2OxT0qx87353VTfabpgKXrsETFPgWCaDwOWff3WfSk++PMci8C6pJredGrS07OOcVxdb/vL8gm9/POOHkyXLjQKLPzXvpaWFuqUGSr0yFd9weUs95frVozn75D5NC1KaTIaXD9W7nGTldc3T3YYX+20/lZm6HsfBgH+cHfKHg3v8y8ExE1e9//vf+dM2cHWjcqEWWcI3qwX/7fR5n8PT74EQzL2Ar8ZT/nBwzP909ICHA9VUvW//u4mWFALf0vTCIKJsaqaezybPeL5TOsqsrvprvwNYiyzhvgY+ahX3Q971w6oDBqYQRLbDw0HE/3hwj//10Rc9HfBdBgbCUKJ32zTxLZt7YaSpZz5jxyPXYDu/ci67ac9ZEvPH5TmulBz6Az6LPuy+d9V+eJklfLdZ8t1mybPdhvM0fuP1vrR4EEb80/yI/2F+zB/mx4w+AMwZV44tsGwO/ICyrnkQRlyMEhxTcpYo445Kaz47U4+LNObr1TllWxPaDl+NprStfO+x3aZWmcqU6zVkbUtkOzwZjvnn+bEGzseXx/e+Df5t4qYPLltIpm7I1L3ZxXNoewxtD/w3fxdaSlt66L3pqJzXlQZYBV8NZ3w1nDGyO6rmzS3er4c3u6N50uaBtHkQvD13FLp7kMnY9hlrkPWu6vb/ngaOty2Tq9b3l1bvTXvdMqgHH23noaemWQLlPhnZHlKYjO2A7/fn/Gn3in2ZEVc5RV2xKzO1YCQsFZosLCyhNIbd9PMuulxlWCKRwsEUFsKQV2ICdBYiNdBqCKWDiI3uONVeKB216MFXB7aEIS4BFo0y2jGa/n07O3hbDAjlBFu4+Ob1a62oala7lJPllm2SUV+hz3mOxefHU/6X3z3h3jTicDwguEH7/+x8je9amMLo+7rAsTgYKYDVTbper7pu2GWKFfTfvnlGWlTsUsWa2qVbAs3uEobAd22m0Zu9iGVLRrOIe18e8eN/PuNP//mMPC0YTEK80GW32rNfxkzvTXj4m/vMH85+2QCrbjPKJqFqU+q2oGnyHo1/aLnmBNecII23j+ilNBkPfWhhOg5IswJTCAYDl0Ho4mrE/NHH0TTs4oyzxZazpaKQbfcZ+VtsHq/WpWlAZ2whaPXD82oI2+vVtspIowLOFjv+6y+vyHMFXAwg9B0C36EqapJtSrxJqKsGy5E0dUO8TZGWxA/dW2vPWr2vVd2QF5U69qLkYh3zzY9nfPvjOT+eLNnEmQqXuyWwVnosh+kouGLycatN0gLrbcJqm/L8dMV3zxZ8/2LBi7N1P2W70Sr7NdMHuJJkrp3c3nivpqWqGpKs4NmrFU3b9tTRB4ejXmN362ohTgvOV3vOFjsu1jHrXUqWl+9d3DBQQNbQ16XQK4Bds9olr99UTasmXBebmG9+OFOTrrLCEoJB4BL49o0j+lsdaquAX2ApM4iHgxG/mx7wh/kxD8PoJ+k2PnVtioxX8Z4ftYNfF6TbouhlljAZuR5PhmP+5eAeT6LJrTQeQA+4xo7H58OJMn/YLHX4rwIjDS1FU0GpNEYn+x2R7fYmBXdZM9fnN5M5v5sechiEaqpkfBxV2zMlB35AUVf8sB1yP4wUba8sroHWXZnzMt5xFA/YFhllpyv8wAdk1Soq6jfrBU93G/avaeU62ttxOODL8ZTfz464H0bYt7j2hGEQWDYt8Ggw5LeTOXXb8Crec5rs+9fl2j1TgbA9yyxRFuVSKn3uJym1+m8KwchW5iS/Gs/5/eyI30xmzNw7uIf9vW5dQ9vli2jG3As5cEOG9qXV/d9iFU3Notgrk4psi2ta7KscaQju++Nen1W3Dc+TJafphkjbwp9lWyqtyUrrklURs8oTlkXMabYlrYqe0fFLKWFIAjkklBNMw2JdvGJfLfWkS5LVO3xziGlI6ub9VEXXDAmkArp5nbArF9imhy18bOHhtB4CQS2uL35XdUOSl3pqpHoMxzLxHZvD8YDDUcjhWNEC3yaFUO642rStMaj1PaaulQ5ctm/5O32vw4WH8xF/+OIevm3xzYtzvj25YLVP+cvLBY4lGYce04GPY0kcS/bMNWlLRgdDWsDxbMZHI/Ikx7RMhCmoy5q6rIlmA2b3p0zvTYgmg1v1zp+0K6najKxekNUrimZHWe9oqLUN5YddwCP7CywRIHk7wLKkYBT5BL7Tu/Z1DnjCMLBteUuA1bJLlE7nfLlnsVEAq/4AAdxV44BOe9U56lV1A/Xbc1HqRnFmTxc7TUXMtSGGzeF0gOtYVEVFskuJNymGYWDZkqau2W8ShCkYzkJt52l89IXSNd6VpgoWZcV6l/L01ZL/+PYl//cfn/W0urJqbn1zcizJaOAzGwUEnoNp3t4xq21bVtuE718s+NMPZ3z93Snfv1iQFRWZdqZ5001KfbEvtXzmZbhjrcWW9ZtXsrJ4rqmzlqevVpytlD4vyQryouLzBzPGkXcnE6w4zTlf7Xrgv9ml1HXz3jyK7rhMU2jDEaGogZr2WNFcowBcO76mpW1rFuuYOCnY7FOkqcDV8SzCts07B1gNLUbb4ktL0wInCmAdHOOa1ltXan+O2uYZT7drftiuWWUpZX15vzOFwJWSkePxuQZYU9cnsG63vG/qFeWR4/LFcEKhraif7i6nPU3bqtyiumGZppzsd4xdD2mIOwdYU8/nt9MDBbD8wa3obK60OPDVdfpos+RBOKRumz6EuqtdUVA1DUfxjk2R9wHLik7z7uqohspi/oKnuzX74roZgWNKho7LcTDgq9GM38+O8LSJyseWMAx8S7lFPhwM+c1kTqkdEq8DLDURbVD5WMssVU10ZxLyCapFu4uinPDuhxG/Hs/4/fyIL4aTO8kb+3vdviLb5cvhjKqpsTWF7bbZXb/kKpqKNC+uZeo5wiKQDve9MZ608Uyb02zD83hFWhe9xmpdJr3pRVoXrIuEV9mal+mGTZGQ1AWmIehien8JMEs5Ao6YOg9Iqg3r8pSiSRCGovdZwiUwh9jCIa7W1O27QZYjAobWIVWTk1ZbdtUCu/FxzAzPDIEWKWw9MbusqlaLxtskJyuUds6zLMahpwDWeMDhaIBry7cDLD1sMA1BbVxq+esrMpqb/w5srWF/OB/h2RaBY7PPcr57uWC9V/2VLU3uz4Y8mA+JfFdPw65MsA6HBCOfydGIB7++Rxbn5GlBVVTYrsqR9QcufuTjhS6WY/2yJlhNW1PpqdW+PGFXPiOtLqjbjKpRk6y6VSuDHe+zbet+/AlgYCKFi2m4BPKIpr15UtQZMbRtixAGjn15OGWl7MKLvCJATbk+dgoiDLXt0HewLLM3veiobI6teKaONqywtOD/qhublIpbKk2hND3aYr4oFWjpNEhpXmqgojUGLf2/O9aWH14s+qnOZBgoq3dpYkpBXTWX4WmGQVPfHux01TQtaV72GqUX52u+f77gh5Mlry622i1PEPq2sle3rf489NM7Qw3yOx1ap2HqDEQ68DYMXWajgNk4JPDtDw6dvKnU1E2d0+ena/70wxl/fnrOs9M1F+tL+k8XUufayhbed21s2ZmQmFiWumn0Yln92XWaprysSVI1wi4644i6IU4L4rToATagXRl9PMfCfsfN6P1lKCqs5+DYkrZVDoIdqLcts+dAd9emlJ25iArhtkyzd7XsJlNV3Wj9WX39utROkKCuy7yo9P/f8uPJikHgYhgwHHj4mh5wp7b6wNBx+Ww45tfjGQ8HI2bem7qvumrY71L2uwzXtQgjD8f9eACz36XstxlCGAQDlyB8t+B9W+Q83a15tluzKbJrttFdztZxOODIV26FvmVxSeD46dWdYwN6p7m0Lvl2vUQa16+tjsK3LXJOkz2HScjE+WlapXeVaaiH59jxeBhGPNCufrdp9jod3dBuOAxCHkdDkqpkk+fsuARBZa2+d5s8Y61/QstGWtdzdF6vulWUzm2eschSTpM9qyy9RkMECC2be8GAR4Mhx0HI1PNvTaw0DANL20zPvIAnwzFJVfIq3umpcttTn/K6Zl8o58jn+00fReB/Ys2SFIIDrRX8YjjhOBi8U9/WtA1lU1A0BVJILMPGFJdW/FmTkdUpwhC4wsMx7xbc/5zVPW/rtmVbZmyLrAcCtV7gKJoKWyhgHkibyFa6s12hQnbLpu71oh35K5A2A0sZS0itOUqqoo9pSGs1UVA0QxdDgGEIqkZNrfO6Iq0qbYHe9tdtR/30pTK08KSFLTrbc7X/RdMt0ChwU9Rq4cIxJb5pMbBdIsv55LEBnmkzsRW9smjUeeziUwLpMHEChpaPrXVnpQ4utiuTQDp4UgXHD6Srgo6li2kIHGHhSxsDpXWzhMnMUZNAUwgcU20vsjxlgiGUmZMvHY7cIQOpHAc/5uht4RLIEXVT4ZkDLMPBNFQfawmXgZwBgpF1yEBOMTAomlQrQwQmJp4Z4ZtD6rbEFh5VWxDIEbY6iJSuAAAgAElEQVRwEYaptVkKiDkiZGjNGcgxZZuTNzFNW2MJF0s4OGagQ4bdfj+6atqGvFJ6qKJS2jlbSiLfZRJ6RL6D51g3ukx3dZXR1V0vl31HTdPc/LeGZiKYAmWaYQrSouRoPGAy8EmKkl2ac76JebXc8nKxBSD0nD7kSZgCx7P1j0M4DijSkizJKLMSx3dwfQfLtbAceWv/AvgkAKsirS/Ylyesi7+wzr8lqxcIw0IgKZuYsokBgSV8TOFQNRl1m2vXkgYpXDx5gC8PaK8Arzfeq2m0Tfubk6Q4KbhY7tjuMo4PhziOvOaJ/1NKmoLZKOCLR3PWu5QfT5YqI8gUWFIyHirK1zjyGQ88hgOPwFPua47OdpLaYU0Y9LlDRVmRZiV77WJ3uthxeqEujs3uTW1SnBU8fbUGwyAKXZ7cnyJtSTjyKdKC9cWO/TrBdi1c30FaJqZpYtxBTlHTtMRpwcV6z9lyx9ffn/LDyZLz5V590SwTz1VW5UfTAfPxgIF213NsqbIQ9JSk0ceeF8pOvHO9W6wTlpuYycjncDpgPg6VZukWN+6irFhtEs5Xe/7y7II/fveKF2cbdvH1JHvXsYg0sLs3V3lfav9dXFtimiamadDZ/VfaRjTNlDHHepfy7HTF81drVruELC/7BxPALs55+nJFVTcEnjpPs3HAZBh8NMAyDBhHHk/uT9nFGc9P10q7p0FUZ6s+jnxGkcd44BN4NqHv4OqMik7DqFx9LieVHdA/Xew4Xe54dbFV+robwvnysubkfAO0BJ7Nw6Mxo8i70xXUbksT1+PX41mfUXNTlWXFq+crfvjzKbPDIZ99dXArgLU42/Hjn08xpclnXx58EMB6vt/yfLdl+9oUxJcWR8GAx4Ohmh6J20CrN6szTkjrAZHtYArR6xOuVlKpRv0ii3lYvanr+JgSKIMKNelxmHkBU9e7s+miqV0jnwwnrPOMF/vNtd83evEmqyqWWdLb7nvSekuSoqqyqftw31WWsCvyNyzZQYN77Zg3cj6uoXpXhZbNw3BIXBb81+JMRQtoe+vu86vbhkWW8t1mhS9tRo7HmLsDyK+Xgbqm7ocD/nl+xONoRPAeOmvTNuyrPZtyjS99ImuEd2Ufd+WG8/wUKSzmzuHfFMDqqmxqnu3XfLs5J9UOc3lds8oT1kXK2PGZOD4PgxFfDWcc+xEnyZa/bC/YlbnKedPud03b8igc8ySaMHeVo58UJoss4Xm84WWy5VW6pWwafjs64B/Gh0SWiy9t6rZhlacs8oSzdMdpuqeoK236o1wz86bi2BvweDDmyBswtD0GluAk2fLt5oJNoYS4VdOwKlJWeUoodbCzH/FVNCcafvrPMLI8HgdTDt1IaRO770bbYGlbdse0+umda1pMnICyqbD0ZE9FdTQ4wiK0XFwhcYRkbAdUbd07C/rSxjdtylZlDpp6e67WYBkYjO2A32izjokTfNR93DUHTOz7tDRYhoMlHEzDQiDwzIgD9wnj5gjXDHHNEClsXDPsp1QGAks4SMOhpSFq57RtjS18HNOnaRs8M1Q5WE1J3Va4GkQ5bYU0bEbWUW+KIQ1b/Qi1L1er0dKHvKwUS4YWSwoC1yby3Wt0vLeVgZ5gCYEwagw6l1Gdk/oBAwFpmngODH2Xg1HIg/mI8/WeUvctr1Y7vj9dKffr0QBuAHxCCizDQpgCy5HK3VuamDoSSNxWk9Lt651s5Uq1lKTVBeviz6zyb1jn31I0OxxzhGMOSesL0koBLk/OsBkonVYTK51WWyCFjxSB1mq9/YRXdaMa2eJNMLLZJpyeb7lYxniexXx2c2jdh5SUgvEwQEqTk7MN48hjs0txbAvPsTieRxzPI45mEYfTSDnGDTxGAx/XuQRYr1deVCSpolj9cLLkhxcLLGmSFirotqqv07TSrOTlxYa8KPn8wZQsL/FNEy9wCSKPzWJPGmcYwsANHIQpMMTt6XVwqUN7dbHlx5crvv7ujBdna0BR+gaByu86nA54eDTm3nyosqxGAb6rJlrSFH3mUtfAb/cZy03MYhNjW5KWlukw4HA64GA6IPCcj8JX3UpiXlScr2O+f7Hku+cL/vLsgtX20rmhC3qOApejacTDozFfPZrx5aO52v8owHXkG4G63aQnSQtOl8pZ0vdsZSxhwHqbUlVZvwLdhS7nZcVUT+cMQ62wuPbHidUNw2A48BBCsNjETIZ+D55cW3IwHXA8H3I0G3A0jTiYDvrr0netftr6enXT3yQt+P5kwQ8vlji2pKgqdkmmc+Yum8+yrDhb7tglGQ+PJ8Rpoa5bwZ1lgHVamonr8/lwwufDCb60esfDblprGAZpUvDqZMWf/3hCUVQcHA8ZTdRrusWYnkJsqs/f0EYPjZ48dsHkhmGwONvy3TenOK5kMgu5//jN/Wv7JrhlV+S83G95Ge9Iqjczrw79kIeDISPHvXMqj2WaRI5D0QSEtt2vdr+eH5VWJRdZwipLSev3a0k/pAxDZf6Els3Qdhm73p3YW3dlGgZjx+NxNOJkv73Rba5FGXuss4yzJFb5SG0D74BYZVOzzTPOkj3rLCN+TdvV1dB2eRSNeByNGDp3v2IfWDaOabIrcyauhyMlRV1T1nVPMa2bllWW8uN2zVxPvD5VGahz7mla7m8mc6au/96JWUND1qRsyjV1W2ELG/OK29m22nCen+GaLgM5/GT7/3OVouJWvEy2/PvqJZnOfczqihfxhhfJlnvegHvBkKqpmbo+Y8fnVbrjT+szNkWmAETb9o6kVdvg6fBqwzYIhGBX5pymO/68veBPmzOyqlJgOBj2Cx1lU7MtM06THd/tFny3XZDXFY4pEYZgX+bEVcFmMKZFLZJ0AOMs3fPH1SmLPEYaKsj7RbLlJN4wcjzu+xFpVTJ1P4177Os1sFwG1uX9pLvntrTazP16rzO0fI4Zagn69aiLqy6DoeXSXJnqqfBl41rEwk3Vm5LcolwzwDVvPn83/c41AyLrpqy3j+vzAjnS2+q8EQxlkHHDttpW3SuLSueXtQrsBK7NwFPDhPfpUAyjyzy7fO4p4FZTvubU/Lbq2EAD32E2DHkwG1JUNct9SlqUnK5iIn/N0XjwVhlPJ4+w7E9Lc/4kFMGsXrItfqRtayL7M6Th4ctDPDnjIvt3Ltp/xxIBM/f3jOzPqducus2Jq1P25QlNW+CaIywjwDSc3q7y9UqzkvPFnt0+e+N3u33G2WLPdpuSpOVPdlS7WoZh4NoSA5fH9yb8y28f8dm9KaGvJhzD0GUYegxCh4HvEupRqaunZm+bIJmmgeNIIlweHo4IPBvPVZOFwHU4X+05X13y8Ju2C5Et2cU5q11CbVkUhTo+U6oRqCEMqqKmyMtbJ1F3VVY1L842CCFYbhKlu5FCTe0in4dHYx4ejbAskzgteX6xYblPCZZbLKnOQ0d5aVpNsatq8rwkyUoVRlxVWLbJMPI5ng95cDBiGLoftTLUmXJsdik/vFjwr396zvPT9bUJjDRFP9357N6ULx7OeHg4YjYOmY0DfNfGskw9zr6+fcNQqzCOo+h+lmViCoPp0Of7Fwu++fGM718segphdz/Mi4qTsw3/Yb9ECsFsHDIIPq5ZM0BnqMH9gxH//OsHjCNfXYOBwzD0GOoMtUHgEPounqMokFJTN28qIZRu0TDg3nyIa1v4OuvKtSzO1+q67NwROyt/MtgnKmpgF2f4roVn3s68AbRO5Yqt+sC2cU2J0UCRlyzOdizOt1RljbRMqrJmdbHXwKulLGr225TVYs96se/DyD3fZjQJiIY+phRIy2S7Tlic70j2GVIvjJy93FDkJY779ttli8pkKpuauCyIddZW9doN3jbN3nLck9ZthrM3lqEbJClUOKZtmlhCUDbX6cKFppvty4LyBjDxMSUMQWBZTDyf0Lax7mgV8Or2Q9vmwA8ZOe61EMmrVTU1+zJnmacclOF7V0XLumFT5JwlKnPqbZpY37KYewFz7zK76C5LGFqjZ0qGtsuhH7LJlf12T9OiJS5LzpOYdZ7dCATvqmzTxJcWEw2UQ8vuc9neVQYGlmHhmT5lW3KWndLyiqZVVtNVW+KbPqEc4Ii7P48/Z9VtS9HUJHWpg2xrhrbL43CMZZr8ZbvQOVMBczdgYDmkVclJvCUuc0xDcOgNmOlrLK8VvQ/g6X5NUpX8ajhnYDvMXJ+WGXXbsC9zVkWi86reXi0qP+vxYMzMDdmVGdsyhxY2RcoP+xVSmISW00+3fGnzOBwzdjz+sl0QWSpmYe4FHHghwSf4LnxoGVf++7bfves13Su6R+H1v/kl193v4dv67K5aWtqGXpbTohaoldxAWbG/9z0MQ0tnBKJULoh101DojNkP8TXoyjQFA89mPgw4W++RwqCsanZpxmIbk+TFB03EPmV9EopgVq/Ylj/gmhOG1udE9mMi6xGBdZ+Gim35I645Ye79M8f+/0zbVrTULLM/cZb9K2l1jmOOsUSoAJZx8wefZSUXiz3ni90bv4vTgsVyr/KpsuJWAEsYhqZUST67N8GxTIqy7ulXnaZFjRaNS5cU490rIKYQuLbodTTH8yGBZyNNE1MI6qbhYr3vm/OmUdS6JCvYxhmrbQKuA3lJ0zQIU2Br7UtZVpRZRXNHD+Cyajg527BYqzTtvCgJPJuDyYDPH874h8+P+O2TQ7ZJzv/19TO+e7noebaGthu9SlXqMsE6h8KmVcna0pIMI497B0MeHI60vf5P399a6+Q2u4zvni/4169f9CYTXZmmYDL0eXxvwu++OOb3v7rPg8ORtiEXvfbrpvc3DAWQXWFhS5Nh6DEbBnzxcMZ8EpKXFeerPXGSU1b1tYnay/MtcVIwHfp89dkBjbaN/ZjjdCxFv3xwOEIIgyf3p3ry5uPYUl1LWmN16WSpj+st2xSG0W/XdSwOpgOGA09d40LAj7Dapj3AalsFwKuqYRerXK5tnGKaAu8OBhimNgKYuB4j12NgO7impCoq8rzi9OWav3z9kiwtcF019t+s4t7wpiwrdtuUF08XPP3LGWVRU5YVo3HAw88PMDBwXIntWizOd3z3p5dcnO1wXQvHtdhuEvK8ZPAOKlbTNVY6CHdfFqRV9YaZj22aRI7LxPXwLevOH+Xd1MESAksHGcueGvMawCpz4rKgbO7mHqE+J5uJ6xFazhv6r9uWMAwGloMlBCPXw36LuUPVNOzKQk3ndGjvu6psajZ5xnmiAoXfCrCkxdwPmPsh3icweDAwkIaBK5WZxqGvAlTj8pJu3LYtcanonZs87ZvvT1GWUNPQiesztF09YZPvvWINDCxh40ufdbFkVayIqx1lW1I2FTNnxtSeE1kjbPG3RQ+s26Y3mMk0OHoQDPmH8RFT11ffCyGILJeR7RFYtn6tcq00DcGRP+Afxkcc+QO9WFPw9fqU/1qdsshipm7Ak8GEqRswtD2qpuEiizEMlJboLQ+S7nk7cjx+OzrkV6M5myJlU2R8v13y7faCTZFrcD8grUryumJke/xqOOfL4YzIcvtw56HtMnd/XoAF74YaH3J/NT7wdX/b9QHHryUEynxN/ZMwDKSprNXND1hQEz3AMntAVjcteVmTl/UHTbC6kkIQeg7zYcDAczBNQaZ748UuJs6Kn90N8hPMx1rqNqeod7jmFFeOCeQxnpzhmEMsw1d6LMPCEj6OGPRNSGAdM2w2mIZD3ebsyxf4cv5WkwvblgyHNzc9YVZgWyZpVhANPMyPNhKgb7IFBgPfoZ1GKmXddwgDtwdSH0Px6rbb6XCmo4BHx2OyQjXowjCuPfDbVtHT0rxku8swixqRVRhFjR95+KHbt3ThUDmh3EW1batMKKoax5JEgcvBdMDnD6b87osjHh1PmI1DbEfy4HDUJ3wDPSCsqkZNUBxL64SENrxoegv4Drh5jnXNtOSnVpIWLLcxJ+cqsHizT3XD3fYmEKHvcO9gyG8/P+LJgynzcdgHAb+XS9wZCxgghIlEATbXsTicDnh8PGG5SXhxtiYrqssV6KYlyQqqumGxSVis9owHHr5n98YQH1qX4M/owe4w9Bj4Svtmmpcg8WO3q8wyYBz5PDgcq7BB7caYXZEXqUiLlkzbuO7inMC7m+ZJaJrS2FVW0bYwaaqG3SZls4rJ0kIBJNvE8x2EaZCll9Q8IQS2LQlCl+E4IIlz0tigblr2m4QzKbAdC9uRxLsMYQoGkYcX2Hi+owDaOukXBW6qpm1Jq5J1nhGX5TVa19XaFjnfb1ZYQvDDds3EuVutWldxWfDN6oK4LJVr1ms7XrUNWaUawLcBip9ahqGyZQa2o3RPdzzBMlD5YYZh4UpLWZQL8QZ4rNqGpCzZai3V+9ZEq6YhLgtW+c2ATOrQVldaOsBaBenedXXfU2monKyJ67PJ82s2800LWVWyzg12hQLHr9Ob7qosPckYOS6eZV2j9dxUZVOSNxl5nZHWKUWdUzQFRZORNZkyvmhLiqZQmpC6Im1K2lxFnhRlpRZ1XGUxvk8K4jRXeZBS0ZYabY7UOZ6aQmXymcLoF+p81yb8BFERH1JCMxss7eQHBnFVcpruyOqSdZ5S1LWiG7s+jjBJqpJdqa47T1qaCucwtFxsYeJJZayw1wYYeV1dM0dxTYltmsh3ZcwZOuRa2oSWMsyILLcP5bU1nbDWkwlbmFq/aZDVFedZjGtaLPOEvK7U/djxmLnBJzdZeVu971r/kO/CpzbmuPu67DvubIsfujGju74NaOjvuyoU+MP0U0IInXUl1eI5htZ8FyR50Zu7fUgJYWBLE8+xlZmavj9kZUWijeLaFuIyZ1tmZHWp+iEMpbGTqpdQMTV3fz+HT6LBamnakqrN1RdXDHDMEaa42uh3/NeGhkbzXQWOOWJoPcHAZJl/zbr4ltC6R93mN75X4NvcOxwxm7wZ3JflJZttSpIWzKcDrI80uHi9XNtCRMpNrvtQ7/JiD31HAZSy5s9Pz1Xi9WuNXQvkeclmnyLyCjMp8YTB5HDE5GjYU78sS+LeEcAC1UQaTYvrSObjkM/uT/jVZwf845fHWvsjaXH44v6UyZUw5JeLHU9frYiznPkoZDYK8R0L17GAlqxQZh+LbcJqG+M51q0AMcAuyXhxtuHZ6VrroWplLgJIU7lCRqHLw6Mx//jlMQcT5Vh4mxKGgWEqPdejozFpXlJVNWeLPUV5xSpbG7Osdwmnix2jyGduGD8ZYF0tNUVzqesWyxI9uLqr8lyLo1mEYcD3WiuopT3XqihrdnHOPs4ph3dEPUNRBEeapiSFoCwqVos9L58tMaXJ7GCI61n4oQJ1aVJw9nINBkjLJAhd5odDLFuyWcVsVzFlUZPEBVm2wrJMpCUxpSAa+swOIoLQxQ8d6rpmcb57ZzZY3TYkZcEyS4nL4g2DhK4WacK/nb/kh80KR1t8f4rV06qpOU32bPKbs+nqRk3cig/kvX9ICUMZIgSWjSPfHSj8sWUKgdEaOFpjYptKp9S0l9da3bRkVcmuyMmr6r2rmFXbEGtwnFbVtXMlUNNAR0ptyS7fG5Z82xJCLSiMHFc5TF4Bc53GrG6bXivWtK1uHO62LFMQWjYjx1WU3Pe8vmgKtuWGXbmlaivqttZgSk+69X+rtiJvcuIyo65skspgs1c5gQPfYTYOMIXgxfmGk7MNnqsWn0xNAarqSwdX2zJ7KndVKSeyo2mEJYc/C8AyDdE7O3bN2ypP+OP6FEdIlnnCKk859iNGtoclTOKqJC5zRYG1HHxp6YUEtWDRZcjlTU1DS/URE2cDA0fTkzunPAP1fVK27kYfQSK1BsvR+78tM77dnHOabFnmKasiJbQcBpajNXl/WzTPv9fNpRamDeUSWNU0TRdJ0/TOye/dhgZFjnW5SFXWNXGm3JZ/CsAyUIsZtjR7rXfn8J2XKjO2BbZlxo/xgmUeYxrqu3ToRhx6AwaWqxcmPuqUvLc+yQRLfVFrQCAMBylcBJ2QX6dQY9BQUbc5JhaGIbBEgC/nlE1M21bsyxPyek3zFl9/Vzfp3QO0p5y1LUVR4Xs2eVER6tX8uyhLO699qnJtCzk02Sc5UeDo7CU15eme+50dd5wWyLzGigsMTVlxPRtTmmCAaZrIO97XtoXAs7l3MOTJ/SmPj8c8PLoitDbgaDq4FqRrGAbLbUzdNMxGAZ8djwlcG9+zoYUkV06KhqGmXYoWeLsrfp/knJxteHG6VtOrK02klCah7zAdBhzPIh4djQl950at1U8pBWwNTfeMKOuGl2ebN9wrVeYDbOOM89We2TjoJ2cfW1LebKRyV2VbJuNIgeZh6OFYUtNYr4OO3iDjStTAbaufjFgOrlQuUVVVs99mLM53zA4ixtOQaOQTDByapuXFjwvAoKlbKu161AGtulImFvttSrzPyNMSoUWvo0nA9CBiNA2UJfvA5ezlGtMUvAUzAepBk9UVuyInrcq3Pmw6+iBsbvz9X6uaVme5NTXNuw7sJ5Sihpm6uXy/Vucnb1+DCGEoB1fHVBozZQt++bq6bcjqmqQse8vrd1UPyMqcvL4OyAxDCbldU4Mr0/wk06urJTRNsKPCvh6UXDYqAyyr1WRcARjxwYHKH1qq0bYILUdnfb17+3VbkdYp++qSsq8adoktHLWM2gpMQ39mdUlblJDlrHcpy01MUVZqsUNrfU+XO3zXJvAcbZLU9AyONC+VBtWzsW2pTGyahihwr5nw/DWrmyzZptQTLGUpvitzClHTAr5lE1kuY1tlIZ4bagorDEV76iZH3bWO1sY02vjiY5dD1LRLZQZ29KzO1EL1YwrAm9qCXQrVp3UT3hZluuGalpqwaUt4W/w9D+3/D2UYBpapYmu6LNC6UcymrCj1d+7dV6cplPxA+ROoRdq8rNkmOdtETbI/fIf0JM+4NDjpnmtFpemGbUvV1qT6/t7RQS2h7jFFUyOF0ilLPRHuNMzmHUy1PsE3QwVemobKFWjakrrNafD1byVSeBiY1E1GUW+wRIhlSH2SdDYWDVWb0/CmjuGm6pKgy1JlKjVNg2kKAt/BtuSdWJX/NepqsK1tSzzHUtzX8nojWzdq1aCgoclKqAte/XhBsksxtYFBEHlMjkZMDu/OqckwYDTw+Pz+VDvtXXe5EcLQ2VeXF2cXYtu0LZ5jMx+H2Frj09Ji28ppUdmAl+TF2xvUD619kvPyYsvJxYZ9cn0C6jkWB5OQB4cjRgOvp5/cVdmWyXDgcdCB+7c0ZGlWstwkLDcJh9O7scr+VNWZelhSYNtm745ZlDXVFafLbgWprN6cmnz8e6vGo6OEGYahwq8b5QwIaJMKRRfqvvtCGKRJzvnplqpsyNKCLC30RFiZwnS0I4wr7oKm0QNWqeMF3ge+WxTVLK8rqqb56Cbor1Vds9TcomF7vdSKuKHpSgbiE+oahKEekrYwKYzrQL5bkOopT+85wJaWSocWV21z7XmjdFFCT67EJz2mrrqpmaunF2+bTdWNXj2ua2wTTONuF1hE11CZpm7C310GCjxZV4wrDAykkHitT93W2iLbxTVdzFbqHkFNUixL0rQtuzjvWRjD0EMIQznFGWiNsiDJSpysUBQ3PX1xNa088J1bZAveUbUdm6dl7CgN04EX9uYAR96AseOR1zWhZRNaDnldsStzkrKgbBsaVD5bN6Xs8phuo2281N6+/zruFqsDafN5NOVRONIskJapqwwubCHvpBH9e/3yy9RZs4Fj0zatmhJVNXsdPpxfMfN6W0nTxHctBp7D0koAgzQvWWxjLrYxafHukOSr1epeIyuqnqXRfeeuGnFElsfjcMrY8cmqkqxW5lPPk1X//BMYjByfke0xtDwGOubgtnXnAEs5skgFsAyDpq2om4JWKGQqDAtpqAC0qs3I6w2GIbEIgG66ZdK2jQJm7fspHr2Op1K27WlWKoDhqymJeA93/JdUysZSgRRHA6wujLdr25QOq6WsKvLGoE4LqrQk2WWcPVv0fv6ToyG2a98ZwOpO4XDg8eTBjK8ezlVO1ZUShoGQJldZ2aZpqAlc0+C7FvNR+IaDnWtLLGmSFZVKCa9v1/bFacHL840ylEivAyzXsZiPrwAs07xTmqdlKdOLtlWUT2kaN9LpuhvLcpuQ/YQby89RBmAIBTzUCpQyfanqhquB712AdlnXtzKWuf7emgqgpwfCMFQD07TUekpmmgpcScukrpX9umEYZEnBxemGZJ+RpSV5VhIMXMKBi6mz6dq2pamhbWodWi56B0F5xbzmnTrLtu0BVqeL+SVX0/Hn9UPpLsowFBixhant4e9kszeWMIQ28hCY1fU3ammpWjXl+ZCFmi6HJa80OL5yOgyDniL4KakkV6tfUDC7BYV37XdNUdeqyb3jPrcHsdp06X09uYpSkEjj8u4vTQtFUr+8ynrAaEhaFHjqqENN07JNsv41w9DVCzaNCnd1bQa+g2Pn2NIkL6tea+E5FqPII9RGUT9nGZrJU7cNQ9vlV8M5vx7NNUVJ3UcEBusi03Q75RjY2aZX+l5U1Cost24bHCFxpXWrCarR/+fdr7m6/5Ht8nk05Q+z+/3+C95tlPT3+tsrUwhcSxK4NkWpdICK3pezSz9s+iRNge/YDDwHRyqn4rQoWewSFtuENP/wPqijJ2ZFSVlpnXFvxHGpCYu0pjGvK1ZFwipPeJ6seZGsWBcpeaMwxoNgzEN/TOO3iubLLxJgCaTw8eQUgUXRbEnrCyzh45pjLOHjaRpgXL6kbgtCeY/AOqZpC/J6y758TtHssN/jIljXTR+KulonrNaJzkQw+puIKQxm0wGzSdhzsn/JWKtv4IxLwexNOq/OzcVybKK5TWgIbFcJ9btsoHDo4Xh3I0DtrOodRyojhcDBc6036JI3NaDdcZR1w8uLLf/9zyfY0uwTv8uqVqG2yx1106gG+iM+IxWS21DXlzlOaVb0bndd2dLsc7s8x74M2r2jMuimkEKH+So3v/q1IL2yqla/HNoAACAASURBVIkTzT0ufx5Ky4dWb+rB5TRLCIPXH7FqsaN9p17po94fDd47IwDLJBr5HByPaJqGk6cLFudbwoGLYRhslon6O6GE5k3dkucl+12mAZW6IVdljTAFQejghy6mKVicbdmsYkJNEVycqQmY6719itWiRL+XU5Obj10YhqYfvHnu/poVWBa+pelCd7wCfdffpxvfg66hf3P6rFbeG2qtWXnfVdg1ktWNQm2jB47qvvTpPzNltW/oxYS3T7AaPXm7eb/vZj8M/Rz6kKOWhkUoQwQGWZOR1SmWsHGFiyVuyCwzTRAWjaVWtaPAVWCr4/3oT67S+XVSqswd15EEnk0eVio7p26Ug55rE3jq564kAT+11HWn6JulBverPOWbzbmiKOlz2UUodNfVkR+R1hXn2Y6zdM9/rl7xPF6TVhVZXbIvcx6EI0a2R2S5pFXJMk9Y5gnfbi54vt9wlu3wTXWe527A1A2QhsrL+tBq25ayrkmrirJV9NpdmfHdbqE02MYlxcoWJoG0mboqNPlDt6/+F+J9Rry7/En2GWVRURSKgdS2esFZL3R5voMX2IQDj2jkMxiqDMhuMe2tn0nTUJUNVVnx4umCk6cL6qrBCxzCgcvscMjsKKLIK+Jdxn6bst9mxLtUMaKKSj/P9OKHfqZ7ga0X6zwGQ/VzaX710+4TZVkrhkVSsNsk7DYpWVqQZ2X//k2jFiK6/CbHtXB9m2jkEw19XF9RZe9aFtKVNFWo8Dj0yIoSEWc9vW+5S4kzxTwyG/HWZ4AtTSLfYRx6eI5y0VULzQmnqx0Xm5jVLsGxZS9DeOs5q2tW+5TnFxvW+1QtwghNH7ck0hT6LtL2i1FxVbAqErZlSlwV/cJF913Mm4pFHpPXFUsrZmT7jGz/owc0dw+wtJbKNacIw6JoNqT1BZ6cAYbSWZlz9m3JvjphWz4lt1eUzZ6qSUjrC5LqgrLZYYuB1m/dfMHU2nluu8t4frLix+dLPNci8G2atmUf5xRlxW++PCIaeD+L6PVjq+OUdivnryOOzt7c9izGA5/5wCeIPILII08K0jhHWiZucFdObsroIApV7lfoqayvt2UpXTsWTXusqobnZ2tWuxTftfBdm7ZtSbOSOCvYJ7m+iby9qXhXta2a6mV51Qf7ZvrmdLUsaTLwHcYDD9e17rwZ7JqSzo5UBU0L1QRdmcyV5SUQvCu90l+jDA10bgLCHa2keyDd6Xvqq8IALNskGgfUdcPL5ytePVcNQDhwsWzJaqny40zT6ClGZV6R7DOaWlGJhVDAyzQFYeQxPxyyWce8fL4i3mUKYEUum2WsX/92KmmLpihrHcjbDt00DE31MekCLX+O8i0LX6pco7vUFHUY5FPjEMWUUM3p63vfokB+1XbA4z0MCHRuXtO8MdHrgVwPiv861QHxd4GbplXHWLV3p6O7VkZ3nj/MiVQKSWCEWIZFUy5JKhVQG8oBnryhAW8NsJW2se5CwPVioqGn1EB/PxFC3VMV5VzpP9rm0kFSmp2joPjZKIJdXENal1QaoCzzhP9anfL9bqmyhFoULVA6HPkDngwmHPsR59mepm05y3Ys8hhQtOOyqXkQjHgUjjjyIyJbAazn8ZpvNxd8v1vydK9W45u2ZV/mHHoDDv0BA8u5Alg/YP+h3/9S38c2RcY363NO4q0K9m3bXpt36IX8ivkHAyy41Mrvtymvnq84PVlxdrLm/NWaeJcT7zOqUjEgDEPpyh3PYjIbMD2IOHow4eGTGY5nY1lgiHczUJqmpShK0jjnm/94zv/xv31DnhVMD/5f9t7zuW5sy/L8wdvraUS59K9evrIRPd1f+u+fiImJmJ6JmOqqemllKNFdDw8cAPPhHICXEimREpXSq56dISlFkRfuANhr77XXGnL0eMqP//KU8SwgjXNOX63kr5dLTl8tSeOCLCmoqloBLA0vsPEDh9nBkMOHEx48nvDoq5ks7hkf9oQQlSDapKzmMa+eSxC4nEdEm5QkkgrMtagxTQPLNvFDh/E0YDwLefL1Po+/2We6F8pi0CcEWKHnMA491kmOrmmUomaT5CyjlDQvqeuG1mhvfF5IgOUyGfh4ttV3sOptw5nvcrFJWEYZo8BVdkU3708lalZRysvzNas4RdR1T2t21Bwn3VxW05DXFdsqY17EbKucrJZKw4FpM7DcXklzWSTM8wjftPkm3FNm0l8KwMLEMcYM7KdyA5qLodk9SLL1AaH1iLotKOo1eb1ArwzqpkC0GUW9kcIXusPI/gZPAbXroutYlKWQg3Z5iWNLao+oJV0winOyvFKzGpckhfuKDuh0UuOdH5BQiVb3Iug5oa30EOj+H6Vsd0Wog5b5MuZ8GfeKc29WxFukZG9dN1SFoLIraiFFI2TFRgAtTX21mv6hYELXNVzHYhR6hL4jPZZuKargOzYHk1ApQDV9K7lLwotSCiL4rs0gcNkbBbjO3ZdmqwYuo7QgyUvpq3DNsHNRCdZRxsl8S1EJNlF2K5O8u0ZaVJwtYtmduibPE3VDrtbupxjK7gbC67qhEg1VXfd/r3fkjjuVyg4cvWtdplnJ6cVWKiTesC67tX2fNXXt6m8Ypk4QumhAEhdsVklvNGxaBqOxj+vahEOX0TSQIhXqBWk7JrZjyRksZEVydjBkuj8AYLtO5WfZMlkLBx6WZTLZC/FuKlh0AjTv6ZiEls2DYMDM8+VgrVLz+qPDNUxc0+Sb4YSRfX9Ko91z6Y9hSLY7v78RH3BS3/ds/NJIn7dPmz9uG7t/visMzbicA6ta8ibDaV05g2Xc7CG364nYgavda7Frj/BmZfzNf5N/fr7OcFnXrIuMeZ7SAjPHpwE8Q0qtN2q2Kq4KNkWOpsGTcMzQdpk5AQ/8IZsyp2wkXbUD2hPH42Ew4sANewVAXVGnA8vuwdTAdgksR4pUaPL50lXoQQpdTB1fqkJ24wjK0+pxMCIVMuk8SyNEUysRi0up+KZtabRGScsXlLXg0Bu897x016kqpSdhvJG+hK+ezzk9XnF+smZ+tqHIKvKs7C1VNE3DsqWw2HIWsZxHbDdp3+0Zz0LGs7D3P7yuc9kxFqqqZnkR8fzXM5IoZ7vOKAvBcOwz2QtZLxJe/HrOq+dzzl6vuThZK1p5SdXnYUh/RM9meRGxWSXE2wxR1WgahEOfYOBi39JiJktLsrRgvYglsDte8frlgpMXS9bLmDjKyVThua1lkUE3dVzPZjT2GU0DsqQgTQoePJqwfzRisjeQc+32/WoPWAoc7Y9C5psEXdcoy5q8rYizkigr2KQ5TQueY15L07Utk1HgsTcMZKdZ16mqiqxoWMYpLy5W/PvLMw4nAw7HAwLXUkDrUk27rARFJXg533A833Cy3LJNC0TdSAqiazPwXBzbRNc6kZmcTZmR1wINjcC00Rmote8xsJy+qZGKUtomiEuD9w+NewdYumbiGwdMnb8DNAzNxtZDbGMEaDjGmKH9FQ01RRNRNpEEWmJJi0zYLD0gsI4YWE8Y2E8x9esfzl1CqGly3mp/NmA6DdifDShLqRzWNtKMtRuM/xTP3lLU5EVFnBZESUGUSlDXGdsWpeh55EIluaK+TG53E93uzyQteXW+ZpvklNXbXZgukm3G6XlEhMZgEjKcBhRZRRbnBEMPx7UZ7w0++k3cUQRHoYuvBo1vG5Ohx5+e7rM/CYnTkjgrFPiUxzRW1KzQdwg9h+nQYxTcPelr2paskIApzaprwRXAepvx77+dcr6McJUv16d4KVei5vhszTbOlOjD1f1pmvaKKMt9h6TPKmPqWHpTZTudvbK6BHfdr7quqetL4+e6W5NNS9s2FFXNq7M183VCVtx8jj916LqO61kYhsbjr2cMxx5N3WJaBoapUwsJJG3bxPEkFWH/cESelYpyIoVg0JQstu/gBza2I6uDRV4pKojRg1LXsxlPg+t3SHX0zPd0OmZewD/vH/HjdF/R9Ow/RDjhzTB0XSVuLkfh+xOk24QEV514xqcV+pAiHa1SV726JQ2ZOPa0vvec347yeh11sz+m5n4FQd4Xddt11G4+j5qiSJqa8cl8XD4k2rYhrwuiaoutO4gbfCx3Q1PFk5sew+96PH9JlP+srjjJIl4lGwxN47vhHoFlM7E9PFMyNhpaft5c8NP6gmWRktcCU9N5GAyxDYOiFpczkmoWauL4zBwpid51NR+HYwLL4bvBTHWcamwFpjzDwjMtHN3su6/7btB7WA1tV1L9DNlJfxqO8U2LdSn9gn7ZzqnblqfhGNewGKsktFF0q+fRip82FyzyhFS8f26mbeRIQxLl/P7TKb/99YQz1S3aLBPZKcrKnv5md8wdReMu8orlRUQc5azmMeev1vz+0yl/+ssjfvj7R7L45d+eGlqLhjwtWS8TXv5+ga6o4c9/PefiVAK9Ii9lYdm3sVQhX5rU11RVJrtO24zVPCbapmxWCV99d8BX3x/cGmBtljGvXy45/n3Oi9/OOX52QbyVNEXZNWt7oSXD0KlFLc9HVrIUNdEmY7tOOX425/HX+3z/l4d8/f0B42nIeBrea+HYNg0mocfRdMDxfI2hS7uiulFF6zjjZBnRjFsMI7gWYDmWyXTgEechQ9/FMnUqoVPTEKUFPx1fkOYVXz+Y8PXhlNnQJ3SlBVBVy/x5GWXMNzEvL9b8/GrOfJuQl7IgEdg2Q99hNvTxHakDkYiCs3zLuszQgKkTYOlDSdPVTeUjd3m91mXKeabTtA3WDWb2t41PArA8c08pBUrBC12zMTRZ+XWMEZYe0LSCTFyQ1Rek1RmpOJNiF3qAq08IrIfsef+Ea0wwtOuT7cuql4bn2ozHPrNJyN4spCgkdTBN5U1bq4ujX6Hd3b3a1VX4O2pC3bRESU6UFqw2KfNVzGKdsIlzNnEmqWpZSVbIhLaspFlvVxGRXYZWSXe3/de6pPZ93Po8LUjPItZpxXCaEq9DqkI+HCb7Qw4eT9XJ4qNAVgewBoGL797Np2oYuAwClwdFxcU6Yb6Ke9+Djjsf+g4H41ApDH7Yom4aZXQb52RFeWNXaJvkbJOcX17OP2g79xW9IIT4+BmK3e5Tt3aSrCRKc9bbjItVzHydsI0zNnFOnEqwleUVRVWrtVn3PjN1LYF/J8VaNw2NWqe3WZefOgz1wrEdk2Dg8uDRpO+a9XumKE7dNEdTS3l23VBSyBoqgblsjrmhw2g/kGqCKvHu5s7e9azoqGQy2b35eyeOy19m+/z3h18xcTzGrvufR4WrvXwm1qoL+uk2pQwurwEgPfDQDW5DNtYBU3H33xZzaHuKSd/d/cQh6aY783w3nEgdDVPfEX75QqKhpWwKkjrGrwPKpqBqZBK+u5eSIqv34PBmcPWO++4LOm6AvK5Y5Amn6ZaZG/AoGHHghRx4IQPLVc+olnWR8T/bU+JKmkWbui5pfbfoBnVxZFoc+R+nPtuZFXvmiIfBiHme8P8uT/gpmbPn+hx4Aw5cuf9Tx+8ptFVT89PmnG1VUjbvB9B101AWgs0q4dlPp/xf//vPLM63LOcRZS7QDSksFA49gqHsAOmGTlu3JHFGHOWkiWQqXJysOX42xw8d2qZlOAmwbKMHZ128a20IUZNlBZtlwvGzOWlSsrjY8urZnGiT4rg2jmthuza+GjnJU6lCm3V/JgWL8y0XpxviKGOzTDBMnf0HI8Khf+McUrvznl4tYn7/+ZSf//UVv/90yovfzjEMCagc18L1bFzPwnYsbNfst1ukJWlcUJYJF2cb2rZlcS7tEWzHRNd1OaNmfFiee110AOvBdMDQl0XxjrFSippNmnO2inBtk2HgAm8zzxzLwAg9slIwClw825IiNaIlyUt+PVlyPN+yilOSvORoOmQ6kCCrEDJHebXY8PxsxfF8zekqYhllV/ZxFHjsj0NCTxYj8rpinidsq4ypEzBzAqa2z8TxcXRT5Qxtnyu4uiUphaLE+UiGyScRuTA0WykaaWpI10BX1AEJugwcY8LU+TtsY0jVRJR1hKYZ6JqNo48Y2I9xjSmm5vU/+2boutYnSnlRsd6kVFXNNsoQomGxSiiKivN5RF03DAYuoe/g+1KgwXPvLgCRqVmhTZSz2CQs1olM2GMJspK0IMlK8rIiL6reELESl52rjrrV7AC13bmV7uu3eZn7oUfo2IS6wXAaMpyGtEr8ww9dRnuD7sJ8VGiaTGpty8A07ma02VEn11HGq/M1z09WxJmk8emaVIYaBg5CSOPI0HewP8DXqVWUybISCPF2ZftLi+5adwO9HxN5KYjTgm0s1+VyB+THaUHcrUvlH3MVUDVXqINS8bFbl1xZo21zf6pz9xmappEJwabMSapSdt5osXXpYaRr0s9F1DVDx2XoSL+sqCxIRdV7YWzLgmWeUtU1e17AzPNxDUvOKr0TYGlKSt7oKTzXRd22FHVNLgTCaj668PElhZx9UnLnTcOn7GHVbUvZNMoo+WohRYpE6NLT5BbzZZomgUpHq7rSwWpR/H2pDvlHPFOaVhpFd0IJN21SqvzpSuXvy1lEstigY2gmsYh4kT5jXlxcpRACnuEztiYMrC/bouIu4egmM8cnFRVZXfHrds5JumVse3imhVAiGPMi4dAbMHMDhtb9UXQ/NizdYOL4PA5GZKLkRbTiLI0Y2S6h5UgxmLZhmaeMbI9Db8DkFvNX23XK6fGKF7+e8+K3CxbnW8pC4Lo2s/0hh48mHD6c9HOvlmWgabJDUmQleV4qMLNlvYxJopwsKXj5+wW2Y5FsM7778QjXs2UB/T33Q1035FkFbUrTNKRxgWWbPPpqhuc/ZLI3YLoXym6abUpQWdYUecn8bMviPGJ+vmVxvqXIK9aLmLZtefh0xnqZEA49CYquGXUQoiFWQhbPfz3n97+e8vrlkiKvCAceh48mPHg0YTQNCAceXuBIGxJTl92zQhBHGYuLiMX5ltU8YnkRs10n/PbTSV9IHE2kl6NpXRrxfkxYpsEwcDmoQiahR+BYfSG7Rcq2R1lBVoob1Vs7RWDXNjkch/zp8T6v5hvO1nE/w1UiOFvFNC28XkT4joVjmf0YzibJWMYZ6zgjza92T33H5uFsyLdHM6aDQM7BY/SziFNbCrL4ho2h6VTKI6toBL5h45kWvmlx4A6ompqB5fIxL+hP4oNlaM7O3FSHC7ud1NHQcc0Jlh4wsr+loUYaE0uRDA0DQ3MwdBs52n59ot2JJ+iaRlEI1tuMzTaTQ+2trFLUdcvZxZbFKmY88jmYDZhNQzR8XMe6M70gzSsuVjEvz9b8+mLOry/nbCJ5sQtFS9yl/vWAqeeKd3xz9f/yD3b+dqdk2x+4HAYe+0Of4TRkNA37h4th6li2dS8JXC+V3amz3OGFLuqGrChZxxmvLjb89cU5SVaQZBWaJr1NRqGHbZqMB34vi23ecN1vik5oQHoz/Q0ALBQ99B4q40UpWG4SXp1v+PXFBb+8nLNcJ6zjnDQvr8wCXp0HfGNdAuxSodoPW5efI/JacJElnKWxBFNtg29ajBwXS9cpaylp3WrgWbJKtcgzlnmKa5q4hsVJsuW3zZKsFvww3sPQdUY2WIaO+Q4dbE1Tct7Ku+imAkTTtpS1kMlz+7cjbHKb6JQUJcD6tN2eXYny+k2KoCZlzi2jk8R+92d1QMVVNgC73y49smoKRcH6IxzO2lbKxmfi3ZL/RgewlDnmlxOaAlgGsYhZlyvQwNEd7B2PrIk9w9Kt/1QAyzVMZm5A2TT8tDnn1+1CSsgrefWqqSmbmj034MAb8CQY3esM5MeGpetMbA8RjPjr+oIX8Yq8FniGhW0YlE1N1dSMbY99L+ShP2Ti3Dxf18V2nfLs5zP++q/HvPj1nPnZFsez8AOHo8dT/vF/+4Y///OTXrm1K662bSvzONHw+0+n/PLvr3n28xkvn81ZLWKOn82Jtxl1JRjvhRw+miihk/cDrCIrpfBRUrA0Yp58u8/T7w74+odDHn+9x6OvZlKlUNdkl6NpKHKhQOI5v/z7CXlWkkQZ62VCvM05/37NehEz3Rug6dq1AKsWNetVwunLJc9/OeO3v55wfrLBsgzCocs3PxzyD//lGx48nvQgqeuGNWp2erNMePbrGc9+PuPX/zgh2mRsVillcUq0zhhNAr7+/hDLNnrlwY8NyzQYBXLueRx6BK7NNitokTLnHcDKy0qa/F4T3dyfZ5scTgb88GiPumnYqrl50TTUbcvpOmIRpZgqv9c1re+WiY5Z80ZxTdMgcC2OpkO+O5oxG/rSX681CU0HWzeYOAEzO1DPJ420LomqnEgUtLaUZ/cMG8uVoNq8hf/fu+ITqAhKMPW2thNXXrg6FrpuoWnhB29L1zRMU8exTcLAYTryZfK4I2ahaXJew9A1BqGL79s4tnmrBdftr6gbNlHGNs55dbHh+GzF8dmal6drjk/XCixcpaR1tKJOrts05DZNQ+vVyHbpit0N1EmyCyE5qVGSv5OSZZgGjifb2XVVs10lynTVwHLk4Kel3c9llh1Dtf93+Lk4KziZbzhbyE7i/jhkMvCUt4lUp3Esk1IIXp6uKCvBw/0Rrn3HDmMn+qFobjedM02jlxlXX/ksTQTHMnsJ99uoMXaxKzyxUZS/s/mWl2drjs9W/brcJjlJVlBWl4m8pMJpmIaGqdR25LpUD7LeFkBDivBcXZ9t06p1WSDqWnW0Pl/sUh9E2xBXJduywDNNQkuanW/LgkbJcFdNw8hx+wQ9rgrWRc5UkzMGhqZTK6Cua2C/x+y1C13TcAyTge3gmTdLn8ttlmyKnInjfoG9wA+PzrcnEWU/R3Lfn991Usu6pqhrRaO7Wi01lDFwYNrYhvHea2doOr6aS3HN5Ao4blt6sNOZvlZN3UvEf4po2pZcCKKiIBdvn0dLl9051zR7j6oviSKoazq+ETC190jrhKLO1TyDdcWE2NHdezdH/txh6QZDy6X2WhJRqAKAnOXQNE2qPjY1h96AB76k3wXWx/vt3FeYmqz2A0RBQdEIMlFh6TqGpqv9b5i6Pg+8AYdeeGMHrm3bfhZ2s0x4/WLBy98vWC4iykKwdzjkyTf7fPt3R3z9wyGPvtrD9SQtrsvPLinvkpWjqXdUkVdsljFVKVhcRJy+XnP2asXBgxGDkZRwf6einyp8Q4NrWXihy/7hkKff7vPNnx5wcDTi4Gj81o+JSr7zLNskzyrmZxvWi5haSJn1eCvB1naTYjkmwU562723q1KwONvy219PeP1iwXqZQNsy3R9w9GTKN396wNPv9tl/MCIYeHi+feUz2rbFDxzQkPuRlizPIxYXW/K8YrWIuTjbcHq8QtM0pvtXqZMfGrom/Vk91+JwEvL9oz1mw4CmbfEdi2+PZjycDRkHHtYNPnTd+9o2ZQfr7x4fUCqp96qWpsGFYtfs5i3vi3HgMgpcvj6c8nhvxMEoJHTlDJZkA1SUqli1KyxV1EKqBhYJpqYxtFwcw8LWjHuhVX4G3fJLAHQdCLtLSNlWA8+z2ZuFWJZxqV7WXioO2bYpdfUdE8eWbu+2dXtz2aIUsjPw8oJnr5e8OFlxvowU9aqUMytv0lR0+QL2HAvfsyUl0bFwHRPLkB5QpnFpZGrol95Chi6d6p+fLHuBjPamjow63qoUbBYxaZzLtrZrMRgHzI7GuP79SLXDjrngHRbfJs757dWC+TphbxTwzz8cSblRw6BFdhqLSjBfJ/xyPCcvK4aBy3R4e+lX2JldELWU8L0hv5OdOOXD1R/PnTZ1L+E5Nr4r1+NtqExvRt00nM0jfunX5ZLXF9ueElipTt5udNL/jiXXpe9auGptWuqamKYEXJ0kst6vTTnL+PxkyfPXS9K8RSDpCF9C1Mrot2wEh3bIk8GIdZHzOt6yLnK6VnFeCymQ0LZkQpCIkj3NZ2i7pG7FxPFwDZOx4zFx3FtRsHRNwzMtxo6Lb9k3fn9Z12yLglWRcSDCL77Lepdo2paiFkRlSV5Xb3WWPjZaJIiuanmdO8DzJgAxdQmYBrZUU3vfi9JUSmwTV9K4dsFKo+ZNGrVWcrVNWzf4VF62dStV2tZFRlZVVwCkBhI8WjaBZWPpxq19qv6oMDSdgTlEczWqpkS0gpYWfWfeCsA1PDzjbs/4Lz1M3SCwbExdxzVMHvkjdr29Ok8e37TwTBvfsHDN+/GqvI8wdA3fkoqBpq7zwBsg2kbZIWi9yIVrmPimpFR5xvX737ZQVYIiq1gvEs5eS1GLPJVKhXuHI378l6d8/+eHHDwcE4QOhvn2+IGuaWiGznRv0Ku/btcpF2cbskTOJK2XMafHSyZ7IQ+fzggGLrfRJzAMndE05PDhmKffH/DV94c8fDK9US1WN3QmeyGOZ7Fexrz87ZyLkzVpWiJEQZ5VrJex9FEcXtPZa6EsBBcna376n6/k+chKgoHLk2/3+cs/P+XJN/vsHUpwZdlvH4SmaTiuxcHRGM93WF3EnB6vKIuKeJtTFYLVPObl7xeYtoEfOgSD++mSaoBlGDycjfiXbx9SqbGOwLHZH4fsj0Jp4fMeQGeZOgfjEM+xpI9tnFJWgvk2uZVh8W7omsb+OOT7oxk/Pj3k8d6IcehimnKeNq8rVqUUkxnb/hWl37yuWBQJr9K1tB1wh0rw4n6eqfcOsHbr2W0rqNuKphW0raBB0CrPDkOzsPQAQ3d7CqFUERS0dC8UTc5lIfm4b4VSADNNHd+zu40CksfeKbONhj6jodcb29425DyPnB16cbLiX3854fnrJcdnazZxfrkbCsj1xrKmBHC2aRL6Uno8DBxlhGhhWya2acqE1lTeHaq7Zeg6hmGwiTKyouL1xaZXsbouX2nallrUlC2kcU60jNXAqEktGsKRfy8y7Wjdcapfd/jRNC85W0QstymP90d893ifwJWgs21bsqJiHWWso4zTxRbbMu7k6L0bV6TGb+gP2JbJeCDNko3OqPAzpCiObeI6Fnvj4E7zbo0ZdAAAIABJREFUgE3TUlbSYPvV+Zp//+2MX48vOD6V6n5dXK5LoweU3br0PbkuB4GD78l16VxZl5dAqxOUMHWdUtSUouZ8EUlKbHPzef6jo6OnFbXA1HWGtkNaVRS1IK4KRTXQyYWsyuaikrMSQgAysQgsm8CUzxLXNHEMSb96X892F2AFlo2tEt835eqLumZd5FykKU/C8oucZ/vQaJAgZFvmpFWF2FH4u49qYIvqkFXyuhV1jbjG/8nQdHzLYmQ7cv7uPdfO0nUGtsPM9QneAFiAAuOSq5+UJWlVoVncWKX94ONTa0U0DUlVsszT3gyzC13TcE2TUbfO7jgP+0eEho5n+JiaSdVWiKaiVnTYlk7OXcfSbSztc3Zvbj5vHzppaio1SvkseD91rt/elRnXS6ZBx2iR36OEkZRAVvdc7lklO4fTU8GRHpa7TITusxpFv+s8AbvPs3QD15YFikfBaMfKo90R/Hm/8E/bthR5RbTNWC9jFhcR60UsczZbWmN886cHfP3DA/zQxvXeXguaSjY0NNWZ8qlFw/GzOXvPhlycbqQx7zrl7PWa0TQkHHo8eDS91XnXTZ3R1OfR13s8/mqPB48mzA5upqwahkY49KRv4oMR42lIMHARoiFLCspCHm+8zSjfyGFadU3yrGRxEfHy9wuiTUZVCnxfUiX/9A+PmcxCRpPgWnph3wFypPBFOPQ4eDhmuj9gs0rIs4o8L9msEk5eLhlPA44e3+5cvC+6bRu6zsEolLOWukagCsXyT/tWz3pD1xmHHqPAYxVlLKOESjSYhtF7Eko14waZYlx6MXSUQcOQKpi2afD1wYQfnx7yw6M9HkwGBK5N1dQUTcW2ylkUCYkoGdsesyLo74N1mbEqUzZlSqaetZ1w3n3EJ+xgtRT1VikFzsnrJblYUrcldVsSmIdM3R8Z2d9IuqBmIZqEvF4j2kzNXunYxhBHH0nhjDe30LTSV0lJc6/WCW2jXsRVTZpKA9dvnu7he/adAVaclZwvI45P17J79WrJfJ1QlFcRtmUaOJbJZORzOBtwMB0oQ15PdghU18yyZIJr6LoCUvol7U6Tg5kdbfBiGfP8ZIlp6FTvqFCKsiaNMhzHZjAJ2Hs4IYvkDU6nQPWZB+m7G9E0DBzbIvBsbEvR4loNxzLV18z+nHzY7mrqRaG9U555PPT48ZtDvnk0w3UsXOftpOqPCGmMqTMdBhzObj+HkJcV54uY0/mWn19c8PurBWeL6K2BT9MwsC2TYejwYDbkcDZgFHoMQ5fAs9Wxmwp4mT2I0ne6qbp+lcqa5RUvT1fYlvkR1+nTRIs0Xs2FnMWyDYO4lIIXjikTbV3TSKqS42hDXgvWRd7P1mgKEJVNTSoq4rJko+iGrmG9U+SiS3w1DQaqu+AaJmUjBR+6yETFeZrwKt7y3XjKF9L8u5do2pZUlCyylKiUHiL3+ehp2pa4LLnIEtZFTllfX+m0dJ2B6kj51vvv7c4H6MAPCW3nRupfWlWcZwnnWcIBAf49U7u6DnxeS7GWsywhKosr60fTNALLZs/zGavu6pcYTVtTtRXbas26WpGKVIGWlsAMCc2Q0BxiaAYO98WwuF0oXbV3kzDaHa/KPyDaFspSkBdV79dnGDqOZWDbZi+QFScF82XMapsyGngMQ4/At/HVO7VV+50XFVleUTfNZYFNFdnalt4ndL6MmS9jPNdmOJBqv55rXRasAVHX5EoFuaOTd0W4d4kntE1LEhXMTzdsVgllXklLjMDB8x2GY1+KOPj2nQStbMdkujfg0Vd7VKXs1hR5JeXbT9Y8ejq79XUzDJ3h2OfhkynT/QHOHQqdpmXgqe5QlpagqRGFUlCVb1vrCFGTpxXRRqkixgVCGdi7nsVw7DPdH+D5zq1FKTSkL9doEhAOPTarlCwtyNOClfLREneg2t0mdE0jcG0gRNOkcl+3Hu4amgYHk5B//OaI6cDvva02ccY6ycmUR6qoGzVCA65tSaVC32U68JkNfL4+nPDV4YSDcUjg2dRtw7bKWZUpr5IVx8mKbZUjmppNle9QBCtSURKarnzH3zMj4JNSBMtmw7Z6zrr8lW35jE35DNFkiDZj5vwZQ3cJzAeYOuiYVE1KKs4p6hWaZqJjENBg6T4Gb7/MmraVN39ZsdlmnF9E/QxWkpYsVwlZVuF7No+PJnD7ghIASVby6mzDX5+d88vLOb+/XlBcc+NYpoHv2TyYDfnx20N++OqAB3sDHsyGPf2r89zpLt3uw13j7ZaQa1uMB16f8MofePuhISpBWtZ4New9nPDou0POj5dUv51dgiv4rCBLU52Dbl4ucO3LmSNNdnKatlXnSoGjD9jXfu5NnbObXqCTgceP3z7gv/7D015C/vOocMnj1DXtTr5ieSE4mW/567Mzfnkx5/dXCzZx9hZVzzR1fNdibxzyp68P+PHbQw5nQx7MBtLkb0eW+rp12X9152tRUvDvv50qgKx/UTLJrer0dgCrqIUcDKZVxpqybJOIiizeUNS1nM9CCo1oKInpWna44qpgW+ZouJIy8w5Ks46Ga5g4hkloOxJgmSZNJWmUXUiAFRPaNtsi/+xy9/cZTdOSVHJQOapKKkXfu68XVtO2RFXBeRazyjPK+vrEwdR1Qtth6nr413Sk3gzLMBg5Lod+wMB2bnwWpKLiIk24SBPCTzA307SSHljUgk2Rc57GVE1zBWDpSJPMfS9g5LjY+mdg+b8nWlpqakRTsak2vM6OWVVLJfHdsOccsGfvo2vGOw2IP0VoO7/eFd1AfSfh/KmjpaUoBFFcyHtG17BNEy2wJcBSnonrbcbzV0tevl7y8HDM0eGItg17ENV1wrKiYr3NEHWtFJNtPMAw5PdUopZem6drfnl2wWTkc3Qou1W6rl0FWKIhSQvSrJQGtpacw3mfeELTtKRxzvxsy3qZUBYCXdfxfIfJNGA08RkMPVzfvpPYmG1L0/dHX81YLWJMay59shYRwYlLHGU3+oa+GRJgBRx9AMCyLAM/cAiGHtt1ioZiPRXSL6t5g55fVTVpkrPdpMRRRpoUtI30bnQ9uwdYXbH9VqFpOAqchSNJKWyaliwtWS9ikiijuiPl7habJFDjBXDZbf3QZ/zBOGQ28PnqYMKLizUvL9Yczze8mm+kUmAhrWQM1YwY+A7j0ONwPOj9sqahx2Tg41hKMbit2VYZJ+ma43TNq3TNokjYlBkn2abfb9ewGFkeUyfANSwM7TbGHreP+6cItjVFvaFstqyL31iXvxBXJzStwDOmpFxQig2iLRQdcPdGkA9g0eZUIqFqYjTNwDNmWPrbBp+6JluEnmszGQf9EH5Ly2abUZaX7e8W+iTqfW3trgoUJTnHZyt+fXnBfBVTVnV/42pKYMM2Db5+OOWrhzO+ejjh6YMJDw9GPQWtEzC4ayJqGDJ5bVFVtJvmiUwdx7SwHJM0yjl9PidaJYiqxnZ3FAQ/Yx7ciZG0bctik/Dz8UVPRQP5sE9zSRPU9UvBhTuHJrtCtmVKc773fIa8hgaeczdfr88VHYUkyUpOLjb8/PyCs8WWvKgu1yVgmgamofP4YMxXj6Z8dTTl6dGEJw8mjAceo9DDsc1+HusucUVB8h00zM8Rndy2a1pMHI8DP7gy0KqpqnWnmlipma0W2Pd8TEUV+2o4YVb5HPrhrWlYva8eMLQdHoYD5lnCaRqTZ5cvuKppiKqCRZZymsa8ijfMPJ/AsnGMLy9ZvktIxb0GEGyLnIssYZGlhLZ9L4P8ddOyyjN+36w4S2NycTVx6J7trmkycS47Uu/vYOkMbJs9L2Dqeoxsl7SqpBriDj1vU+Q8j9aMHZep690P9Xonkqpkkae8jDY9gKzfoJjqmsbEdXk6GHPoh3jml7dmmrYhETGLYk7VVoztKaE56LRIAY28yYlFxMAc3Pt5fFdo2qXJ9rvWhWhqOXMnxI2KaPcRVVX33aZtnLGNcgmubBPfa3Ecswd7daMKykVFmkkLmMtz1/adqY72J0RNmpWstxl13XB0MOLoYIhh6DTKc7MsBVlW4ns2Tb073iHfM2kqfTzTXFp8dFYe46HH/nTAMNR6psOb165tW4qiIo4ysqRACJmLua7FYOzj+g6Gpd/5HWSYOn7gMJwEvSx7UdSkcUG0SSny6tYdrG6eaTDyZOfIvH0eoOlaL59++U68pAK+uQ+iqkmTkmSbU+aiF+/QhMZqEfNv/8+LXSbcraJpWl6/WPDqxYL56YYsLXvlxaKopFnxPa/fD5nDv+4zujBUUTz0HA4nIaahMwpcHkwGJHkpfWPV2tE1Dc+RdMRR4Erv1FEoZ9ktoy9U641GYDrsuSFZLedYD6ucse0zseXcp4YUsQpNh4HlMnV8qRp4j8+ge386N60grxdsyxesy59ZF79QNhGuMWNgf0VT1hT1+oaflheuaSpScUZUHeOaU8b2d9d+t67rWJa8uS3TYDz0+nxvvozJ84qyrHrj2ttyK7uZJwmw1vx2vCBOi36mS277ktr27ZN9/ts/fsWTB2OGgUvoOdIv6hZJ/rtCVqMuE8LrwrRM/MDFMU2idcL8ZNUDMsezew7z5wxNlx2apmk5X8aUoiZ05exP9yCPs0ICLDUzpH+A6ENHq7DVjXbTtW6UEEYnq//lQIR3R6s8qpK85ORiy0/Pz6WYhdhRCdQ0LEuCxqcPp/zXv/+K75/uMwxdhoH0F7Osu6kWvr0jl/LuX1IDppPb9k2LfS/gm+FUqcjB7tBql+h1inRAP5g+tj2skUHV1ni9/5V+J8W4ge3wOByxyDISUTHP0v7fqqYmLlsWecpJEvE8WtNA78P0txzd/FDTtmzLgrMk5tyP0bT7UUqr24ZFnvL7ZsVpEpGKq5RYaTCs4ZkmE9dTANnCeJ/IhSaBNcDU9Zi6HlFZEFEgxA7AKnOebdcMbYdvRpN7JwVEZcHLaMPvmxXLPJPg6o0bzNB1Jo7HN6MxD4IQ7wsSSOiiaWuiastZcUJghBw6DwjMsL8Dz4pTzvJTYiJKW84h/lFk484j7Z1FPKUcmYqKvBbXzvndV1SiluMNm5QolqrBtmUQ+LKTKnxH0RUVyKpbhJBKuU3TXM5oqWJsXTcUlVBCTw1pXnI+j1huUnRNYzYJ8HS97/aLuqFUHp3dTHt3WuI452wekWZlb38SxdLz8+hghGOZUhzphvdJ27aUhSCJcvKspBYNuiHpcIOhh7ejFniXkJ9hMxh6OK6FpmvUlZyBirc5ZSFu/WLSNA3HMQlCD9e7W6G1UzTUd8B6Ryu9riguRE2WFiRx3s9ntU2LaGvm51v+7//jV379j5Nbb7+LLCnI0kIZIFdSTVnITpqoblZT/tLCMg2mA5/AdXgwGVBUcg3v6g/0BRJFU3UtKWBnquvQha7pjCwP17BwDIuh5ZI3QhoM20FHHkJHV3OT0i/T/IC8813xSQBWJhZsy99JxQV1W2FqPoF5SGg/oWoi4ur42p/VNB1dk6CgbCJi8YqiXtO0NwsedDX0Ts7z8rM0HMciDJQr+B2e313yvYlzFuuE+TqWifjOOrVMnVHosjcNeXo04fsnexztD6Uy4Ed0Qy4luGXy1xsS3/D9uq5jKtn5YlWyOt9iWga2a/VVlM9N4/Jsi9ko6GU3t3EuRRrKqhe5KEqBZRocTEKmwwDnA2RFNQ1sy8B3bdkqvuGii7ohyyuStGQUir8ZJTdRN+RlRRTnLLcJF8tIVTV3gL8hW+izccCTB2O+e7LHt49n/QPpQ6Nfl7R99bNuvyxwaukGA9uhbGpmrs/M9XuAtXsP7ApPvPlvnik7IN2/wd2r6iPb4elwzLrIOc/iK2IXTdtStjVRWfAq3vBviwtJj9UNTE2XEtyfSDyhKxyJtpE+Ufr9CyS0SFGIVZHxPFpLGpthMHV9aZnB3bv50oeqZpVnnKUxL6J1TwHdDccw8EyLkeMxdjxGjiM7mO/ZnqHrGOg0VsueG/AoHJKKiipulACKjKQqOUsijh2X10nEeRrjmxa+Zb9zPu9d0fu6tA0XWcJvmyW/rpcs8/RKYtQVD0I1f/UoGLLn+v1a/ZKioaVoCmIR4epSKXBqz1QHWWddrajakrzREc390pfeF4amYRsymbJuoDi3tKSiYpVnbIqcQ//DrWTeF7vv+aIUpGlJaeq0rWSxDEJ5fnSdfr64q5mapiEVkRW1vm1aykqQqK5TXlQkacFinXB2EfHkaELdzbIoel/XjTDVvNeuhU2aV8xXMWlaohvSWzSKczbblEHgUJQCUddqXuj6nEdUtSp0y2KmrmmYtonr271H011D1zWsnc/QNE0CwFKQZ6Xs2rTc6r2uaSiKnjQF1u+Uu3XdO111czqQBbyNr2jqhjKvyNMSIWo5I6+K50VWcXG6YXmxvcP23w7D0LBtyWgyLQP9HYXmLy2kcrHNfYhey5loCxerZ4FVTc2eG7LnhH/YOfkEKoKCol6xrZ6joTOyvsY19xhYjwmsI5LqBEO7QQJTKQuauo+k8ESINt9RFbwanaJOkhbMFzEXy/jSu0rIG24QuriKAnabk9q2kOUV6yjtlfw6kLMbjm1xOBvw/dN9jvYG+J794dS2a/ahaWSlqqxUl+WGh0W3eHbZWk3dUOWCqqhoxKervt02xgOP75/sMxsFREnOVnUDO18Lz7EY+C4D32EQuEyHHsMPuMt0TcO1LYahHNS9qRpV1TVxKjtmkzdUFr/kyEtJo1xFKanyXXuz+28ZBnuTkO+e7PHoYMTAd+S6vIcZs1bRH0SjvMbElyPRDtLM80DR+iauh/EOEY53nY2PPVNjx+Ob4YS4LPhts8TWDWWgeAlIi1rwYruRsxVK9lvXNEaOy+ieAVajQHHZ1CRVSVJVDGyboe0oSdr7j2WW8R/LC0W7tHkUjnrweNfzmwnBPEt4EW14GW04SSJWRU7xxgxWaDkc+AFHwYCh49xZwtzQNPb9gD9P9yWVsyxZFVn/74Wo2VBwksT8tJozdly+Gox5Ohxj6h/WoWvalkRUxKp79R/LC35aza90PQFs3WBoOxz6Ift+yJ4fMHDkbOCXHA01VVOS1zmGJtWARSuom5pW++PfTVLhz1TU3+sLry2oAsiWfT/gcTj6ZPtjmQbDQCopl5XsZpVVTZNIleLJSMpKG4aBa9OLMjmOSeDbDAcegSdFIpqmJcvlPHqcFqRpSRQXZLkUCujyCF3XsFX3yXWkAJfn2QxCqSprW5KWWKhiXpLK2SvDkIDCc6WXKJr2zuJvl8fUyii4bdsrys+y43D3p62maVIpWX1GNxrSID23mubmfOmaD5M+qWYHRu68O7eOLqcToqaplcKjoldajonnObjex3ekdUPHD12C0Lkz7fE/Y4imIVNG8VVzv4If74tP0MGqyesV2/IFA/sJA/spE+cHAvMIz9xjkf/rtYqAIM2HLd3H1OVDpWpi6qa4EWA1ikMcxQWvzzb8/mLe0/hcx2I09BiPfDzXvrUZY0tLVkje8ibOJO/4miTSsUwOZwN+eLrP4WxI4NqY95AY9VSApkHUUhJb1NdLtKsdlgCr6R5ees/BFWV9hdb4uWIUugwDl3Q64PXFhtfzDZHyatI1jUEgFReP9oY83BvdyaNsN3Rdw7FNhkoJ6aZOoqiaHmB1qk1/C1GUUi1zvZWDn9etS9PU2RsHfP9kj4f7I8LA+ajO1W70cwCi2VmXX87J8wyTAy9AOB6OMvu9rqjyrkLLfVS2Ro40G46rgj3PxzVMCoR6qcrzVdY1L6MNp0mEqetMXY/QkrYBoWVfFR655XbfnGbtviANlqUy4jLPWBU5DQGeaXGNzcq9xLJIKVfSkPfJYERalbid4MQ1RuXded9dT13PNKlKTpKY3zcrBbBikqp8a5sD2+FhMJQAy3bu3AnUNZ19TwKsbVnwPFqjRZfntWxqyrLmNI34ebXA0U35M37Qi6hcd62uO7bu+ETTEJUFF1nCi2jNX5dzfl4vrghbANiGwdj1OApCDvyAPc9naP+x6nu3DVnLl/81bUPZlBRNjq4ZGJqJaARN29BJSPyRFXZDSaiHlo1jXALwK/dOC9tCAqwHwYCkkhS5N6/vtd2vO1DTQHahwsDBNA3W2xRd18hyQZY3UtK7kJSvzpfQU+DKtk181yYMHDzPRkMWbbK8YhNlxElBlpXESUGey1mczhuyk2OvXKkia9smnmtJKxnP6edUy1IWr+O0xGuafm7Xc6Xir66xM8JwfchC6iXo0VCgwni3ENW7z13XzbvaAWualqaWRb+OpnebtdXNUt22CP+h0TYtdV1L2p66vzVNbtt1LYZjj8H4433hOiERz7cJQudOCo3/GUO00mi4qMXfPsCSsw0Vos1o2wZTczF1H127LTK/nJRo24ZLEuDbYRg6tm0yCB01vKn1wha2ZTAaeoyGHoPQvRO3tlZUrFI9lK7ftnzQjAYenmPdS4cAJD0xy0s2UU5eCNUhuPkJJqqaLM5xbGksPDkY9WfQG7iE47fFQf7oELXseGySnLNlxLOTJXEq5650TSP0HUahJz0VPJuBL2eF7vpg0DStpxYGnvQdc2wTUcvKVhd5WbHYJJzONzw6HP3NcJQ7Gkk3O3ZdaJqG68gunu/aH0VX3Y1KyOHqdZRJ+d/6yxK4gI5GZWBomhxW/Wz7oWPpMHV8mawXBc+2K55t1/3ckKTSNdDAcbTl/zw75iJLeBQOeRQOGTouQ9vBNy3lx2ViaFpv1Np1rmtFMSprWZ0rlA9YLgSpqEirkqgqicqCTMhiQkPLX6YHjG33Xmajrouqbki1ipMk4n+cv6aqax6GQx4GA8aux8Cy8Syrl87vogMdoqlZFTmrPONFtOan1ZyfVwteRpu3XpKdL8qhH/DjdJ8fxjMmd/Ag6kLTJDh+1A75ejjhONqwLaSS5KbI+9WeCcHrRFJ5RNsQlwUPwyEz12fiunjqml23Ait1bHFVsikKFnnKi+2a5+oY53naz7HtHtvU9fjzdJ9/2jvk6WD8RXeudM1gaI146D2WM7Z1TJZlffJaNiUzZ0ZoDvCMP/b9pCOplq5hMrQd9twAHU1SQntQK9UqXycRo/WCmSvX0szz2fP83oT3pudLN7LQUT+hm/1SPpc7672uGzJF5StK0c9ZFUpxT4j6ms+Gpm5ZbzOOX6+YTQKGAw80pVSXlYq+17wje1KfpwBSnBScnG1ompZh6DIIXQLfZn82wLIyOatV1T2lWs6/mzjWzVLtGqhOk7Ej2iX3vRbNjd6e7wt5/KoTtJOfdcBN0zvPry+LGqd1XmM7M+aGqeO4FrODId/9+JBvfnjw8dvRNCzbwLJNHjyeXm94/L9QFHXNpszI64p999PRfa+LT2I0XLcVosloaTB0B0sP7gCweiZr/99NoRs6jialG01DZzT0ev6xof4+HHg49rv9Gt44AIS4TGRv6gAZuqwmjQZeL1l6H1FWgigp+u5ZJyZwU4hKkFUNng+TgxGHT2c9j9gwdCzn8w9BC/US2cYZp8uIZycrkqwgyUrp6+LZjEOP0LPZGwVYhnwA3XVx6poUHrFMg3AHYFGINwCWYLFOCD2HKMlvLen6uWMXYIkbAJauabiOyTD0etrqfYSoG+K0ZL1NSfNSVSTv5aPvLXRNwzZ02vbz8s4NTUM3DCaux4/T/b6TdpbGEuSo75PgqOY43rAqMn7brHg6GPF0MOLxYMSjcCT9jmyXgW1j6UbflenAVdXUVLU0pk1ESVSWPSCYZylz5dt0kSbkdc3Idhgp8Pbd+H4MKK+Lqqmpq4aTJEK0Dcfxlr+fHfD30wOeDse0fohlyLmzXYDVqGPKFYj5fbPir6s5/7Y459f1gqSqrqx9TZ1vUzc48EP+rADW2L17UqGjMbQlQFrlGa/iKcs842UE27LouxO5qHgVRyzzTMnGJ3w/mvKnyYyv2wkT15Ozf9d0tITqJM6zlBfRmmebNf+xuuA/lhcs84xtWVyhknazV1PX58fJPv/twWP2vQD7CwZYhgJYhm6yLpcsyyWJiGlpaNqGsT1hau8xssb45sdX7O8SUhTCwDVNhrbLnudTNTVl0/QAq0Ve70xU2Eo0p2lbfpjsqe7XpdnpddHNVRVqHV+uUR0HE2OnsyrngUu2cU6hCqqywCskYBJvz7l2DJf1NkXTNETdSDVc1+pnsKqqll3Cdz2kO/ZL2xInOSfnW+q6RTvSFMBy2J8N0HWN5SYly0tpPK9Lc2NbeXTdmPt0dEBL7ztWclZ+hyb3AS+Rtm0lSKsa2bFSnapuruxDVJv/iOiojYZSHezn6BTA+vM/PuG//Pcf7mVb3TlwXOtO0vP/GaNsBNsqIxEl+Q3eiZ8qPgkBX9N0NM0ENJpW0LQVLe9vzTVtSdVElHWkul8ehmZx0wBl94Com5aiVA8WUasWdyvVb+qG4cCTin63zDW7Qf72XeBGozcGli/S+7mhs7zifBVzerElSvP3NgnaVsri1lVNkZWk2wzdkBQ7yzFlpekDBCPuM9Ks5HS55WwRUdcN06FP6Dn9tbJMA9c2KSrB8fkaUTc82Bvg3nG/pYqghgEEvs1sHDAbBay2KcWOF0QlarZJznwds1gnLDcJbSt9uO6LTvcpoqtevku2H43+ZXOfL5lCgdJX59IE8CaA9zmjvw8/t2qmSqx9y+IoGKKjsczTXoJ7U+QkVdlXl1NRkalfZS2IyoJFnnGeJkwcj4FtE1o2pm5g6br6OfmMqlrpk5RVFamoSKqSuCrZlgWrPGOZpyzzjGWe0bQt+34gDYEraUJ6n2FqOkPHYWA75EIQVyVlXXORJsRliY5GVdecZwn7XsBECWDsdmPqtlHy2JWcuYo3PN+uebFdc5GlVwRKABzDZOb5TF2fr4cTHoVDZoqWedfQlACCbUiw9sN4RlELdE3rz21RC+q2JRMVuagwNZ2irsmqirgqOU8Txo7LyPGwFC29M7Bu1M91AOt1EvEq2vBsu+bOAp3xAAAgAElEQVRltJGS4ApcaUhTzT3XZ88P+LvpHt+M5PF55v0V9D5VaJoSDqGhbAryOqVBJsNl7VMZFXVbK9rYH3cs3b1pGwb7XsB349mVe7ALofzHLrKUXzdLRNuwLQuWedqbiJv6pUhE17XqOspCWUAUtSC0bMaOx8R1GTveFXNoXZOFUMeWVMGmaSVdLHOxbYPQd66cHdsymI4DHh2OcV0Lz7WU6q7sKvmezXQcUNdS6GEYSh/QZFKyNw2wrMttG4bOaODx8HAkaWWuVAQ0VKLkufIdaqhuVeDJUQvD0BmPfDnbrr9jbkkDyzLxfAfHtdANXQpxlIIsKSjL6oOKm00tPyNNCyrV9TMMHds1cT0by5KG718ayDIMHcexcD0b0zIATc2oSfppMHCZHQxV9+3L2/+/1ejuy6yuOMu3/BLZGJrsJHfPHl3TCC2H0HTvVUnw3jNv2Qq3sfQADY2qSSnqLabmgT5458+KNiMVc7J6TkuDY4wlvfAGgNUokYs4zjk52/DqdC2HN11LilUUEmB9/WSvfxDd+ig64HTDGm9b5dq9Mzx6HxFnBa/P1zw/WbKOsnd28EBxkZES6IuTNevzrawWmTqDccDh0xlu8Hm5+usk49dXC+armMnQ55++f4hl6piGQcvlTM9qm/LL8Zy8FASezWTw4dXN0HM42huy3CRUomYdXQ6rd/4gq23G+TLm1fmGpm3ZGwdfNMDSdtblu/gpTS3vizeVLz8msqLidLHlt+M5y016I0Xx/4/LsFUXy9J1fiwOqNuWge3w02pOJqorA+ItcoZikaWkouI8TfhlvcRVCX8n2HApB6xA1k5CJ9qm72iVqnre0QXzWmCq+cxPebyPwxHfj2ecpzHPozWrPOvnjH7bSHW80LLxTEvNgBlK6VGmqXXTkKt97qiNUVn0HaTdvdcAz7L4ejjhL7MD/jSZSXClpPU/Jiauy5+ne7imSdsqg+M0YZmnvbJgC0RViUgakrLkdbLtj801Tdlx1A10TXp4ibahrAV5XZOJiqS8BMMdcGvVcZm6pJM9HY75x71D/jI74OlwJO0ENP1a+uGXEhJEFcR1TF5n1K3sxuhIU/O8yVmVCwBcw2PA8A/fR1s3OAoG/OPeIWUtOEtiVmRvvW2TquRYFUWebVf8j3O3p+zu3pN1KylvHTAT6u912/JkMOJPkxnfjqboms7YcfvPN0yDwLOxTAPPdZiMfISiz5mmznjoXzGd9T2bJ0cTxkNPzpWrUQXPtbFMndkkxHUuFYSFeheIumY6DnB3GC2WqXO4P8RTwgqGLkcuQiUw5bkWhq7heTb/H3vv8R1HlqV5/p4wbeYSDkFQRAQjIjO7q6s7u7vO1GrOLGYxf/Ysphez6Ok63aWyMiOoAUK4dtNqFs/cAcoASTCCmRmXhwcUgLmZm7nZ++79xGjgG4qgEEhp9sP33h8QbCYomrDn4vnOzogjT0vWy5QsKd8I471J1XVDmhRslilZZkCasozuKIxcbEd/UkbT5yptKbzAIYiMszVia91ekMYFRWeopqRA/Bnkcv65lInvkJRNzZPNjJfpCltqHKl3dF1LKr4Kx3wdWeh3DXQ+oj4DwJJo6eOqAVIoinpJWp2jhaEK1m1BS0PbNtRtRd3kADSiJqtmxOUJSXUBgK8n2DLspmFvVt20FGVNnBbMFgmnZ0sGfR+tJHXdcDndsN5k9Hsed+8Md4uLn+oMbF1u3id6bLtk9TQzU7NP0fFsR/513bJYpzw/X/LsbM5yk/3kAtlkTClE07Kex8TLFKkESivGRwOi4S+vwdoG485WCUd7PX5zf2Ju0K7JwUqykuUm5X/EGS8ulmgl+eZ4/EmvGfoOR5Mei3XCfJW8ImSum5a6qFjFGWfTNY9PpjsHQruzd1e32MWA6/b7VxQS+YGTph2H+z1ulW3b7vRSRfluiutNa6tfW20yTi9WPDmZ/QqwbliWVFi2wtcW3w7KXbhpUhbEZbEDQNu8o7JpWBY5yyL/LPujhIXoqErqfSD9I8uSigM/5HejCaFt7yhXW5B0Fm84jddAp88QAltpHKl2+1I3DUVdk79HjCy61zJTCJ9vByP+y/4d7vcGDBz3VvLEIsvB71kElm0mF3mKFspMmNpst4jeTh5nWQrm0JDC6G0sqXA6qmB1bfFdNvVb22ZbKpmlFIG28S2Lh/0Rv9+/w3eDMft+8EXmXr1eLS1lW5BWMXmTU7fmXEpk916UbJoKR7mUzbsjWD5nWUqx75tn42Wa8ONyzixPKeua4tq1l9UVWVpxnsZXPysltjQ271tNlWluXDU46mvZWf9uPEFJQz8de/4ORMOVNbXrtAR+FzzbabXeNqXcughOxuEueJ4O5EkpGPQ8Bj3vlaDbdwXKa60YDwPGw8AYRHT7vJ26OrbJGApfZ/KIqy/ve3ZJIXBcm17fN2YLlgFYWVqwWiQkcb5rBEohXgGS76u6bkjijMVsQxrnNHWDZSmC0CUa+Diu/UVOf7Sl8AOHsOfhdBlgZVFTNJXJsYoL0jjHdiwcRyBuKmv5wuoq0mVLQd39z88mK9hOAGX3vPO0hSUVqzJjk2a40sJTFrpjTzhSM3ICw+q4xR77rQMsKSx8NWFof0/ZbFiXz8jqGXk9J6/nxNUpdZtTtxlpdc6y+LEDXDXr8jnL4ocumHjIyPktvj58p637VpNSVTWuo9kbhYyHIZNxSFFWnVGF6dxuMwd+8nMnzBg+8Bw85z1OdHXNOs44n20IfZfJ8OMXnHVjBKvzdcKTkxnPTue8vFyziX96oaW0wnFtPARlVpHqfBfJ8KU4vG2dg7SSOLbG967lVLXmRm6yqxR6mwr/ia/ZCxzuHQ6J04KT8yWWVl1o3dV7UlY1JxdL1B8ERVGhuht86NkEtxHGcK22VM6qMnq0rKhMInnXvbxJWVriuxa+++6fqZuWTVpwMd8wiDz2Bp8m6lzHGfOVuS6fvpzz4mLJOs5unV72l1xSCAaOx/2eWXy6SnMn7PF8veTZesWmzInL4prI/vZLYBb8oWUz9nxC2/7kKc8bryEwelgpuRf2GTouL5MNPyxmPFrOyeqStKp2kzszedvSxLZ2Ru17g121MPqPQz/ibtTn28GI/7B3wNf9IUPHuzVtkhACiSSwbL4bjLGk4k5wyR/nPk/XSy7SmMs0Ni5qr8Gltu0I8Y1xyjNuei11+/5MQ0cZ+/A9z+dBb8CD3pDfjvb4qjdg5HofRXv8JcrosGvKtqR5DVwJBFpaaGnhSg/9jubp5y4lJD3bQQjBd4MxizzF05rnmxUvNqs3pqXXa6t9bNoG0WwnWAagvC0c+qZ13WHzJvhACEE3FHzj+83fxbU//9S2jAax5e2g6WPwipCG9jY57DMYhziuRdu0ZImhR68WMZtlSpoU2J2b4U2qyEtmFxueP5mynMdUVYPn2wzGAZPDAUHkfpEUWstSBJFLf+ATRS5+4JCSm9zVrGR6vuL540tGk4jxJML+M51itbwa51LWZiJ7HfR/7pLCxP/4jkWkXe76Q3xlk9UVeV12dHu1YwJYUrHnhF9+0LAUGk9PGDrfM8v/mUX2A3WbUjQr8mZFXJ5SNwUVGUl1wbJ4RNlsKJo1cXnCunyOEIpAHzJyfkvwPoDVGIBVVg2OY7E3CtnfiziY9EyW1SplvcmvOQhe7x29vQQCWxsQYLKU3v7ArqqGVZxzMd+wP4o+qaPfNA2LdcrT07kBWC/nvLxc3YifrLTE8W08KUnjDNUFAn5JZWhthhLo2gZUyK0LkzCW943b7kIO5S1016PAxdKKNCv4w+MzA0hqEyOwfX/KsubkfMF8abqTvdDF92yUFJ8BYHVhkmXFOslZrlOGPR/HUjcGWFqpjpphod+RbdE0rcmFm284GEWU1afZkq7ijBfnCx6fTHl2OuPkwjhN/bkYg3wJJYCB4xLZDn3b4dCPeNAbGHe9puEspnMB/DwAazst2gXVuj6BZd/6lBa2DoqKwyCibztcZglSCOZ5yjI3x9lc63CWTUP1WgzHe+SFRlwvFYdByH+aHPI3ewd83R/xdW944yiOm9R2mhRaNt8NxzzoDZj4/s7eu2lb5lkKGH7/6/vfdgYm12MIf+oT42rN0HG5H/X5LwfH/NeDY/Y8E5jtbS3u/0yqbmvKpuymV+b+L3aLGQtX+bjKRctfCmAJItshsGySwYiqbbCkomwaXsZrGnjjvG6raVvKtuZq9nbFj/iUu6IQvOIw+JPfz09FTnzo69+uGk5KQRi5SAGDUYjrGrOQNC3IspLVImG9SkmT3GRz3RBglXnF/HLNiyeXLGYxdVXjuBaDccjksE8QuV/oBEsTKEl/4BP2PLzAMXE6dUOWlkwv1jx/dImUkv4w4AtNYfjJ2hkwVTVpXpIWVQe06msTrc+7fjCDER/Xtggth7tiyMSJDJW3bd747EgEgeWgxe1KRG6fIigUrhrQWveo2pSqzcgqw7eOy5cUzabrcGXE1QlNW9JQ0rQVLeDrQxzVp2d/RWjdxVGDzujiLTuvjDCzqmqTFN60rDaZ6YyWNW1nOeq61s1D7QQ4tqYfmOwmvxN+NvWr04+8rLicb/jxueEsDyKPumnxXRvXuXpb3/ZB336o0qxkFWfM1wmPX8x49GLKoxdTFuuEqm52eQ87Y4O3VF015EmxS6V3A5e2MQG0SqudwPp9+/O5SwgzvWppma8SHp3MsLUBFi1mkpR0TkrbSdenLia0VngCRv2Ar+6M+fffbjibrjmbroxDE+ZBmZfmXLw4W/KP3imbpOBwL+Jg3MN3bXzXBDFalurcDbvk9q7DuXVhahrDd686+9iy05VtXf/S3LhbZnlFWddUVc1Xd8YEnuHP36RsSxH5Dr3QJfAcbEsZuuM1cF/VNbNlwuOTmbG/j0zg7paSef2cvF6GDliT5QYEruNsd00+ejHlcmG6hdvrkpY/G4v7X7JERxlTmKwmMEChbltCy+ZlvOEijVnkmRHbl2XXaeuulY5CvNVbtbvtsrM511Kipex0PxJbGac0V1n4loWvLUauz/2oz4PegDtB77NMRJrWUOccpRh3WU15VeFri7Nkw3kSs8wzks6Uwzi41bvjawH12jG5SuNZhq437MwCHvbH3XRnyNj1d659t1XbbUnMZMlRmjtBj7Ku8bTF2Au4G/VYdfTHuDSmF1lddTTAZjfRoGNOyE4LoKTEltvzo/Eto0ebeAEHfsi9qM93wzHHYW9n03/bndXPWQLQQmNLh7IpqUS1m2QZq+6Wuq2o2npHS/vZ9/HaZ3LommBwQz01GqllkbPqPo9bKu/187q9722ncrJzw9TSRETojsJqS6NL3PdC+o5r8tLesT8fuv+f8v9wZSVf1y1xZmJT2ralF7j0fHdHZQd2Zhbb5tr2LlQ3LXlpnnG+a+M7V1p3gcCyNX7oMhgH7B8NuDhbEq8zNuuM6fmKP/3LCW3bcnRvxMGdgbF011f5VrsFeduyXqWsFwmP/3TG6fMZs4s1WVqilCTqexzcGXL8YEx/4H+REywhQCiJ49nsHfT55jdHnDydcnYyJ0sLTp/PsB2j+bQdzWgS4fn2Ky6Ar5/XtlvrlqWZgqUd7TKI3B0t0zgrfp77R15WZN36ZpXkrJKctCjJCsPSycqKvDQuznWXhfZzLBk82+J39/cJPQczJDdT9bgybrvXeQemmWZGwb62b5Mh+BkmWGhs1UcJF4RAC5dNdUJSnZNU51SN0cNUbcamfEFaTdHSRQkXX+8TWIeE1l0G9jcElplevUuDZVmaMDAX3HqTkeUlcZzx8qzddUT6fc8EDd8wpVsArqMNZzr0CDwH19YmE6u4cqLLi4rz2ZokLwl9m37ogoCDcYTjvP0muq2yasjykov5hqcv5zw9nfHoxYzHJ1Pmy4R1kne0OkOHaZp2FxL4elVFRVw2uylR0POoS7OA15baLYR/SU20lAJLGyOOs/mGsm4IXJvAs42jWVqwSQtmq8R0wK/lRHz0awqBUIp+6PHw3h5N0/K//njCcpOavJHu+4zduOBsuiLNS16cLbmz3+do0md/FLI/ihhEHqHv4Hs2lpK7B8gueLfuulB5SZqXJGlJnOZsUhNYvVinLFYJs1VClpfmQeQZ4HZnv3/jY3JsbehmoUfo27iOseVtm6sHYVU3TJcxaV7iOVY3yZMcjHt4rv3ey6Cua9K8Yr5MePZyztOXcx6/mPLoZMbFbMMmyXbvrVLSLIjrn49X/ZdQllREtoOtNKHl8E1/xEWy4SyJOU8M0LpIY+ZZyiLP2FzTapVNQ1l3E8kOXG1BiDGN0ATaJrRtItth6HqMXI89L2DP9Rl7PgPH66Zp9q3redq208V2znuBZRP4Bhh9MxjxtHPLO4nXvIzXXKYJmzJnXRbkVdXRrozBg+7ssX1tMXA99r2AfT/kfjTgfq/PxAvZ83z6jvPZqXPbz8zY9XGU4iCI+HYw5jJLONmsebFZcZ5suEwT5nlCUm4dIY39dyvabtEtcZTC7jKYBo7HyPM48Ex48GEQcRSE7HkBPduhZ7udXu7PB1xBt7AWFp7yqJqSoimQ4urZWbc1eZNTNvkOeP2S1bMdtFREts3ED/h+uMez9ZJn6yXnacwsS1nm6a4pUDVGU9fS7kCzlgpLdc0ArfG0Rc82jprf9EfG3bKbRH4p1bZmLZKXFefzNc8vjdnTVwcjAsc2z7VOE2Zp4y5YVjVldaUhLMqKxSZlscnYH4ZYKrxiZAh2a5DBKOTo/ojFPOb02YzNOuPi5ZJ//ocn5FkBLWaq49m46tVm+NaWfXa54ekPZ/zwr6dmejXddDbwmv4w4OjukHtf7RH1v0yAtS3b0RzcGfCb/2By4pbzmPUy4fTZjGSTI6XE9S2apmFy0MdxrPeu34qiIolz5pcbLs+WJHHO0fGQw7sjvMBBOOLGDtofWnlZMd8knC82PDmb8/R8wTxOWW5S0qLcNZ23Q4Kfa6nQ8x0cW/Pwzh5aCbKmYlVmXGQbLrL1GwFQtjRrq6Ht32rG4GeYYEks4WNJHwTXHAUVVZMitEBLn6bd3lwFtoywVERoHTNwHhJZ9zuDi/57OzFKCpStaZoWz7VwbU1SNxRliWUpXMdi2PcN7Uvd3EzA0gqtFP3QZTwI2BuELNZply1xtZBdxTlxVvD0dGs73hiwkBQoeWVgIHjV3CBOCuI05+Xlikcvpjw+mfHifMmL8wVN02Jb2ljLK4nWkjQrSdLirdbY2ykKQmI5GtuxKLKStsuY+hLcdFxbM4x80i7nY7qMzTFlhaEM5CVZXiEFjPs+g8jDtj7tIjc3WEHg2xzvD9BKsUlyLmYbwLjimWBH8/4tNxmrTcZsGbPYpEyXMUd7PearhFHfJwpcQs/B0uo1gGV0VWVd744pTgs2SW6mk0sDrGbLhNnCOBqOBwHjQcA3x9kHUfi2GSRR4DLsBeyPIhbrlGWd0nTbaZqWTWIyxp69XBAFxrEqTguyotyB9uufhS1ASzMDDC/n8W5qtb0us7wy4d1daLfWytzYs4Ki/PRFkqs1B37At4PxblJjJgA1jhZETouQCWk7Z1oIZLbZ/awlLCxpd1+NvuMmVTYleZNRNgWi04hYwsKW9o238aF1HRBt3cRmQcQ0TbhIN7yMN5wlG6ZZwjRN2JRFZwle7WiE20fDNlhZS0mgLXzLJrDsztbdwrdbfBuOAs3dIGLf6+NrB187n2mSbXRGVWMoGI5SDB2Pvu1yt+0zcjzGns9kEzDxfM6SzW4CZECkoZBoJbGk0T/52mLs+Rz6EUdBtNMmBZaFo94/2dk+0LehzFfvm3Hhu8l7cP17QtuA17HncxRExmHOXzLxA07jNefJhmmamEyy0ljuF53GzJx3has0jtb0bZexZ8DvFljt+yH7XrCbcv4cFdkOd8M+cVnuPnfbOg57HAYRQ8fD1frD7NSFQCDffP6024TLxti2f8SS64qRsQ062P65Ex+//ad4tdN49dVVZpIYWhZDx+Ne2GfPCxi5Pi+TNZdJwqwDznFZUDQGeLRt25lcSCyldgHGvmURaJu+Y0DycWTCw4eu92UBLAz7oSgr1mnBdJVQ1TWR59DzHYqqpqgqpDDaaa2kYWSUlYlWsbTJR0wLZuuE0LNf0ebuYlOUpD/0OX6wRxoXVGXNch6TJQUvnlxCi7FXdzRh5BJErqHAC2G0PFVNVTY8/tMZP/7hlCd/OufybEWelwxGIf1RwOHdEQd3hoz3e2hL3dgw4+es7b3EsjXjgx513bBZpUzPV5RFRbLJiTcZUd/D9S2KzPzbaC9CKpOhtfv8tN1zu2nYrDPiVcr0Ys3ZyYIsKVBSMhiHWB375jaraVuKsiIva84XBpg/u1jw4+mMH0+nzDYpi01Kmpc/K6i6XsPQ4/ffHu/M45ZFymW+YVbEzIvk6lg6J15LKg69Hm+mzn1afdbWnxYurhohhYWtevTsB9RtsQNXbce9V8JBCQdH9XHVCEf1seTN3e+0kgwHAVorY0la1UgpcF3juOP7H643EAIi3+HB0ZDVJuXH51MTSltfnQBDDYOz6ZqmaTm9WDHoefRDb+fAswVZbdNSVGaUuw3ZXW0MPXCxSlnFGXXdEAUuk2FI/xrAenm55vRiSZUWb+yn7Vj0A5eha5uHmhDUVU1d1x1NsvnFc4EGoce39yaM+gGbJGOdGCpCWdcIjHtf6DmEvkPoOYz7Pj3f/ekN36AspeiFRvT67f0JeVkRPXd59nLO+Wz9ysi6BYqyZrFKKMua5Trl+dkCz7GwbY3ddfHMtXRFEaw72kRZmWuvqGpzAyo6DnJWkuYFaV6+Qdn80BICfNfi7sGAf/fwkB+fT3dOltvacpyny5h/fXTGxXzDsOcxjPzddanUlSaiqCrKsibpAJYxtjCTt9UmoyhrPNdiMgwZ9X20Nt3a6TLm9GJFUaZv39kPqJHr8/dH95n4wQ705k1OUsfkTQIyRqgXvCxPSVYaN5Gdbb1kYI0YWiOG9piRPaYnbzYVTOqY0/QF0+ICLTRaaIb2iD3n4MbbuI3ytGbkejhKMXA87kX9XS5P3nWRq6am7q617aJy65K0dayzui66JQWtKHmZP+Y0f4QoRvj2fTyrQskhPp9nAb/ds6ZtX1k6i46KNXA9pBQMXY8HvQGboqCoDbDa2lq3sLO+trtgZV9bhJZNaDsMHJfAsnYW2T9VTWu2XbU1ZWOmKK6yceXNaLlvKymEcQfE5k7YI7Bs7oY94rIgKTvaY113fH8DJyTyTdqjNvTNqDu2wLJfyUj6Oeqb/oj/66vv+LuD46tmXVeR7RgNmOez5wU31ge1tBRNQVxvSOuEosmpmnKnw9o2QixhIz9a89B0v2vztWsyGguwt91fG2i3z0L52m+z10q0uFohhMO9qE/Pdvi6HO4cP4umNgHa1+issqMIKrmdZJnmgLUD04qe7dJ33E6/9wUZlXQU76puDY3ctUhzWGxS/vjigjSvdk05z7GwtDTPs7xi0g84nvRxre0aZ7vRt18jUd/n/jf7SCkoi8porzb5jhpX1w2nz2Y7gGV1a6e2bcmSkiwtmF6smZ6vduDM9WyOH4x5+Ns7PPzdEeMDA67kF24OoZSkN/BRSrJaJsY50NacnS6YXqw4ezGnKmtOnk7pDwLCnoftmub5LmS5qinLirKoydKCLC1J4px4nRoH6UlEWRx0DJ3bBQ1N03K5Sng5W/Po5Yw/nVzy7GLBbJ0w7yZXRVX/YuDq9VqXGc/jOWfZGgGE2umeMZKqrUmqontetbcuDfusn3YlXJQyIAvrAa/u/fbNN10l8UZn6WbVYvQ2o0HAaGBAmRBb1zbTuZTy3anr76swcLl/Z0Re1qzjnCenszemSE3TdtqeNZZWON3kLPBsQt/ZJYs3tbEjT3Mz4YjTgqp606438ByO9wcc7vWwLENHaxuYLWPitwEs16I3DhmFHlVpQFXWgbWqqr4IM4JBZEBnkhWcXC45vVyxTnI2nbg18l36ocvRXo/DcQ+nCwq8jdJa0g9dIt8xjpLagNY4zblcbGiaVxcVZVUzX6XMV1eg4Zoh009X+8qXN8qxtekSf8Jp8Vyb4/2+0a6lBS/O5sSvYZy2hekiZrqITcCh1Vnudg6JtnW1QE2ykjQriLvpW1FWb9D+BpHH4bjHgzsjtDbXpX06Y7nOXskY+9gaux5/f3SPvz+6t/u3TbVmXsy4yM94HP+JR8kLzqoVj/OYsikRSKSQ3PUecNd7wH3/K1zl0rNuCLCqDc/TJzyOf8CWNo50uOd/RaCjG2/jNmrbQR+53u7fPvbyaNqGhppVueC/Tf+R/5n8E025R78S9GoHv3GAwa3s99tqO6Vvrw0XtoLioeMy7KZ2H3N8H3NLqNuGsqnIm4KsLrpFsfw0gIUBf3bnyngnMPmOP9cx3WY97I/4pj967/d86D42bUvR5MRVTFoZgFW3NRKFEgqJxBI2lrTemXF5g1cBamhLoDJ/bzWgux2+prBo6b6nglYACiPMuA7u2h1wdpSh9xH1b2W99Uuf43dVC538oEEpaWiBVcN8k3IyXZnnQWamIYFrYWtNnJt/++7OHnv9gNC1d4yI9z2zo56HHzgEocNmlXF5vuL0+YzlImY+3fDy+RypBGHkEfZMlpVSirZt2axSNivDIKq6LC7bMdqu4wd7/O3ffc3drycMR0EX4Ptll9IGYPUGPnlWUndOOGlacH664OXJnJcnc7RW2LbGcS380MEPXXO+SuM5kCUGoFZVY5rp3X13MAr4+rsDiqLunPtud//rxsgQ/nRyyT8+fsk/Pj7l6fniiwBTb6tNlfM8mfMyXTFxQvbdCEuaHLusMQ2xvK5+ekMfUbcOsEy+VU7d5khhoYSD3GmortGSaLu/XY3tP9TDxuT9VJTdgnBHFeyMLxarlDjO6fc8+j3vSnz5Xuedq//zHM3+MKSqalablDQvOJ9tmC1jksyE3JcAACAASURBVOzN/I66aSiqKy1CXta7m892wlGUldFzNVfDSK0kw77PsOfz9fGY7x/sMxmG3RSkIvDta06Ir5a2FK7vEA4CY8RRN1iOJuj7WLYmHPi/uKPOYp1ysdiwWGeUHegLPZvId7C7hHjPsciLih9fTMkL0zkD6Icu/dAj8GwC1/lg6uD22IU0LoHH+wPqukFLyd4g5GK+4XK+IckKY/n/Dhrmbdw9hDDn2ndthj2vcyy8+QJjeyyOpRgPzKRnsUpIsoIX50tmy5j1W6z9m84udWvIUVT1znGtZXtdmmtzy5fe7u+wZ67Le4dDvn8w4f7haCdqni1jrHe4GX74e7Ol0rY7StemWvEifcKL9CmraoUlLPbsfWy57Xybe8ees8+evU/PGmDLm09nrshF1+WuP3+91Rb5E7bXttcdwdpXfv0cdf1V3nXv+Tne6YaGdZUwK9bEVUpSZzuXqEh7H/y82dYveUy3XbftHAeghCLSPQ7dhqLJKZuSlmbXELGEofH6KsBVH8NUaKEtaNuEtlnQtnPaJkEIF4TL7kwIjcABoWmbJbRLDLjyzfdime8RHkL40LkVXz+/f47n9KYlBCglsLXC0QrH1ril3j3vtJIEXaaU1TWKbUsReQ5R57Kb5CWbtGAVZ6S9YGdkYLZ/7X0UhuLmBw73H+4DcPJsyunTGbPLNZtVShLnCCEocjOZEYYoQl01WLYm6Hm4rkXY84yV+X6Ph7+9w8GdAWE39fql1zo3qev72Bv43P1qDykFfuiyf2fAepGwWiTkaUlZVjR1Q5FX1HVyjRponHMc18bX0qwDPRs/cBjv97j71WQHVOUt5WmVtTHtWiUZT87n/PPTM56cz1kl+VufLFpJbK2wLeNpoKT8LPebt9UgdAndblKFQItt48Rj4kakdUlal2zKvDNbMhrgbZTG6y6DH1u3D7BoqJqUolmjpYeQ6hrAelt9/EGUZU0cZ8RpQV0ZcDHoKExZXnF+seL8cs294xGB55hA3g94Oc+xmIxCbEuRZiZl27YuyIuy45e++v1N01K2Zj+KzhlvN/3oJmpNp3fZTpaEEGit2B9FPLw75vuv9vnNVweMej7TZcx0GRN49ju1BlqbdPBw4JsbWwvRwO9okhLb+eU53/N1yr89veBivtkBJuPSaICTZ1tIKXh8OuPJyzmX8w3zdULbttw/HPHgaMjBKOo+rB/XoRJAL3BxbQvftRj2fO7sD/jDozP+IMy0p26atwKs2ygjhzNi4cCzGey0gR8OUGxLMx4EBJ5NkuVUdY2lFVVds0nyN67LtjXugub4jFbs+udg507XXL8uzf6O+wHf3Nvju/sTfvPVPvcOh8yWMdNlwovzBfqGFvMfUsbmtWZVLnmaPOJR/Ccc5eJIl7E9YeLsE+iQpq1paAhURKhDQt3D+QCA1b0a0HZ0Q6Mb+fIf0b/WTappW1ZlwsvskkWxIa5SbGkRap873t4vvXt/sSWFpGf18JRH0zY7cL9dWsmOKqg6Wu6HV0vb5rTthqZ5SVM9oW3mCBEgRNhRBSUIByEihPBo6hOa5gSBRsghQkQgbBA2Uo5AKoSw+dz20V9SCYwm1NYKx9K4lqawzXpBCAils2M5bIHTVsPbC1ygJc2N++AyznamBm3bvrk47Vw0vcDhwTcTJgd9jp6OeH7nktNnU06fzzk/mZMmJmy3qq62Y9kax7UZ7oWMJhGHx0PuP9zn3tcT+sOAwSjAca0vnhr4tor6Ho5r0R8GTI4GPPh2nxdPprx4csnsfM1yEZvpXVGRxEZSIaShGWpLY7sKv6NVDscRk8MeB3eG3H84MdRCx7q1OI6qMnq7y2XC0/M5//L0jLPFZtcMv17GOVoRuDah51wBrW7S+bmB8LYJsGWvaanwlEXf9ph4EWfpikWRsKkykiqnahvjZts1obklIHjrAKtpS+LqjFX5GC1cHDXAkhFaOCjp7PRWUuhOWP7xJ99kC7UURUWaGpqT0pLAt8mzktU6YzrbMB4GHxWMqrVCd1bndw8GNG2L6ihm/ctVp60pjclBVe+CbNvOWY6q6xDKq6R1y5I7i3LH1riORS9weXhvj4f39nhwZ8TRpEfoOzvsGbxnIS6kQFnqiwBS76pNmvPifMnJ5ZLjSd980DoNkOF+G0e8vDTOjKs4o2lalJJskozn5wssrRhEHjdX5r1aQghsS3fdFCPaDTzzALG04ny2ZrqIWcXZTkO1O6918wo4fp3TLDrtm+os3FVnNa86x8HtuXYsTT/yuH805P7hkL1BgPMRgFEpiacktqW4M+lT1Q1Kyt10bOtmWJbG8amqm529rgGQTQcouutnqxtwFJbVPWwdc21ur8uv7ow5PhiwNwwMBReIAufGGV4fUlVbUTQFSb1hUc5YlnMO1R3G9h6H7hGH7h1CbTItWhosaXcUPxfrA8wpbGkzsEYcunewpYMtbXpWD+sT6GO/lqkvYZnatA1xlXKeLViWG/K6INAeRVPyZezhX2ZJIbGF80HT5A+rFtqUtpnTNjPaZmr+LDKEyDr6n0YIB0QFIt19H8KD1u++ltCuaYWDYMT7TTLeshftVWD2rIiZ5TFZ/aawP7QcBpZPaDnGlEbID15gbreZVAXzImZVZkSWS2S5uB3dSb/H/axt213XPq0Kkrqgahp6yiXSJo6mblxjXlSa3CKtlIlXac1zo+4MaLSSeLaF51jUdWt00z2fwDVmYm+r7fFqSxENfOP0pwSOqwl7Lv1hwGgS7owetjE7Qggc18JxTZDwaC9i/86A4wd7HN0dYdnKTGneAyKEEKiObjc5GvDdvz9mPOkBBuDsHw0+ilro+Tbj/R73vt7DdjS9vsfRvTHHD8YMJyGe99PPEduxut8a17PpDwP8wCWMXGaXa1ZzkxVW5CVFXplJoDRNeWNqpjtLdpfBOGTcTfZGkwjHtcw665YMP4qqYrZOeD5d8nK+5mIZs04MY0YKM920dTfh9IwsI/IdomsAS24B1q3s0bvLc2wOBiFaSdzGYuwEuFKz54T0LY9Vke4iFiypsWixxIcNYG5Stw6wqjZnWfzAi/j/QQjdGVcM8dQenp7gqTGuHmPJACUs4zT0kWWmP8Z0oCgrFqsUz7VJwpI8N4ArzcxCswOlH1WWkuwNAxxbEwUOR3s9Xna6q/PpmnWcmRF5XlJ0wcdbPqxSojOrMAtX48Tm0QtdRv2AyTBg0tmBH4yNJXjgGuqY79o0vdZM326JivVLVJaXTFcxZ7O1MbTwHRbrlLppmAxCfvvVPt5e37gZJTm+a3Fvf0DgOZzN1jw/X9ILPO7u3452xNKS0HMMsNCSo0mPy0XMdL5hukxYrBPmq4R1bHRiaV7uqJ1b21FzQXU3bylRSux0Tq5j4TsmQysKTZ5aP/IYRMZowtBBzd9d9+OBsRCCYc+IZUPfYTKO+OZyxXl3bS43Kes439Efi2s87W3emNYS29I4liIKXHqhx6jnszcM2BuGHIwjDkYRw75PLzABjp5jMeys6z/V7fHNaqnakqxOSOuUojG6mZ414K7/gD1nn5E1xlM+WyuFrbZDCY36gI54oEPu+vcZ2CPz8yh8HeAp/5aP6df6JaqlJakzZsWSuMp+nU3+xVRL28a0zSVts6Sl5srcojQ6KyGB2tAIyWnJMVMtFyF7CDkwP9usaeWWVq34IICF0fhVbc2/rc7479MnXGRrky11rQn3MNrjbwbHfBWO6XWg6ENr63Y2zTf8w+wZf1id8V1vn2+jfSZuSM/y3g+waFkUCafpkpNkyYtkQV6X/H54n9+P7hF5jmkAVs2uUXzdvKJtDMDbaq0s1eVYti2OrdnrB/QDF8+2bgYeBSaEWA6J+j5Hd0ckXYZTVVSddqjtnAglSitczzI0uNAh7Hk4rkaqnwar28geKQS/+Zu79IcBWWL07LajuXN/jOPecL+vVX/o881vjtg76O2AYRi5hD2v01jdvB2stMILbJSWWJZiNAnJkoI8M2vKrfyDrjEqpXlfpJLGKdDWxtTNt/F8G9e3TZ7oLbopZkXF2WLNo9Np5zh5NbRQStL3XYaRx9cHI74+GrPfD/FdsxbaNp9/DnAF5vqcDAIspYhwuR8MKeqaoePjaxtP23jKItAOrrJQQhJZTgeybo/G+JkmWC+Z5v9E2zZoGeCpEaF1TGgdU1p3aalp1AAtfJR0ukmW6qwuXs1A+CmbdksrtJZUdUOSFMRJTpzkFEVNUWynD7utfdQxaa0Y9QNG/YBB3+Fw3+V85vLkxCb0FbNlynRhsUkMoMuLake50lpidQtYz7XxHM1kFLE/DDma9Ll3OODOpG80Rp6zm1Q1TWNCjpUxaegFLr3AocXYyAeujWtrkxl1S7BbSePoFwXubuKx5Zt5rmUmTba1m+rdtIrKmIQs1imTQUFZNcxXCbNVTJzmO3OLojS0ymHk8fDuhHHfZ53knE/XHO/1P8jS/H21nUz6ns24uwkuVgmXi5iL+YaX0xUvL1edtXrCJsl27kll5wS5VdDJDuRbSpmbiWdG4lHgXtn8D0Mmw5D9ccQw8rpJ2qcHo0oh6Ece/chjPAg43h8wXcY8Ppny+MWMi9may0XMapPtpq1bEwIlzY3cthSeY+O5FuN+wP4o5HCvx72DAXcPB4SeQ+A7r1jTu7ahHQxC75XrktZMW13HhHOrj7i5txj79LRJyDqABRDqiCP3mKE9ItDRR1AB3yxP+b+Cqb+gMk6LdTfZbEnqnHmx5iJfUNQlrnLwG5e0ztmUKfI19oQQYAmNJa8syd/2Gd0aZ1RtjRYS1T27tlS45pp7IFtnqu6hrYWZNGypqNe3f33/dx1/oVBCvrGvcGXO09B2GoLKONkJtQu+3e6XcXa8Csnd/r/ZV7NQMoG5xl1LCZNz93oYsOqOd0vzu/7sMRb9FXXb7Kzwt/R4Ey7cXNkgdx3PrV2+Et1k5z3v+7Ujp6WgbWLatkRg0Uof41WpOl2Vbf5MA10cDMIzlEHZQ4iQlg20BbSVOfoPdjQ072vVNJwkC/5h9ozHm2kXnm00HWVT81/HXxFql5HjY0tN9BE9NWPa1TAvEv5pecp/O/8TeVMRWi6uskygOO+emLQtLMuUF8mCf12+5J8XpyRVwZ4b8p/lPQLHeYUdsr223qZOvf5vQphcxpvW9fPqhy5+6MLBjX/8o0pKibQNEPn6+0O+/v7wVrYb9c0kDiafvC2lJMqzcT2b3uDLfCZlRWXyrs7nzDbpDmAJwNaKUc/n/mTAf/j6iP/08A7H4/6OufNLViAclCep2wYtVDenNq6frtLdV4vAcnba9NuqWz9yJRwG9rfcDf4PinpF1Wa0bUXRrJjnMZvyhJmMsFUPRw1wVB9H9rFVH1tF2DJECbe70b7/QJVSRvRYu/TDgrRf0jQtF9MNbdviezb3744Z9v1bmwCl7Usumz+w1Av8vZCHfsiDfERdHFGWJrhv6w64y8lQho+6dV/b2pH3QtdMrDwb23pNoNlNRrDg2/sT/s+6YbY0/v1SCrNoH4Tsj8Nd1tGnVj/y+P3v7uK51s4qe1uWVmbSNgyZjCL8D5i8uLZm2PPIyz5fH4/53VcHPHk5o6gqdGdLvNX+bKmUW3v7LRBQN+hUfUo5tmYQeeju/ByMIuK06KY/W6qdAex1fWUYsB3ZG7BvgNP1SZYBzsZRMvSd7lhu/zh0B/DARwD9wGPTxQFkebkDhgYIXXUGdUdj1J02LPQcou66DH0Xx3oTwEsl0CjuH4343//Lt3x7/+oBY3Ljgl1A88dUQ03ZlFRt1YnjDe1IS43sFrO/1rvqr/e9ucjnnKZTFuWatM5ZVwlP4pe8SC6o2hpLKubFinWV8Cg+eWOipaXmu/Au30b38JX7zndyVW74YfOCp8kZR+6YI28PS2iqtiarc2bFmlmxomhKqraGtkVLA9yOvQnH3oTI8rGE3pluAEyLJc+Tc5blZgdijrwxR+6YQL/5WdqCllWZ8GP8nB82J0ycAYfuiJHdI7ICfOWQVBlxnbEo1kyLFWmdE1k+kfZZlBum+ZKqrQmVS6h9hk6Pkd1jUyWcpJdM8+Xu9SbOkEN3zMiOjN29ump0LIo1z9NzpvmSQHsEnZFIS0telyzLDcty0zldNlhC42mXUHvsO0P23RGutNFSod57HUukHINukO0RLaUBUZ32SuxcAq8s2Nu2MJRAsdValcbcQh0g5NDosT64riISvu8dULctl9marC5ZlRn/tjrjj6vzj9juTV/9CqB+rnvi27b613uH+euusq5ZpznTVULcZZhqadYPo8jjuzt7/P7hMff2BwwjH9tSt6b/+pSq24aiqViXGasyY1mkzPKEeREjEPRsF1/bn+UzdOsASwuXgf0QS0bE1Qmb8gVxdUpSnpFUZ7Q0NG2NLSN8vY+vDwjtY0LrLkF7iNQKqWzMjfL9B6y1RCqz0E8jl6yo2MQZF9M1WktG/cDQsQb+rWlF0vaMy/q/s9Ez9sa/ZXz0WwI1JlD7KFy2IXDXa9vp2Yr7ZKd7Ud2Yd+euIl79GWPxLvn2/oS7B4OrjoEQOy70dnF8GzUIPX7/27v87pvDXddxtz9CYGmJVmr39abldEHDUgi+uTPmd18fUDc1l4sNupvYbUW0Ygeurmhslu4A1q0c5bv30dKGJrc/CncTvKYxE9BdUOlbHNa3RiZbowTZaZuuwKLcjcjla+f5tspQZc30qBd63DscmryWa7qxn7wut9dmd00qJc2xvLbDpssD94+G7I9CimuTxV0jofv6MWVoNyVVW3bd821XXaNucF/4tbYLrr+u9+k8X/BPqx95mpwxL9Ysyw1xlRFXKU2nO5RC8ig+xZJv0sFcZVMe/B13vAm+ct74/20ty5j/tfyB/3f6T/zt4FvqtsXXDnldsCxjHsUn/BifEFepsYZvWzM90w7/efgbPGVjS71rVGxrmi/5p9UjniXnWFJjS83fNt8ysKK3AqymNQBrWW74n4sf+L/P/z9+E93nb/oP+Tq8gxIKT9kkdcY0X/IkeckPmxcsyg2H7ogjb8zT+Iw/bZ6T1wUTZ8i+O+Sb4A4ihPNsxv+Y/5EfNs8NGbdt+U3vAX/bf7jTEV0HWMtyw7+unvCnzXMmzoCJM+ymZC3rKuFZcs7z5JyqNZM6TzmM7B777pDf9b7CVy7S2ma7ve/eoRByjBJ9jF372+7Ir89cuolMu6Kpp9BuEMKDji4o+PCxkoDddPH73gH3gxFJVZBUBefZCoHgaTz74O3e+PU744hXOT+/1q/1eaqsG9ZJznRtnIubpkErhWdrRqHPd8d7/G+/vU/o2TiW/mBTuc9VTQewlkXKj5tLflxf7jLtIu3gKN1N5G//c3TrAEsIha36CGGhpY0lfVw1wFd7JNUBZbOhaGK29sF5s6AtavJ6QaxOcNV4FzRsSR8tfayOSiiFjRLWtdfqOkiWIuwyAlxH43XivmHPp9/z8Dz7tTC8j6+agpINlVgjrQLPE0SWsX+05e2Ndnf24gJ818Z3P7/wXmtFpBXRxzpJvKOkMCAJAYt1wuOTKRfz2FjsVw3PzhYUZc3ZdE1RVBRFzSYpsLUyJiJ1YwLzbne3Xt1HKZHyMwfDfcaSQoAyJJnPYTyxrevXpeuYIO9PqU21ZlOujN6qLSianFW5YFkueJmdkNQxVVtykZ/zx/W/4KsAS9qorvMvEAzsIQNrhKu8Tov15vHndca8nLEoZh0Nq76aQiJwlIMjXQIdEukerrrZ9C2uNizLBVmdYkt7Z5AhgLKtyOqUvMkMNZMGiZnEWcIm0CG+CrCljZbWW/d7W+YhkVM0OUmdkFQxeZN1lK8aJTVKKBzp4iqPuqkoG7O4/wKecT9LudKmb0VMnAJXOQTa5TxbUDQlLS1aaFxlE2qPSL95r3aUzdCOuqnSu9+1qq2Jq4xpseQsm/HcPsdTDkVdkNQ5ZVMRaR9HWpSNodiZxbDEkhrdnavXGxdlWxFXKatygy0tLKnJmuIVit7r1dJSdT83LZYsy5ikziibckf9q9tmt+3LfMFlvsQSCk85VB3QaTqgFtepudbairwugJbICthUKXGdMi9WvEgvTIaVkPSt8JX3Jakz5sWaqqlYVwm2tNBCGVqykIydPlVHr2xao5E7Tad4ykEiuePtceiOGdjhO454q6W2QFy/97ztfL3lidGAlDVtawHGRVCIoJt4fVjt7oWAr218bRNoh6TKqdsGX9u3pvsTAiSSvuXxfW+fumn4vnfAnhMSaOe9+quPe72/lrvGr3XTapqGrKyIs6ILEgbHMsyf/WHIuBcwCL1dxuaXcg0ldclFtuEy3yARHHq9HcNsu5+LImHsBFcugnyhNu0CgRYuUmm0sHHViMp6QNWkVE1KWl+S1lOyek5eLyiaFZvqlKr4ESVstPRwZA9P7+PpCUE35XLVEFtFrwCsbW1F/ral6PeNRbkQAsc2lK0P1Qz9WrdbZkJizC4encw4m23YpBmrbe5FWfHk5ZzVJiXJDC1vsU5M5zPJdvlUt51I/mv98rUsFzxNHnGZn7Gu1myq9c7gIq42bKo1VVvyPHnMulyixas0QSkk30e/4/vw3zGy93CU81agktQJT+If+bfNP5PX+S78FExuT98aMrCH3HHvdYHFNwNYq3LBj/EfmeWXhFZEqKNdeGpaJ0yLC2bFjLqtqNsKS1q40iO0ehy5xxy5x4S6RyCCnwRYSR2zLBecZ6e8zE5YlHOKpqBsSlzl4iiXkTXm0D3GV/5Ov/bXUiOnx7fc5dAdUTQlmyrlX1aPqFqjiQ20x8iOuOcfcM/ffyPkVgnJXX8fTzs3Wha3bcuy3PA8OcOWlqEDAj0dcOCOUV1XdAvI0jpn4gwM+FLvB9Sfo6qmNvqzKiGuUtI6J9Ae3wTHrMoNz5JzXiQXFHXJotwwsEIGdsTYGXCSXnKaXVI0JS/Si86K3ecu+2+8Tt3WTIsVF/mCQHtEVkBP+xy6IyIdULU1VVsxL9acpJfMyzWP41NWZdztk/tegPVJJVyEHAFRp9mSO9fBW3uJHW3v9kp25gZjN+Q/j+7zdThhaHsMbB9XWdi3DLB+rV/r9WqalrKsd5KDtm3xbM1eL+BgGBF5jmHqfGFr7U2Z8yJZsCgSDr0+v+kfdmwGmBcJz+I5Z+mKiRtRtQ1XybyfXp9hgiVRwkZhplew1fK0tDSk1QVJdUlcnbIpX7CpTqibnLLZkLY5bVuhhI2v9/H0Prl1TNGs8fU+bjPCUX0zycI2Vu9Co6RCufKTHNl+rc9XllZEvkPgORRlxWaWIztDDYC8rHa5YsbqVRKnhuNb1Q2eY+26Ir9MvQ3Yfdy+tG0D1LTUtG1G0+aYAM4AKa8v6t/cvvnZhrYtaNqEpk25or9spZsaKQOkCN8bgbDbFhVNk3ZuW/W1YzXbkyJEyRDxlsbGbVTR5GzKNbNixqqcs6yWZlJT55RtQdmWNG1NXMWUTbUT7m/H0QrJgXtE3gGmd4Hwuq2J6w3T4pKsTneTpaKbEOw5E8bVPq70OHBvLoJO6oTz7CUv0qdEVo9I9zrTA0lWJ0yLS+blFmDVXdCq3dnM1whg4lTGXKHTgVxvBrWdMUDR5CyKGS+zE06y55ykz1mUc+rOGMFVZnJVNDlCSCLdI642O4rll/XI+zwVaWMiUDl1Z2mdsiw3PE3OaNqWgRVy4I55GB7zu95Xb9DQBAJX2djyZo5iLbCpUs6zOb52u4wtj7HT556/j9PpicqmZlmuWZUJE2eIr10s+fPPyuu2Ia9LsrqgocUSmoEd0tMB02LFy2zGotwAULY1jrR5EByx5xj31qzJyeqCabHEkpqvg6O3vk7TNmyqlE2ZMHZaIssntHzudPqzuq2p2pqT9JKsKViVMfNOt+YrlwfBIYdNtTPKePNc3PRqfvP7hDCTr8/1eRDXvopbtEzb6qx6lkvvI1wI/5qrbCqSKietc2xpYSvd6R8l6haAadtRdY3WpyTvnlO+cnDUNcbVWy6GremMYTuU5HXBdrW8nY9qIfG0Yyi0t7gGyuuSpM7J6xJHaTM1F8qsp9+ydtgauhRVbeKIMJmc/cBlFPn4rtU5BX5ZT5stPXBT5riBxV1/YCQQQqISybN4zqJISaqcoq6opPFDkB3V/nUzog+pn/EubySZlgzxtUBLF0+P6dUPSKrz7vdL4vKUolmT10vKJiarpyyLx8YMQw1w1dBot9QBrh7iqAFS3DKn7de61Rr2fL5/sM/eMCTPK7KiMllgljI2ol0Ic1XVlJVxumpb2CQF/dAl9A84nvTxfvGsr9vobdTUzZqmXVNWTymqJwjh4dp/gyu/f/+rtwVNm1HVZ+TVHyjKP9JS0bYVILtmwwDP/o+49t8iePeD2PxcRt0sycs/kJd/oGnjblsghEZg4dp/i2f/R7T6PMGske5x7N8jtCLS2jgHxtWGuN4wKy65yM/I6pQj75g77j0c5XRTLPMAEEiOvXv0rQG2fPv0Coxj4AP/Gxzp7qh282LGafacWTHFls4nwZCqrViWC1blEktaWMLGkhYDe8Sec8BW0ZjVCetqRdHknGenbMoVWZDhSg9X+Tt3tqvt1hRNzrpa8iJ9xh83/0paG7Obsb2HrwJ8FXb2t6KzY55xlp0yLS6ou/P511BaKJA2lmg6CkiD3VHZoEFJhSUUrrTfulgRiM7h76bXgXHvi+uMgR3xTXjMPX/fTH6s0JiyIKjbhp7lk9cFAzvC/qhw3U8v0+I0Dn8ju8fX4RF9KyRQHpbUDOwITzmElk/fChnZPSbO/8/emzbJcaVZes9dfIs1IxckkFgIslhVXVXdLXXLZPo2H/QD9ItlmjGZSTY23TPqruqF7CKJhQByj4zdl7vpw/WITAAJECQAAlWFQwsil0gPDw/36/fc97znbHEjG7FqK16n9YTzZhqlkOHVrq7rScl2OuCXvXt80TtgmPQYJt2NXFaLaPNdyJSn61x2cAAAIABJREFU5SlPy9MN0ZqaBYXK2164T/iEn46ZWfH17Hv+Y/6UW8U2t4ptdtIBw6RLT/40I6arcMG3vZ4Vh9U5z8oxuUr5snfA/d7rLRKNd9TecFZPebg85vHypF2A8NGuRSoGusOvB3f49eDuOx07xs2cf5895unqjINih4Nih1Ear9FCv3zdXSUbYu2i3Dp5Z22+6MeItVtg5RSNt4zrFbolWAtT0/g4jjXesbT1pgdUS0nS3jN+Kn7mkV6QyB6J7FKwBwRcaKjcOaU9Y1z/OyEETFPS+Am1m7ImZlrmpHJArrfZzv6KUfprAg4tChL5oQjWX14j+U/BqF8w7OYY66LdeWXarKhkY9ARCFS1pWoMh2czHh2OWZQ1N3cG3Nzpsz3ovHW/z9vh3cgTAw4f5lh3TNn8gVXz31BiiJJD8uQHCBYGHxYY95hl9f+wrP4LgRofmugnJXISdRshUrLkNyBes9IZLN6vsO6Usv7vzKv/E+fPCaGO2VIiR5AzxJHqz98rwUpkyo3sFh6HC5ZJc8HEXPB49ZCVXeGC41Z+m78Z/s/0dJ9U5Vfc1wSFKshlgZbJKyfHHVXwWfcL7nbuRwMNb3laPkZNJY2vyWT2VquDNlhWdknplps+qJ10l71sn4PiDhKFFIqz+pjH5QOOqmec1EeUriSRCTfz24zSeIyvWnK74Kh9xdRMeFo+5qv5v1LInJ3sBtvpLjfzA/azWMFrfM1pc8z3q0cclk8o3WojW/tLgGrtxdeIIdSXZFy1PVCZSihU9gNGCj+MGClgWdmSTCb8onvA32x9uTE+eMlmYa35/4D3DN/uw3Y64PPuAYOkS972DW4lPToqp687bKU9trMBu9kWN/IRKxerV6WrOakuKG3sNbsWreuPQLCd9vlV/y6/GXzW9kfGYx6AjsrJZUpX58ztiq/n33Nh5lzUcybNEpnKTwTrE94ac1PyL9NH/F/H/8Rfb93nr4f38d0QK87JuyBYLvZA1jO+nj3hD9MHDJIuPZ3/IMGy3lLamsNyzP8Yf8M/jv+DxptWrSFJpeZmvk0qNb/oHZC+w8r3uJnx/118wz9dfMvfbn2ODbHyn6uUgldfd2LzP1BCkGpFlsRQ6o9xNqyEJFMJqTQ03nLRLDcEam4qGmdj8IO3G4KlpSQNMa4j+RGGbi/iZyRYMZvE+GVrdLHAuDm1n1O5MZU9p3Ln+NC0VardTTZWtFsNrYQJKnfBef2vNH5K4xf0/O3W7n3rpVLepWQoUPsllZtQuRmNX9K4JR5HCB4pFFpkJLKg0CM6ahstc5TQyGtWDULwuFDTuAXj8IiZOWxtcw0hOJRIkCKhUFt09Da5GkTppLiUn7hgozwyVFRuSukmWF9hQ4MPNr7nAEomKJGSyR4dPSJXW2gRf2ZDTeOWNH6FCzU2NLhgcMHgg437g6erd+npXVwwlHZC5ef4YPHB0tHb9PReu48ZSiS40GBDTe0WVG5K7WdY3+BCs8l7kcjNe+robQo1IlWdzc/WkEIg1VrqIVonQvWCjWcsiSsl2B3GVc6yNmz1O4z6BZ083TgO/tywboyxj7D+nFR/RqLvtVa/P2GyFNaSPg9YCIYgbPv96yHQSNFBq1sU6d8hRYbzY6y/wPkJ3s8IoSG8yaRaaKTIUXKbLP0tAY/1Jzg/xvkJzs/a7Zk32refCiU0mcxJRNJeP45GN9S+JpVp28ciSGRKR3fp6h6ZzNGbG41AtwHD4nWfhxCodSBxkGiRtNtJ2p6ut/TiCgEfor38TrrHQX6H/fyAvWyfnXQXIWR7vUgCHi0SDqsnTM2ElVuxdAtKtyRXBfrKsFz7inFzxnF1yNIuEMAgGXG3c5+D4g5byYihHmFa10UlNc5bQgicNSfUvuZ5P9A/X7w49r94Noirv7nGHfNHv14rKYyVmR6Fzklfl6H1gWcf62SjeD1pOionk0m0RRcSLVUkoDKlUBl5a1Ah22ytNVn1rT38q86qaBoTFzu6uiBXKYloZTdXSG2mUoZpl9IPN7b4jTcsXcnCrujqv2wp3NLWPFyc82gx3piCrI+5FJKb+YCbxYBBEm2mr8rRfipidTFmuR2WM47KGZUzCCCVmv2iz34xiC6YL8g3F6ZmYStmTcWkWTEzVcwCCw7ZVoczpem3MsdBUjBMC/J2LH9f0rJoBBOzydZZc+s5zLvZ/vqOHo+b9Q7n3RttX0lFrlL2siG/Gd4lU5qpWTIzS+amZG4rTLAbw5p3iSj5czFOwq/zA19tJiZlJFN5qqmNxbUOxdZ5rI2OxR/jfUa3OVepihWs83rZ5v0JFib2KecqoXaWk2rByjZkKqGrU0QqyNVPlxT/TASrFScES+UuWNljluZwY+FeuQm1u0CK2LdV6G26+hbd5CYCjRAK65eU9iyaZNgxs+YhpT3D+CXOVwzS+2TpkFe5CcUsjinj+hGT5jFze8zCHLdkxqFESqGGdPSI3fyX7Ga/pCO222a4awgWHuvrSBDNlNJNqd2cxi+xoSGVHVLZZSf7nL3s14hUkKnec8TDB0Ptl5TugnH9kHHzkNKOqf0c46vW8j2QyS6p6jFIbrKb/ZKdTBJUFyk0xpcs7AkLe0btZi15XGH8iibEf32w7Oe/Zb/4LcavOKu/Y9o8xYYK6yv28l9xM/8dW+k9cgVKJNhQUbk5M/OMcf2QqXlC5ebUboEnZrtIoTf7tpf9kt38S3rskSpxrRmJlII0iTbva7v6q1gnj28PO3Q7Kc6F9vlxdeRDlaCtP2PV/Ddq80e6+X9CqRvt+3vbG8K6b+rNKqFCpEihSMVdlByQp7/F2O8x7gm1+ZbafB3zXt7olTVCdtAioSP+FzL9JcY9w7gnNPZBlA362du9vTdA7ElKCCFeYx5H5vLorCc0oiVYWmhSGZ3+MlWQXLkm1895U7IrkbFXtHVzk+LtdePrCoUPnmEy4over7hT3KOjuhSqs1lcSGRKKlMymbO0C56Ex9SuamWRS5TQzxls1K7ivD5rHRVXaJmwne1yv/sL7nXuk4i4Pd9OeDOZtdISjQuWi+bso7zp/TlAEKswO+mQrbRHLt9Plsq7hhACLRSZik6F8XoQGxKVqYRCZqQy2Rh1yDYMWCI2Er9XeQ4JJJlMyWQa+82uSHqvIhGKnu6wnVo6Oko2rY+GIAtbMvLmnTac/6lhYWp+f/GU/3z4NZUzmJZkQSCRir/fvsffbd/jbneEbFfp3xbrbDXjHY8W5/z388dcNEskgl6S83fbdxkmBTqRm3F3jbmpOCqnPF6O+W5xxuPlmNIaVrZByzjJHSYFd7pb3O6M+Ky3TSYVWfrnlW14aXLyw+8pkTHo9laxTT8p+LJ3m+NqzGE15vvlKQ+WR++FXP0USBGzPvM0wfmAMG5DsNZ9WR8jlIwSwVRqamdZ2qb9jMD6eGw7OqXxlpNqxkJFN1CbFuRveU29c4IV84IsPjhcaHChxvkKG0qMX7Gyx22/1SmVPaNyF/hgECgyOaCjb9BNbtFP7tBL7rSry4rGL8jUMYmN7kKNn2H8grl5ghCKTA0J3L/mlA4bwjEzR0yax1w0jyOJCSW+TaoPwVMBLhgS2UGKBBtq+voG6poQQh8stZ+zMCctmSmxoWrfc0PtLI1boEWKEhkQGKQHpLJ3JSU94IPFhhrjl9RuRu2XWF+3vRPxebVfYEIJeLTMkUIxSG6RJAUuWBq/YmXHLMwxc3sM0JLSitJd0LgFqeyiRYrDUdoxxq+o3Izaz8jNgI7aad+3IpU9fPC4YDC+ovYLKjfD+KqtYPn2GDi8M9R+TiILlEzwOAbi4DnL+qt2tvKVIbtthhTr0Nz3b0v/OsTPKBpBeD+hMQ+ozL+SJb+KgZXxWfzo27+QCFKk6KLVPqn+BVL2UHLwg9sS7bWASFFySAi3o5RPKJyfYexj3JsSLCGBNFYbZZeEA6TtI4QmhBJjn/649/UTsZl4tW/dB9lO5NSVfqQrOVhSo4VGyx838D13sxPruvgmqvOt30dciFEkMqGn++xl++xl+2iRXKm2rZ8nMcFSqIKAxwRD7SpqV2HV83JnExrmdsbEjLHBUqgOAz1kO91hu5UUXt3/tW23DZbT6ujaie0nvDusjS06Ko/9Wx9Zg/dVrEfh9Tm4rk5tfr/uPWiJVux1FFf+Jm5hvfD3ygqWIF6jQpHJBPWK4yKFIpOCjooGIRIZjTh8Q+Xrvyh56w9hfcyXtmZcL6mcYTfrcb+3y27ew/q3O1brz7NyUUI1rlc8WJzxaHHOyjUMkoKuzl76zNdkzHjHUTnlm/nJxpVt1lQ03lJ7iwoy5jK2r7OwNZ5AJjWeQEelFPrD3vN/KuSmIpyxkw24292jpwt6bdD267CWNSdS00863Mg9mYrV3oUpeVbGHLuPAVpJunnCsBsjkcomRugsq4ZFWVObyznrx4RMaoZpgQ+Byhkqd0XarKD/wlQiVZpEKnSbW/o2ePcECx9lbr6kdOeU9pTSnW6qT9GufQVIlMzoJ3dIWwOLKPMbkqkhqeqTtpPOaI7RbwnYPrnaptB7lPac2k2YNY8Zpp9z3Ycb8KzsOVPzjIvmMZPmCbWb00v26OnfRidCFC40bRVqxsqeU7oJZTpBFZpcDV+qMtjQsLRn+GDpJfvsJJ+3rokCj2Vpz1jaM0yoOKv/SO1mG2K03pZAoIQmETmFGjFIbtFPbqJbmR7tKsjCnLG0J7hgmDZPqN0MCHT1ZV+MD5bSTZg2TxmmtxmlnyGRTM1T5uaIys15Vv6BXA1aueANFvaMpT1FioSlPUOLlFR26OkbmwltJrv09B6xDy5DizTKqYTA+oqFOWVhT6ncjJPqa4yvSERBT7+fnp2fE9EIosH7JS7Mo2yu7VH6qRAopIxEJkej1U0EKYm6+w73/BN+bkghyWSOFLLNtsrQInmJ4CghSWVCJjOU0ICI0sJgNo6JV+GCo3IlpSuRrTtgV3fRr3B11EJTqA59PSBTeSt9/IT3A9FOji4rQT8vLgN03xRrM5RXV83XYelyQ65+LMTmuOhN1ev657XycSFRrPvnWtmSW8ui/nJrWL0k429HtxkmxUbe9ng55h/OH/L19PjtNv7CR7uWfU6aFV9Nj/j36RFn1QLjHXtZn18Ob/Blf49bxZBcJ5vFL+MdM1MxbVZ8Mz/hn8ZPWNqarbTDX3eGZFKTKh17671jZRvO6gX/MTvZZA6VznC7s/UnS7CUlHR1jm57L/eyLRKp2c9HH3rX3ikSrRh0c/aGPRrrmCxLamOZLEvO5itWdfPKqvaHREen7OcDBkmB8x77AxXBOHZJMpnQ0elbjT7vhWDF6siYufmeWfOQmXnMwjxhYZ4ihUaiKPQeA3WfXnKHYfoFw+xzUtlHy+LaitEaPhhyNaLQe5xVf2BhnlG3xOjqzWZdJfLBs7RjzqtvmZgnLMwJCEFP73Gn+/cksosWOZWbcV5/w3n9HTNzyMw8w/qaYXLAKL0H4vkytg8NpZ3Q+JJBcsB29jmD5Bap7BAInFRfc1J/zax5xrR5ysqOGaQH+OA2OT7RnlujRUahRq3Ep0s32SNTfSQKISTH5b9zXMGkecrMHDJpvqer97iR/+Zyf3DUbs7cHLGV3mGU3iWV3ba6Ydr3dMh29hk76RdsZ5+TmacbOeDKniMQDNIDIBIBJRIy2aOnd8lkj67epZvsxj4yFKW74Kj8N0woKd2UqXmCDy4er+du/O/7BtlWBEM8EvGxXmG93mL9srdv/e/VbXkCjuBX+LBs+5umeD/H+2W0V/cVAsnVGFchFHC5Wvv8YOPbHkKPEAlCJKRyQMrnxDWwTzkmf8oQIoYVp6QUqtOGB788vMbKQdoSMI2AVrdvsN68FCrrgqPyFZUrYw+a6lGoTvu3L19X6irBkvmflfTmY0QMD1ZtNejnPdZRlroe6d50ZtP2n11+d90zkFzaFF//yq/HukK2lhi+Zm82/RDrxQjX5mStrwXvX+7vCCH2J28Io4gSdCEEoXWlfS6yof1SCBAvZPV8rFXHrs743dYBv9s6wProLPf7iyccltO3JlgvGrBY76nb/pSvZ8f819PvyFVCLhNuFH1+O7zF327fiRUXLnuvbHBMmxXPVhO+m5/xb9NDUqm50xnxu60DttMOo6yL8Za5qXmyvOC8WfJocR4/nxA/v57OuVkMX9rPq2qfdX9YiL946SxcnwtSiFcudoS2r92Htt/X25e2tbHoFi/bdF89p9Y9Vz4EtFBoXdDVBXc6e8+dzz8XXty3dVUyvPD+1kY7Pqz7rd7s/E+0YtiNocKzVYWSMhKsRcXZbMmyanDeo7x8Jz2u7wrrEPAPgXdOsJyvmDTfcFb9fmO1HoKhq/fp6n1SNYhugGpErnYo9A652iGRPZTI3mDFVaBERioHaNFpB9Q4cX0ZAY+ldBdcNI8wvqSb7NHVOwzTOxRqhBJZW8USjNJ7aJHjg2Nujmn8kqU9Y2YOydWATF0OALFna0RH7zBIbtHVuxvziUBgmB5EGVaApT2n8UsqO2Vpz0hll1R1EK2xBirKJVLVQYuMVEXSFy9wSUePGCZ3cN5QuzmVu8D6qpXqrS8RgZIpqeqSqT6Z7Mdqldqm0lMav6J0E1LZJddDOnob40savWJlzzGssKFqzTViH1YiOwgdK40umNhvJbtIoQBBGrr0khsYv+K8/paFOaHxS9xGQvfzIlBj3THWneDWxg+hbK3HPQINQqNEFym30HKEVvtodYO1kYrzUxr7gMY+iIQqLKjNdzT2KT5UVM3vmSzTNhrg+QEkT39DnvwWrbY3vwsYQjBY95Tafod1xxBcS7bWph83yJPfkCVf/qzH6xPeHdrlklZm9fqeglf95rpJcpTqWow3EHjO0ONV+xHNPD5EReUT3hXCNV+9iHV+jnHvpwn+beCDx4a1ocCrEdpJ6jpHKFrl603/VwBOxwuOz+asyqbtcwysyhhIn2pNt5My7Bfs7/S5sTtgPFlyej5nsapx3sfMnpaQDXo5u6MuW4POxmjpTwJCIMJlf89bbqpVqESzbRs8Z+WER4tzHi7OOasWdFTK3e4297ojPuvtcCPvR3fMF7ZVO8thOeVfJs9Y2ob9fMBO1uXz/i73utubya3zfuMIeVLNGdfRye24mtFLMu51t6/dV4+ntNG9ctzMOW/mzM2K2hkab1iPploqUqnp6pyDYodbxXaUp75AcmLYdsNROeasniIRVN5QexONOISio6PUbycdRKlfUjxnj26Cw3rHcXXBk/KMcT177vwVAnbSAV/0bnGv+3IQ9/tEIOY+ndYTTqspM7NiYcvN+xNCMEp7jNIez8pzVrZCiTc7p/JUsz/q8fnNbS7mKx4eSxrrWJQ159Mlh+M5j08mjPoFg05OlnyYOIqPCe+eYIWaSfMt3y/+C7EZs0uut+npA3rJ7Y15RSoHMTBYxMBgKRLezMkrZmhlYUAii7aKsHaFeR6RvTtKGwlWKruMss/Yy37FMLlNrrY21aS1g2BH7zC3R8hK0vhVJFj2CIQkU/3NtmMY8jaj9B6DNBKsQg0j4SMwEAcUakTlppxUX0XJoZuytKegQyu3yxAyR5GSyi4Frq1qrV3NIgo1YphYGr9g3Dyg9nNsqNuw2PVRWa+Md8lkj1wNyFsHw0jKJixkQSI75GpNsFbRTdEv8dZhfP0cwZJCkYicTA2I7lNyQ64AgvRRPhhgYU+iq6Jf4j8IwQqEUGPcU6rmX2nsQ4x9jPXnrbOeQYgMKXK0ukGi75Hqz8kJKLXTTlg9zk+omn9mUf/fOD/F+Snez3B+RggVZfN7avvgSsXp8nwddv8PEnWrJVjrfWoIYUVtv2NR/mcq8y/tz+q2H0uRJb9FivwTwfoTRpRFrUMaX0ewxJX/R6yDJddf89zv2upWMEBAt7KrV90Qo7xLXRqEfCSriJ/wYxGe++c6eGL/S+M/NoLVuqm17mevqq5FchWlaR6/qVglQrUudXGB8nS84N++OeRsvIw9htZzPllyfrGg28nY2+5x91aUY+1u9zmfLPn6wQnH5zOMcdi2Ad+FwO0bW/z68xskWtMtUhKt+FO4RDZVlHewr3GsihWW6OzsOFxN+R/nj3m4OAfiqv/93g5/v32PW50hhUpQ17x47SzPVpFgdXXGft7nfm+Xz3uRYK0zhdbVp0QqxvWSmSl5Vk45KmdkUjMfXd9n5EJgaSsumjnfLY/4Zv6Mw2rM3KyYm9WmypS1xgR72RZ/N/qSYdJFaomQz4+0JjgqV3NUGS6aGAcwsytmZrkxftlJB/yyf5svewfsF9vRga5VI4RWwlq6hu9Xp/zD+df8cfEU4y3Gu3aBTfBl7zaZSn5WgrU2Wmqc4dlqzFezxzwtzziuLpibsg3XVdzv7nO/u8/SlqxcjUK+USdynmr2t/o453l0fEGiFavaMC9rzmcrjsYzHp9c4EMgT5JPBIv3QLAEklT26Oh9lEjI9TaF2qOX3KKrb1HoXQq1i5JFy/Z/3Cpr25GFlgW52mWQ3sf4BbkaPXeKrF0Lja9o/IraLdCyIJN9uskuWWubfhlYGjaW7JnsoWVBtI1dUtoJnVbCt0Y0g+hS6FH7/AzVNt6HEEhkW42SvY3kMTrzzVqjCwdiLW3zG6ITDS6ajclFdD+cU7s5C3NK5eY437S9GmHzWLsdxv2INunxkaFlHgld+1AtsVUikjyJIgSPxz430YurWw2NX2L8ChcMNjSE9qbpQt2StzkrO8b4Mlq/49ty9dquOB4z5zxVbajquPIkRJS4uFYCsi4rBx82q46ylXPkWUKeJa170fMSDx9qgl9h/QnGPqIxf8SFJULkaLW/qRhF0qqQoofgxcyktZlCipIjEnUbKTpIkWORhBA/F6W2SNQdxDUuglrutvbtV7cqCUIjRY9E7bdVtTnez3F+ivUXKHmCD6sfcxl8wkcI0UpT3s6V8CXhyxW3LvFac4HLLbQub60c5qfi6ut4Hw2LErXg3sDzv94sULLTqgjiYkNHp3y5tc1ngy128oL0LfJD3hXWcp9AKx37UXK6nxeStawuBvA23rTZNNfv7zqDa25XNN58NP0PPgSaYKJZhWuw3uJDeE5qBdEgoXI1c7uicg2uDYMuVEYhM2SQNMayWNZcTFYsy5phv2DQyymrhrEUG5mZc55VaZjMVkznJYtlhTGOPEvI+gWNdRgTj+XpxQIE3NobkOfJK3vE/lyx7gD3wXNazflqesR381MeLc+ZmpK7nW3udkfc7+1wsxgwTIooK7tmTLMh9mAdlTP6Sc4wKcjLKcUsYWVfNlxa2JqHizPO6yXj9jFIcmpnNucIrHvCHAtT8qQ85cHiiNN6yszG+2RX5+QqZS3iU3JtzqLQrXHEi/scgIUpOaouyGSCCz5acIsOuUpxreFZ7Q2H5XizcNHXrQnL2vBFCLSIfVc72YC5XW2Chue2ZNqUjNMZpXszw6l3hdobFibmcT0tT3m8OmFpKxKpGWX9zfGRQjBpFszMkqWtMMHxJqbyiVIMOhnW9bi9O+T+/jbPzqdMlxXLquHJ2ZQ/PDxiWRuMddzY6tHJUzppjCb6mGSDPxfeOcFSMmcr/QWhF9AiJ1cjUjUgkd1Nv5OU2WbC8FMghEKR0tU32cv/FhdqesntlwhWdOcrsaHGY5FIkpZkRbOGl7bcru5kZLK3yZFq/KIlFuHKM2WU5MkOSqYvSRslkiAEWqQtqUkIwbU27vVGNx+d+kpm5pBp85TSXVC6aWuv7q64MTaUbsLSnrV/eTmBCnGHECgkuq2uXJ7QcSVbx6oUV3JaYENwA35DnOL3LmZmuQumzVPm9ojKzajcFBdsu2+RcDnfMLdHNH7V3vDiHr64Vm+s42JWcj5ebGzavfPUJt78lBJIKXHOURuHdx6to037zqjL7naPrkyjXfsVN8IYmHtEYx/SmIc09iGJvk2a/A6t9oh9UYoQanyIvVNCZCgxQMnelXNRIuUWefq3aHUT58+x/pzafMWq/gdCMBTp39LL/3ekHLx0DifqNkpuX/mZiNbqSDL9BUp0ydLfYd0J1p1Sm3+nMv/2I878T/jY8a57nqJsRW9MLWyweO+e7y+5gtBKCm1Y93O9i1l3wIQltbug0GP+ZteznffoJgd09AGqDbTWUjLMcrbSnH6a0dEfMhg8QhJX0P2VfJ9XHbsPDSmiG1kiY15L4xpMS06ug/GWmVkyNQsq1/CxOHjFRUFD5RuWrqTxNqotXrCuNt4ytyXjes7K1XFhUig6OqerCoQXlJWhbgy1seRpwv3b29y9NWJr0CHPE7SUbA07bA06WOc4Op0xX1QEYDTocPvmFjf3BlS1oawN01nJeLJiPFmileTGTh8+UL7ih0NcdDDe82gxxnjPWTXnuJxT6IR7vRH/2+4X7GRdOjp9bW+hC4HSNUybkrmpOBEznq4u+Hp2RDd5OcfMesfMlMxMxco2rGxD5QaY9ZjW9lFFcx/D2Cz44/wZ/zj+mkym9JOCe50bjNJerFK155TxltLVKCHZy4fkKkVfoySYmiWNN+zlW9wpdtnPR+QqIVMpM7PivJ7FypZZ8Gh5TCYTbhXb9HTRmrYIEqGQSnC3s0dHZXzZP2Bczxk3M75dHPLt4vCdf2JvgnVg8ferE75fnXJcXbCTDfiyc8BuNiSVmkRqzusZp/WUaUuw6jYH64eglaSTpQTgsxsjpvdLskTz7eEZF/OSxycTFmXNdFlR1oZl1XBre0Ay6qNUJKV/aXj3BEuk9JI7JGpAIjpkaoCWb5+WfYnLXKpC76JkSgiOTI24alZwOdGo29BdDyI64SUyfynHaGMlHmTsPxI5hqqtgpWt7O0KwRLxedE2/flqyDrzJrok6Y0MMko6Knwb/utCtDgv7YRp84Tz+jtWbtzmaZWElmB5HNE8pMT4Mu7Hpon3kmEJIVsTEdmWjcSVn6tWiqkuq4ZXXKIiWfMbZwbjS2q3YG4vrCdHAAAgAElEQVSOuGgeMWm+b0Oh522Ysse3lSEfHJWbbY7R1SrY1eHN+aidv5iuNiuPxnnq2tAYh1ISpQTWeurG4rwnSzRpqtFa0utm5Fm0ML26Nh5CHcmQO8S4Q4w7JtX3yZJfkiV/1VqZZzg/x4cZIdSEYCMhFV1Abj4zJXoo2SPVX+D8KdadAYHafIMVJ6T6C7r5f0KrXdb11FeeqQJAI9BIfUCiD8j8isY+wbjv8X5BYx+88u8/4RNin2ZCKmNltPFNdBu8bPd+buzxa9v3NurhVeuSPlhCiOPKVUOYEEIbiqzbytS6IbrB+DmZXvL5MHBv0GEr3WOYfY4WHTZ1s2CJ7pseWGG8jOe/UPE1wrqGtB674t+tIwjW8uh1Veytjl0r20xlggsxbLR0DbU31M6gpX9hUY4oneLDSCu1iNWbTKZUrmklPBUrV1G6OhpPtGQx4JnbFefNjLN68tFYOUNLsLxhaStmJsqvZna1meBBvM0sbMlZPeGoOmdpy6hUUCk93aGrO2ivcW2IqbWePNMM+wW39oYsVjXzRYVSktEg5iZ6H6tTq6pBCsGgn3Pn5hZffrbHqmpYlYZvHp3w4Mk5F9MVt/e38B9pds/7xHp5tnGW43LOwtQsbc3UlOQqYZAU3O2OyNrsoOuuhasmYrWzzE21IUdTU3JSzV/qf7oOuYpObbodH9bXo/GOuV1xVk95sjrlj/On3Ove4KDY5rPuDe509riVb28I1spVTJoFjbfspINNgPaLqFxD482mD+nL/gFbSY+ttMtZPeNpeca3i0OOqwu+WTzjfnefmVmxmw2icUtraKNR3FBb3Mi3KG3NUXXBcTVmaWuelmdv+Qn9NKxczVE15uHyiNN6QuVqejrnF70DPu/dJGvdTr+aPWZmVu2YaDH+9VLeNaQQZIlCipRb233KZo/aWC4WKybLkvP5ktPpYhNA3BhLY2MPZpYoUq1QUl5Ws+IJ817qx0IIEiXR+uc3H7qK9yARFC2hEm0fz7vXYV7K4aJLVsBfS+LEC/9exetPpjcRkYSrNk4//Ny2onO16lG7Oef1t23A8ITKTUlll2FyOxpMCIlERTMKv2Jujjir/8jSnv/A612/jv6mq+uBwNwcc15/w9ycULoJPlj6+iZ7+V+h2smXD67t41pxVn/DWfXNa7crhSBPNb1uxmJZsywbGhN7vqQUrVtUfG6SKDKpyVNNliabZmTnA+qlFd1IDp83O4n9TWvHPkGKkj1kSDamFyCQsg+vIUmf8AkfEloocpWTq6I135myckusv77P0QZL6VYs7Iy6DSu/DsYvadwEG0p8aPDB4INpcwB75GqbVA1QIm/Nh/TmaylWuOcM2jwhWGwo22zD87g9LFrkZGqHTI1iJmKo8G3V24cGT3xdLXtkckii+iSyRyK61+73j4EgTtiHSQ8bpizsCh88R9U5R9U2Wev0uHZyDETpUUfl6HdA8H4sMpWylfYYpj2mZsHULDksz/lu8ZTaNXR1TqZSahfld0/LUx4sD3m0OmbaLD6S+tWls6EPnvNmylfzR1S+YScdspMNN6YWZ/WEB8tnPFoeMTNLerpglA7YTvtspT10UCivSRONUpJl2fDw6ZiyMhyfzzm7WLC91aVbpGwNOkxnJfP5CucCeX7ZYwXRAa2Tg9YK6zxlFWVMf4lwwbOyDUvb0EtyBmnOOpuqdA3fLy/45/H33O6OuN3ZoiuzV24rsHbk8+xmPfbyPjtZl1HaZXhNBes63CqG3OttPxcLsLQVh6sYtlt7wzDtcVDs8ov+Afe7NxkmXTo67tc6FkALFSV9raTxOvSSgkHS4XZnl4Nihxv5FoVKN9feuhr2eHmCD4HaWxauYulqlFRkfPiq/KtQuYbTesphdYESinvdfe529tjLhgyT7iZzaz8fYVtCNTELpmbF5UL96+FbR8IiS9jpd9jf7nMwHVA2humyYrasOJ+v+ObZGZNFyYOjMduDDr0io19kcT6XaJKWbCkhNsT8XTKtRCn2Rz1ujvpI/eGk6u+hC02iRY5SbycD/KHXEIAWBUrFi/jNyMOPMbT9gWeFq895PVl7FWo/46z+hmerf277LCQ7eoe9/NeM0s9aI4ycyk1Y2QtOqq9ZufErCdYlgXs13uzT8MzNEc9Wv4/27SL21fWTW9wqfherkiIn4FjZC0p3gQsN0+bJa7cqpSDLNP1uvnGBqhtLliiSRMVGZOfRSpGmiqwlV3kWb7IA3nnCSxeMB1xcOV+vjAsJIlaPBClCZAhSED2e/0zexFjlEz7hw0AJRa4KCt1hZqbM7IyVXWKDvfb5zjtKt2Ju5tSt7Oo6WL9gZY+p3RgbYjahDSXOl+T6BoPkPghBKsXGaVWJbEO2nofHY7B+wdI+ZVp/syFuiRowSL5ACIlx8zYgfon1y81rWl9S6D26+jYdbiJQJPIdECwhyFXGMImEZd0YvyZYHVWQqzTKpcKl7DJXKXyA2IRMpmwlfbaSHo+BSbPgsDpnuHxG4y272YB+0mVuVizsiserY75bPOVpecrclPE983GMZmtTg/M6EqyZWXK/e4u1SYANjqflKV/PH/NgcUgiFT3dYTvtM2oJVtyQiARLtgTryTmHJ1PK2lBWhkEvp9NJGQ0K5ouK5apBa0meJXSKlCS5JFhaRbm5tZ5VZdqerL88WO8pnWHlaqQQDJMC6x1aSEpn+H41Rsu46Lib9ejq6wnWVXJlg2Mr7fBl/wZfDva4393h4Brb9euQqYRh+nwo79JWPCvP+X51Su0Mw6THQbHDl70D7nX3N9XcNXKV0NVxLihfkKJeRV8X3Cq2YwWs2OFGtrUxykgSxUB3cMExSB4QiH2QS1uytBWFejXR/BhQuaatCI/5rHODe9197nT22M0GDJLO5ojs5yN6uqB2hm8Xh4Rw8kbb39QTAuRpwvagw/6oz3i+YlUbnAtMFxXj2YrpouTh0QWJlqRaszPosN3vMOjm9IuMIktIlCJRL/fUvwsUWYIQsDvobhZZPgTefQVLvMk0/223v/nula+zlvAlIm8lerFx2PqKxi9bieCliO0yb8Fv+qI8Dil07LN6QQYY+6eajflDuGITf9mIHmWKLjT4VpKWyKINGAXra0o7YWnP6Sf77eMmXb1DroYbowrjl+2WLyV87wvrlcfGL2JQsi/pJzcZpgf0kj0KPSKV3TY/q2mP65v1eigpKLKE0I9SpCSJN7tEK7SWOBctdZWSJFqS6Ei8Eq0o8tbkQiukfP5TF6JAqV2ScBvrjlFyiHNjyvofse4IJUftY4iUQ6QokCJ7yZDiE/588VyeSiuFc2sJbvCt5NW3GTwO6+2VHJS1WcvPP3VNZc4o3eaG3adxNWf+hAtzzpPyMQJBoTptdcvjcUyaCw6rpxxWT5jZCR5/7RgZDWuWuFATg9x7JPRARVli7Sd44+jpO23g+0b0fM3WWnN4kZPKAYXex/gZJiyRKGxYsrKHOF9hQxXluSKSqIReexcS1H4KJqBETsHbB5VLIRmlfe53b+HxNG3P0rie8a/Th2QqIRE6ZjUJQSo0gcAw6ZLKn3+lulDRBa10NRfNnKlZkEjFWSv3OawiIXQtQam9ZScdksiEo/IcFxyJ1D/aOOpdQwpJVxekMqGr4z7b4DiszpmZZby+gmNmlixsSaFS9vIRN/IR97u3GCTdy8lzyxh9CKSJZm+7x86oi3NxMW5/t8/OVpciSyjy+HDe0xhHVVusjfdl63y8vziPUoIsVSj1l2ZvESFaZ79CpRwUQ347vMXMVOzlfSZNifGOP85OGCQ5w7SD8Y5ektPVLxo4xVDWXCX0k5xEKnyI401XZ+zmvTfanxi+/rwU0XjLwpYsbNlexz36SYdcZRtHvxfeFfIHPkxBJHMD3aGvC3L1vIxQIFECEqk3GW5rl0Xb3ic+NlxdQLPBsXINK1sjhWSQdOi11+FarhlCIJMJQsfssVTqTWj0D10Mk0XJw+MLnpxNqBpLWRtOJguens8Yz1eUjWGTM+ZCbP+wAiVjH2nVGC4WJUWakCVtBau9Bt/1vbVfZOwOu1j/YT+zP1sfxXjDz6Kb39pkou1jatycVBZcGjGsEdXJNtQ0ftEaQ6Skqo8S2aUdHjHY14aaemNa4V/Y0qVBRXQGNBvnwUtXwabta5oxyj5jlN5jmN4mV0P0xgiENgenpPEljutXrt8NIikMOBpfUroJUmg6epvt7HN6+gbJhmxKQvBYX1P7Bda/fAxehJSSIo+rikWesj3qPucU6ANtD4jY/EzK+FBSopVEqpcD/KTokKhbQMC6ZzR2C+vPsPUxoum21ukHbV/W5yi5B3L42kDrT/jzw6WxTMznsd7EnJ6WXHlc7NtsbdFV2xME73PJ6PXIVc5OuofxDePmHOsN5/UZj5bf0vianXSX7XQX4w3GN5w3pzwpH3FYPmFqJu2k4OUV3RDs5ppNZI9E9tCtEVFlz5ibx1T2nER26XL7tfsY4xtStAwUeh8pUmo/oXZjnK9wvmLln22OvxQpieigVYdE9klln6U9ZG4eYf2SXL89uYI4cdtJB5v+jso1uOAZN3OO64t2FTwaS2Qypa879JMO97r77+T1fyw6OkOJLRCwchWNN8zMkvN6ymEZVQtCCHKZkKuUvWzE3c6NmGmEZG6W0e3sA9MGJQS57pBITUflm8rCcTVm2iw2BEsSj/1W2ufz7i1+2b/Lfr5NXz9fvYzZV54iT7h7a8SvPr8R36EQFHlCr5MRQqBbpPR7GfNlzXJZs0qajQzQWEfVuptppeIK+gdc2f6QkEKQSkVPx/yp/2n7DrW3nFYLHi3O+cPkKX+cHDNMC/pJbL2409l6iWBB/Kw7OmUr6bQVsIbSGgRQqDe7v66tza/CBd9uq46y3SSnq/K3NEoQpDKhpws6KnulDHhdUVmTEhc8zv9wj9KHwnrp0AZH4y4zvboqJ5fpS71wunUSzFUSDTveMAfrfLbiH75+zH/96jHWeazzVE00jykbQ23cS+v/wccK56KsqY1FyQrVzueuugq+6xFrq1fwqzu7OPeJYL0XXLUtT2WPQm+hRELlZ8ztMUpm0ao9aBCSECymJQu1m2NCTSYSMtWjo0Zt5tYVghUcdRtE3Hf7NH4Vw4GRbWk52q5XboYLDQKJlnlLnvINQXHBbH6fyA6JKNCt85zH4YOldjOW9pTSjbH+52hmjvlhNjQkxEpgeoWogmhJXwwvnptjKj/fZGi9CpEsxapUnl0OV1cvrqs/e9NVDSFSpBiicSTqHllyirFPMO4Q788Bjw8V0BBCSaIP0OoWIey1Bhj5B1/1/YT3A9OSpcbXVK7amD+44Diuj5jZKbWv8cTq1dRMOKkPCXhka5mdy4JM5aQyIxEa/TNWNxKZMtBDbGoYJdsMkiEQGDexYrFyy7YnK76nuZ1RuZJAa/u9zs16aSnJE4KJCxwiJZF9MjWKvVK+woUq9mj5Vp//GkRzi2jjDqBkhg4FXsbcQOPmGL+8NLJQKUpmpGpIrmLQfOPnOF8/t50fC+vjRAha91SgUDmpTCldw9yUOB84r2eMm1nbhwBBCTJBOxEROB8wzl2qwNvFXdlOvDKZsJMN+ax7k5EeonyGdxLn4z7I9rXX45cPAef95nfrx3offRueK4WiqwsCcKcosd5zWJ4hEMzNChNcW5GUiKDoqi772S4dnVHahsY33Cp22Ur7ZDKDIKitw3vQaAa6y618l9JVDJLec7KcVCaMkgG3i11uZCO20j4dXZDIeO6sJ6Y72ZCDYq81o7jevEogSFVCV+UMkx5baT9KA4NjbpaoNtS9UBlbaZ+9bIvPure4371FX3fa6mGsMnsP3nuCjw5zSgqStnFdynj8qsrgvN8YXhjjYj/WsmI8WdItUsrasKoalquGTpGgZJ9eJ3vn0qSrTQPPy3PfLjJhs+2X4tECP9YVc+2smauEUdbhdmeLAGynXRIhOSynaKmYNiXfzU/jOa80vSRHS0lyJYcvkYqttMOdbswhW5ia83rBpClZ2JpEqvYcutzvGMobNmocJSSJUqRX7sEu+JgtFSxSSDoqI1P6pcXVH4t11lWmEtQLBOvqZF9cIR2hzWn7SM1HgUu5pm1DkEU7Tq1t2deIBmHrnrV4b7gMAXk9llXDo5MJ//zdszc+FptsLutofsaex8Y6FlXzSgfWnwt/tgQL1iRLxQpM+jm1X7Cy55yEmImUq360jRca4ysW5oS5OWJuT/DBksiCrt6hn9xsQ4avDgANK3tOCI6O3qaf7LMO+w3AzDzbPHywMTNLbdFL9loXw7SdwMXMKhcaVm5M4WI4sA8WE0qMr5iZQ86bB0ya76nc/L0esbXcRwqNFim0ZHFlx+RygNeOEAwmlCzsGZPme87q/2BhTrDhx+U+XG/E8dP2W7T5VlnyK6TstVboJzh/gfdLfFjS2Mc09gHa7JMlX5LqX5DoAxJ1m09GF3+eKN2KiRkzbs44qY45rY9bQhBYujnj+oy5ncZrEUUTGiZmTEf12omy5EZ+k/3sFjvpLoNki/7PSLDWPViDZIuD4i6Nb5iZCUu35Lw5ZWanPCu/RwmNFppM5mwl22ynuzwtH2NLSyrTV09MRGva3JIfsXEgffNuVetLKndO46axjytUrS13VBLQSm0uTYdkGzLfOrC2zqbxZX/6DbG2llUT83QS1Tp+KYGWilHS537ngL7sscgrFqbcNGxnWjNIcwZph910RPCClYmTdh8uiVWqohPWIOnyN8MvGCV9VlWgrAKmSqjzQJVaUhknjJfHx7NsGlaNIdWKVKnYfyAlSkoa52icQ0sZX0Mm7KZbyKDYTUfc79zGBtsKKALGxsco7bOlYpP+b/r3OSh2GCRdttI+ucgITjKxFS4IctHhXnGbQdIjCM9nnZvPrWz3dYdfD+4xSvv0dEFPF/R1h47KUUIyTLtoqeionIN8FyUld4pXh6iGljT2dIe7nRsMky73O7dao5F4bkUDl5SuztlOhxsrbNkG0xrrMdZhbLxey5XhwZNzFuXlfSZNYjWqk6cM+wU3dgaUleHkfM5kXvLNo1MOT2c0xtEYi1aS7WGXQS9nd7v3ktz87bGOAwgbQnTFo/MnV0FC6xocrhCqOKleW2i9HVIZr4GbnSG/Gd7EB8/UVHy3OKX2lkIl9HTGIMkZJMWm4pSrhINiyF9v3ebx8pzHyzFhAaO0SyoVW1mHUdpBSxkzLzeVqUs5WaFTdrMuafb8dPR9JNatDTHkerz5c8YbSCal4FIi+Eazr7dfKPhLwnslWB8yb2S9+iBDS7Cy+1zUj5iYpyzMKbnqR+Iku2iZU7kZk+YxZ/W3LMwJIXgS2aGjdzbk6eoqsAuG0l5QuwX9ZJ+lud1WeroQIsE6rr5ibo7wwVHoLQq9RVfvbvrUpNAxFFimLWEb01U7WF/hpKFxK0o3ZWaPuKgfMGmeUPvFe5UrxcnW2oI+a63kFyztOV29t3Eaq92cpT1jYp5wVn9D7Ra4H0Gw3qXmdl19ihbrvyRLfolzF1h/jrHfU5uvqMzXGPuQxn6LkruReIUGIRK0uon4se5A15XfPuFH48UxYm3fH9F2QAnxkp/Mm44tpVtxWh3zePWA75Z/5LvlH5+/aV/djhCMzZjHPLzyWoEve39F3Y+V40Sm9HT/yt9f7itBRHKycSB/k318tQUygEKhpEImioPiLqlMebR8wHL1LePmvK3KVXR1l47qcVDc4VZxm71sHxcsU3NBKrNrq1jx1df/yc2q7SW9el4WE678/9JpNbTugaes7BE2xOpXzD3sty6y7RZDGyaORJK25hkpkuv37U1w9VjV1jKrKmwI5FqTaU1XJGRKs5UMyCm4mdygto7G2s3qapZohnlOL8uojKW2hqVrYt9OCNG6XUq6ScxdGuguvxt8wV/1P+erk1O+Wpxi0dRN3AehNVqpzbm1JlgXZUWRaDpJQpEkyCRBhkDjHMumIdM6VgikZifdYqD6m4m6EoJUaySCi7JkvFq11TRNrmJWTye5HMNWxnBRlsyqikxrcl0wKgb8VXqP7JoA6H7S4dfJPX7dv3ftcR7KXms08GbyzXXYdS8puNvZ517nx8kurY/kqmrd/kKAZVnz6OmYJ0cTfGsFXeQJ/W7O/k6f3355kxs7fcaTJUJIZvOK0/GCpnF4H/t77x2M+OtfHfCLz/bodzKk/OkLa1fPvfVXa9MHF/xzV8+6SrnOYxPtLzaLDlcDcX9gu+HK8zxreXN4brX+uu2+DpnSZCpmZDrv6eqM//f0W35/8YRpU7KTdbmR95FC0E1yZPtamdLc6gzxBKZmxfQiBu32dIYSgjvdESEEUqUIARrvmDYlM1O2+w2jtEOuNKPsemObd0mz1tI/JeR7nUd9WFy9p73wmxfuSZc9xm96LP40jtnHEmj8nitYFYQlhAqCiQ+RgEiBBNY337ACv4rfi5xYTWifj4fgQSggi39P22wdFuAvAAtyFB/k7fbjWxNC0lHb/3977/okx5Fl+f38Gc98VRWqAJBssh/TM62eNWmlNdOY6d+XzGTSynYl25ketWaaZJNNEkChHvmIt7vrg3tmFUCABEGgp5uTxywNhcyMyMjICHe/95x7LqfZL2I9hRA00zW76ZI/7v6P1DdK4cJA5zYMfndgpE7sJ1Tq9FvBFYCRBTN9Tm3O0aLgevgj6/FrQODDROOuaaYrtMg5y3/FTD+k1hcvXMyZrDm1P2f0LSF4muk534SRzfQEK6tkHewYfcsq+xgtC66Hz2mnG95n+kUgqc05F/lvE0vnuR4+p/dbrvpPQYiDhNDKgg/K/8hV/xnX/ef8pfhYCZGh5AK0B6GjCcb0GDM9xvsG7zf04+8w6iEE95pDFi899tjnDP/tv+dfO6bJM46Ofhhpm4G2H5hUj9eW5fSQX+n/wC7sKJsLnnUdXaapMo+SimGcGAcXmQYf4uSpIyuwl3XdDh1Nr9HjKQ8DFOoUJWMt3zR5unZgGB3WajKr0UailcKHQNMM7JqeD4qPeWw+ZqFO8L3iqtkxDDEjftM7THfK6bifuBVuKHmyaWjtFdZqrFFkyaRlwtO6id0U8H6J4RMy8QgrTpGUDF7EJpxuoJ0GBCJJY2A9OHajgrCkkh+BXSGFRwmYm9h48yQ75UF2Qa1n/Lz6G0pVU6iClT1laVaUL9W3TL6j5RmD36BlgRYFo9+gsBTqHCkMo9/STZc00ze07hm9u2byO6xcYOWcwHRIrsR+WbvYYys4EBIfBkC8l0lv9J5117PuO5phpB1H+skxegcIHs9nPJrN2A4932y2XDVRejd5j5YSLSWlNTTDSGV7Nn18QLT6FQjacaQdJy5mFR/M58zz7I16/Gz6gduuYzsM9NPE4BybvmfynlmWcVHXzLOMq6bl2W5HbS2uqrBKct123LQds8xSZxlSwHXb0U8T7TjSjCODc4zOY5WK33M+ox1HdsNIMww06bhHH9+3Kgoez2eclMWdRfL7xlvSK+PoeH6949nVhmlyPHow5/y0pi4yisLgfVwsrrdRBnh129D2sQ/j6bLi1z8/5+JsxjQ5nPOH+t7VouTx+SJauBv1o6bR1o086zY87TasxzaONVNP50duh5bf3z5h8BNPuw3/5eqPPOs3zE3OzBQUypArw1lW8WG14uE9x7312PG83/K833EzNFwPTTJa8Pxpd83n2+e44Pmyueb/vPyMz7dXLLOSuYmmBVYqPqxWfFydsLTlD/pORipWWUkg8KvunNuhpfcTX7e3/O+Xn/LbxSOs1MxMjk09oZamgBJ+s3jEmAIoLSVf7K657Lf8fv3kwKBHc6EYLC5twcqWkVF6aS7VUlKojEJZXPDcDjuaqceFf5/W+t+FvbBRC4mVhkxaXAhsp47WDUwvmXPs2yQMfmTwUzTw4PtrzKrc8snFiv/xV99dk/uXgFmZ8ehkjv43biL+fgOs0IJ/Dv6a4JsYSMkKIWoQRQqmFMFfgrsEmYNYIISJ7w1N7FkUphg0iRlCVkQLXUnw38D0aQzg9C8Q+pcg5ikYSwEWkcGyqkIKjQsTPji24yXPut8nF7E7t0Ara87yX3Ka/YK5eUylY4D1MowoWNqfcZ7/Hevxa66HL2jdNYNvmHyPEholDCv7CWfZrzixP2emz7m/KM/UjJPs54DkaviU5/0fuB6+jPUfSIwsMLJkaT9kZT+mUCt6t6Fzt688pncFgaDW5zwsfstV/xnPhz9w03/J8/5TAh4tMqwsKfUJS/sRD/Jf44NnOz5LdvP/9hDJWlqKEiUfEPSvMOoDjHpMP/6ebvwnpuEpufnvCHzXoP2K4OpIkb8zTJOj7QbW65bnV1tubhrquaWeZSzNI2bqlJGJdu15tuloCpjPPEpKtrtoyzyNjnGaUFKSZalnWmJi+mmgGzVanPCwOOWjQmJTW4CuG7maduyanlrlzFROkcW2AM4Fnu02PNtt+XB5ziPzkEJmNM3E1WbHtomF9L1zGE45YXHIBU7B8CQ03JqJqsqoq4zFosQaxSQ87TTRjAHnl9jwcyxndwGWE6xDy2W/5Xm3QwnJ3ObkyrAZJ5pRQ1hQq5xKeWptqYzlNKs5tTWVLjAyFnDXquaD4iOUUBhh0NKgX+pL6ELHOMUm4XupoBYFWlZYtUASA6zWXbIdv6SdnjL4dWKpZgeWKjYZBx9GRr/Fi9jjShIbrL+vZMToHM+bhj/d3sY2DyHQDANXKRgJITDPM57vWv71+RVf3W4O2f5CG0qrmdksBViG503L86bBKMUyjzUnl7uGZ7sdgztlnmWU1iDk97tubfqeL25uue27uBhViqum4aptWRVFqk+RPG8avri55aQsokRQKb5eb/jyds0Hi1ksCAeeNw03bYdLTMi677lu2mj+IwWrsuC6bXm63bEbhthI1Hmu25brtuPRfEZuNHVmsYB6BZP1LnCfYXnbwXKcHM9vdnz65XMyq7GUUIUAACAASURBVHl0vmBe55wsShazIknm4PefPY0B1s2OthshwMkyNh6eJncIrPYwOrb/MObbbrQ/FK0b+Xx3xT/dfMUXu2u+2F2xHrtoNuAdm7GjdzHA2k09/3T79aEmaWVLVrbibxcXGKleCrBa/rC55F82T/l0e8mnm+cMqRls60bWY4cPni+aa573u0ND4FwZapNR64x/ePALFqZ4uwDLllQ643Zo6dzIZ9vnfN3c8vn2OZlUPC4XaCmTiZhiYUsqkzF5R6ENf9xexfPRXNFMI60bCCGyClpICh2Dy1/UZwem6+XkixaKQlsKlTH4iZtxx27qvhUsHBEhiHLyTMb6Mh88u6k9GPvcxz646v3EmAyf3qRWqS4sn1yc/Flrqd4WpTU8Opn91AOsAfya4K/Ar8FvICwIcgBRg3CRkQot0IIfQTiCkCk4a2IQtme1QkNwPcg6Bmn4xI41gAMUAZm8+v1BsyyEwQhDLk+p9AeMPiDJkWjGMDL5ESkMVs5is0vxEM0FhAWD14Qw4tnLlyrm+hMKdcZp9itW9hNA4oJDojFyhwsDVpQYWXKSfcLKfszcPoryQe4cybTIqfUDfIiDaj/d0Lo1gdifolQVWtSEsCKEM6ycsbIbrKyx8gG7yTN5x2aU7MacdlowuJ7dVHDdTxS6p3caqCGc4H3D4Je0k2QrR7YjNJOmdzXOP0DKnM5ZNuMAlMxMzFQEPEpoJt8z+S4Zh1RU+oy5+YCV/ZjObXBhoFArCr1K3/PPgxAGfOgJYYznVkgEGoRGCIsSlhAKlHyOFHUK4B0+tAQmXr8I0If+WUKoeCZ8i/PPEcIgRQmkgmx8rDdJEssj3gxdP3Jz07DZdqlBqKGwOaXN0TrWYgzOMfkd22FHG0aCbxAImm6gbUemyTFNDqUk4+jQyR0shBAbjNoSpSXCC0QDZWkptSUXE0GUaHqK0ZB1htoULOsSYWAS1zSjofQLSlGhkAzdwHrTxj5uzQACjCqwQqTj8EirsNYgpaDrRqbEkM1nOTLVBFlpKVRNrU+Z6SUzMz/YrXduPDwC4PAYqWinkdZNGJFzamexeFyQHKMWrOzi0HwTIFM5s9ec9z329VBSmFjHiMKoeWo0vEDLMtVj5lg1J+DQvsSHkUydoGSeGsoblIz3iUwN5pXIEIeALskQkRg1S86scQwGgZE1pX6EDyNWft9R32FykcH6ZrONbnpS0E0T7TjQT47eTYwu/tsMI7thSOxmZAb3Fu3DFK2E113HbdsxyzJUKaKUTwhG5xncRDdNDJNDGPG9jmbdNHHdtmz6nrOqYpZZtkNcbI7O0SWGKQTItcZ7uO16fAg82+143jSsymiu5ILntut5st1G9knKA0tlvGSYHJPzbPuBy13DdhgiyyaiXLAZR7pxZHTuwN79OfCirPSHIbrHijgGjBNtN9JmI0YrvE/GIZMjs7G3ojU63Y8SYTReSYKPgZg2sRUIgPcB0vNegiDc1R1G3WiUIPpYNyhTr559HdTe5RYfUA70JCkxLHWBlSquFe5958lHx7UxMafT6PFKILzATYFtP3K52x2MCq67jm50BC9QIS6ah9HTDCMgeWgXFFV0ixRCMHnP4BzeCTJrWNgSIxT9NHHTdTjvGb2jHz0Ww4mp+VlxQutGbDBc7ho6E90VTaofrLXmYbGg91MK3jTrsY/7lioxUtHRN1OSDM15Po/mGdJgpSaTms3UsR37KItERMZYW0pleVgseJDPmJuC7CXr9UxZTu2c22zH190VN8OWy/6Wp91NbAwsLZkyhzWGC3Et5AkYoVIt3+v7Yf1UcD8wtVKztBUndoYPnifdDTNdcmrnVCpLdWeCm3HHzbjlaXdDM3VJyfz9iePCGj44m6NkVH9MLs53zkXZqtEyzr0hXsd7iW8/TLGFQmERCHwyIrJGY61inNxBxruXqTvnUmuFmEwScFCDOB+Yxti3UOvYbsEnFYtP96jRCiMkXTsSXPxizgfabqDrxtTSwWJtbGL+vgKx9xxgjYTQpuDqJj720iop78n9VAyiwghhDX4Chvh/uUCoD4FAcE8hXAMVyDkiNAS5gpCBWIJc4oPBBZF6hcTiWC3jZCgoyeUjlqZmYX4OdIx+YnAT8TfQEAyKObsxT/KLES1C1IR7T+CEi/w/oaWn0ieUeokSBbV+hAt9WrC7uOAQmkzNKdSKLPWOug8lDTkLXFBIOgYHzvdoAbmMLlEzUyKZsRtrrJxxnv9PWPUfGN2Cy26inUaaSdO4Oc0kaaeaK7EghJ5aKzJt0PIBPgicL2inGTe9xvmW7RjYjBnN9IDBZYRgWA8FmdxRakWpV9gso9Kn9O43eKbE9qnUY6wg1wtyOedh/lvm+gItc+bm0Xtl2F6GDx2Tu8SHLQKFSMyVEFUMpoAQJpxfM/lLnN+CkEhZIbC8LhQUwiBliZRlel/A+xvG6QtAoNUDpKgJYSIwIckQ4i+7GeFfGpp24NnzDePgWK0qVsvVCwNv0wzRIUwKsswwTY7NpksLrJAGZdA6BhshcBj0nfMUJ5YHD2YYo7i83HL5fINzJUrJwwBtbZQbtv2I1pKTVYkxGqkk3u+Ly8G5QNeNbHc9boqTgVLiYPfc9yNN21NXcy4u5kgpuXq+5ea2YTYrcD5gjaLSGZP1KYtdsrQVS1syMxm7qaebos1upjS9n9hNfRp/Ymb8PJ/xsJhjleZZt+Wy2zK3RXTm+oHQsjhYpSuRRwdAUaBkcWgwLIWhMhKrFrjQ4cOUalRrjKrZO6eGMFHoFuc7hJBIdEpM7BHZYJUMLpTMkGkOyNQJq+w3BByZOnnj43fB04wDV22LVZpcR3mnkQptI1sQQgyorFIxYJLRFvqkLDitSjKlmLynn6Z4TRHItOa0LFkWBaNztONIpjWT93TTdJAXfhcm72nHkdF7Kmv5YD6P16dzKClxIdCOkTn72XJJM47cpIDsJjFwhIDVimEKtNPIVdse6st8gEwr8lS75UOgHeOietvHmi6rory9NIZc67TA+csvVDdasqhzHp0vePp8y9dPb5mcpy5jk9LJeaZkflGVGRdnc1bzIgbD/UTXDAz9xOQc3gXKOqOs4tg8TQ7vA1pLVOqrKBKb5Z3HO884OMbRIaXAWH3Xp9F5lFZx3AiKczkDG/hlccaoPF7GYO0+IdOOI9thYDMMbPqedd9zkpecFPH+H4fAZzc3B6fJCUdOxs/yM071jL+pHvLVZs2f1muEEHw4n/NoNovXoJJsh+Egff3ZYsnPFktqmeMm+HqzSbLZCSc8pcj5KD9lpSsG5yhCzmfXN1Q2o7aWmbXM8xxjbZTvITnLan49v2AMjot8xmlWpx5SL17/lbZIMaPQlvN8xm+Wj9L66o7xkCImmIyQzEzO3BbUOqNQL66NKpXzqDhh8CPP+zXXw4av2uf8Yfs1gcCZXXCSzdjbcnV+YDfF9dy+3YKR6o2kvD8VFMpyli14mK9o3cDnuyfJ8XROoaMDrpGKp90NnzdP+Gz3hPXYpOXP9zPyRWZ4uJpR5xm7pmfb9LTtSNsNeB+o84y6ymOdofOstx3NTcfmpqE+XyRpsqDvo9v0clGynBdsdz3X64ZhiCY0SsmYwBxHwjjiJkdAUGQZq6qk6ye2Y4cLnlIbysIwDI5+nKIk2HvUBH0zcn3bYLVCpM998mzNN8/WPDyf8/B8wXJeUBb2rzTAYopMVNglyV9im4KND29joEUALDCA3yVGyxNZqQzkOTCCexpZMBVAVCBnkQlDIEQFomDy0CVXpinEwlajFFZKfDAoTinkCVZGKUbvHJ2LOvW9ne7gHe3k6IXHqBEl4v5iw705c/uAUpukY5fMzJKFuevb9KY3tRIGpQw+ZEgGRhdPRW5sGnRipmZ0jq13zEzGQ/sxZ3nFl9sbnrY3bMae3kl6XzG6nMEvWQ+GwQ20VnCSlcxtDUHjQ8UwSdaDpHcNu8mxGw0hrBCsEEHSTBmX3Y6LYsbS1mRqwcKcp98Cvl2T5CB4cvuI0+wxsX5OpPdLvveufQcIocf5ayb3LLFHAiVrpJgjRE7MTDom94zJXxJChxAFUsyRsuJ1DoJCGCQlStRIWSNEntwIP4v7xKHCItpdM6HkMpkJ3DEoMKYAzAEuORre4vwmMWiOwIj3WyZ3tf/k5OpmEgMg02NKnxX3FYPG+/uKxxFCg/PXhDCmfcm0L3NvXy69N9Y5huDx/gbvN/jQEMKQWOAO528PxxZlZAZSL7Qfy9gN/cR63RJC4OJiztlpfcgQ73Y93geGIWb5jZYMw0TTDpGpUnGBJBAIySHL7H3MeI9jtKud1TnWai6fb1lvOkyqidIqOklppej7GDjVVUYIoJSEEA7s2L6fRj9MdO14uAWklGijDlnvvpswRnF6UiMQXF/v2Gx7+mEk+BCd7WQMAmamiIuM9CiUZTcN9G7CE9BS0ntopoFmGg7SNi0lp3lNLg1X/Y7bsaWdxm9JQb4bkelVFBT6AaW+iH2wRH0wprifHTWy4tWm3HeI17sn9sOT7I0z3gSZWpKp5Q84/ggfYHSedpySzCXEWjgpMUpikrxOCoFRkkwrtIrB0TzPOC2jI9pt17Pz0dQihFQDYgzzzFJbS2VtaqQa0lzg0fsFsfOMwjOmecdIma7D+Pq+yH+WZYeaKp+en7yntpY6s3y13vDVes2TzZbRO1wIyb1Q4rzE+UA3Ti9UgBqpyPXdYjcGio5umpJRiUaIyJBZpe/VXf1lR1hKSWZ1TgBuNx27dmC97bjdtBitGMfoLni6qvjgYskHFwsW8wIhYv1Ws+vpmoFxnHCTJxyy4zCNLwZYSovIUpHGDxdrM7tmQEgRxwqjcFP8rY1RWKsJwNxlmDCnKnOqWYG1OvZqvBd83LQtl03DZZKHXqmGRZ6zyHME0AwjN7vb5KkTyI2hspaFKbB5dJz8V3FFNlyihOA3iwf8zekpVmusUlw2DV/oW9px5NfLM359esp11/Fku+W63R3Yy/1nLnWJt7EVwfO25av1hsr2LPKcqSwxSjGzllplFMZwYWepB+WL43wIpMbCcXGeS0MmdazJKlZEThD2V+v9vkffh0JbzrMlo5/4l83XTN5zM2z5onkGwFBMiRWL5GM79dyOsVbN54Fc2eT++W4XzmFvhb7vnRg8jevZTi27qaP3Y7KYd/GYhl3cUJCs0WPdmhCRz3fBMwUXTVHS39uxpZl6ej8m2/XovLged4x+ivMOMiaR7u0rV5bzfMlmbPhs94TL/pa5KfmmWx2kg1Yavu6u+GL3jKf9NZ0f0eJFK/fXITOazGiWVcHNbYNFcusgDHGsmmUZp7PywC4zep456HcjBskqBVib0BE8nNYljx4seK62TG2sSzY6Xu/oEB+jY5omvPeYICi1QUyBHokIiYjQBjlBwCGRBCWRQjD1UzxOEyXBTTvw1ZNb/vXzZ4fETFlYMvv+ZKfvOcByUSYIyYTijBg4+RgoSQ++vXsu7OVa+4V5XAQcnLlewP72HSG0hLBF+DU3neNJO7JLOtFoyxlvNJNscAVJRuLGxABFadncZlTGxiJAH6UAPkkCXJp8N0NPM43J7SlO1LXJmBmLVfqtvQ/2mZjaWB5XC2YmSvWuuiYFih4lRCrejm4823Ggmca0KIjHue9b4sMd6zalLH+uNFPwbMY+BWYTnZtYZQVneYWRis3Y87xvqI3FhYoQdgT3jBBu7v0mGULkaQF+S/C3MZAROUIU6VEiRBlr7Xi/DR0D0Trehw1uumTyl+yZ0X3AFW2Dt/iwQQhDZn6NkRcY9dE9GdPLv4kCYVHqlNz8HSF0gKIbf8cw/REpK6QoohQRTW5/S27+Hqn2LNbE6L5inL5i8s/x/prJ3+D8Nc5dMUyf49w1IfTsuv8N569JXUpQ6gFWf4hWD1FijpRzJveUYfqCyT/F+3Vi5J7h3CWj+5rRfU3wPU3/n/GhR4oi7ksuMPpnGP0zpKxQosb5NeP0BaP7CufXeL9m8s9x/hmTe8LoviKEhm78R2gkWp0ldjDH6J9h9c9QchkDT/K3/u2MUZRlRtsOXF83TJOnyC1FYWi7MQYomzZN5iHKEZIb3b7O6jBxpyRcCIHgQ2K7Wr55cou1mq4dyTLNNHnW6xaZ5EfORTYMBM552naI79m03K7j4+a2xaQsttaSYXSM4xRdtUqZmLABrSVSvl0dYpxcOy677cFtbPJRfiGFQASBTBP1j01bSGEwoiQIH6V8RLOfH29EIVLg/eeR5hglWRY5Hy0WdNNE72LGXCanVq0UmYkL0TdZbO1TR9th4MvbNddtyzebLU+3O4q0n1xrJu+47aIE8LJpkvWzYHKei1mdLN01q7Jg2w9cty3/+OQJl7uG501DZS2rsmBZ5ORakxt9kCJO3pNpwzxTVJmNtYWJUXs8n9O7KbJbxLMdkwSS3GhWRcGj2YxMq0Pvmb2MVEmB1Sq5Ff5lN9lVUlJkBiEEn3x4QlVaun461Js5FwPYsoj27ItZTl1mIARucgz9SNcNeBcI3nN73bC5baNU0ERZ0TQ53OiQKdCymaYoLDY3DP3E5rZlGCKLuJ9fhRCHfRACXTvSdyMPwoKiyIgChhev/d048s12y7PdDuc9RqlkztLhQ6CbJlwInJYlZ2XJ5D3bYWDd9zyoKpZ5zjLPWeU5UkqWRcGyiIkBJSWZin2m9vIoiIF2N45M3lMawzzLDo9mHHmy3XLVtkkdIHHes+l7tJQssjh/7TaRfZBKUs8Lyjo7fDPvQwxcQ4jGQuqO4SPcySr3PcykimOk0m82LsQarIwTO+dvZo/p3cAYHJ0b+HT7DV+3V0kiGBPb+3KQXMW6sLNscQhY3yWm4Hna3fCku+F23LIem/TYsR4b/tQ+Zz02TN7xf13/f9yMu4Nz4Ymd8TBfcZotqHVOrQueD2u+aa94PmzYTR3bqeV62HA9bHnW3XLZ3zL4if92+ymDH8mkQQrJzBQ8Lk55mJ9Q6oxSZZQ651F+cjjO3dTRu5Hf3f6Rz3dPkwGKxoeYhFqamq3pUERDEflDVEeCFxQjU0pAKiWxNo2Fo2ORGKr5LGc+yxlHx3Tr6fuYAI1JTE/bjWy2/UEWXFUZjy4W7Jqep5cbbjexr51zyd/WxzVA14845+n7KEXMc8PJsqQuc3ZNz2bXM6ugrjKMVizmeRovCuZ1TlnY99pw/D1LBB2EnnjHrUCewt7Qgi34AdhFqaDQcKiH2U9zKj1evinT68HHAC600VEwrLntBz5fd9wMPkX48rBJbSyLrMAIyZNmy9Nmy2Yc2I0DudZ8VC94XM3vPi7A+NInN9N0yA4aqciU4rysyVJvk7ddWNwFWBkfVgtmJuNf1pdc9Xd9Q3KlDxnR3jt2UwywJKQsBsiUjfCEGFwFxxhcynBodtPAduxp3ZSCRs95UfOonGOkollfctXtOMvLmBEPW7z7Aue+YM9+CFkjxAKY8O5LnPsTUiwQcoGQS6RcIcQKqUJikN4zgicw4P2afvoD/fg7nN8SQp/YnsgIKTlHigWZ+SWZ/jW5/Q1aPkC89jaIfYG0PCMzfwcE+vH39OPvEsszIVAp0KoRKKz+BDiNh4VjnL6iHf4Lw/QHhumPTO4JIXT40BFCjw8d3q/Z+f+VdvivCBGZpkz/mjL7T+QGhJZIZkzuGd34/9AN/8zkvmJ03xBCG9mr0EfWiUDb/2f68Z8RwiIwGP0BZfYPCGHRnCNVjvO39OM/0w7/dwwC3Vd4vyWwP7aBEAa64R8Zxs9TQ2aDknOK7H8GBFaDEDbVSL4dtFZUhWUYJq5udjx9tk5SwZK+n7i62rLd9eik794zSftsdPybb7mB+VSfsdl2gCCzmsl5MmsOAZYQ4hAQ7Qfs/WDfJ2btdt1wc9twe9tQFDZlvhVdP9F1E8ZotFYUuSGzGqVS8fwrk0Lfjcl7NmPHs25zyE460uKOOwv1u9aQb4/YhqEE/KEn376G8McFRy+bwrxfGKlYFQUfLRY83W15uo1qhH0AoaUk1zo2p31jUwPBbhj48uYWKQQ3XXT0u5hVWKXItKIZR9Zdz1XTcrlrCIEo8XJxAb0qcqxSnBQlIcBN2/HlzS27MdaBPZpHideyyA9yQyGIbnHeM9eak7KgshYt44LltCwZnePZbnfo96VlvBb2TNayyHnkZigpeLbdsRmGtP+UZNQx4HzXDXbfNaQU8Z7KDFVh+ejh6pDs3COEgJSx7k5JeWg87Jyn72Lgs0+4tE1LuxvIcsNsUWBzTbPp2G26KPkzimqWIx7MyArD0I9sbhu2t21kwoYJbTXG6kNAAYGhj06meWk5eTD/9kAEh4Dmm+02MkNZxpRkp5NzDCl5WlvLx8tlvN66jt0wcJ4CrFVRsCqKGGDdY7+AlDwQd723iNdiO00Hx8qTPE8MasZXmw03XceX6/XheFwIdH2PAC6qWCvebDqefX2LNgopJVluDsmsaXQMfTSRsZl+4TmI47rcB7GTi5JrKVKT6e+HFjEIFpngV/UHlCrj090TPt1+wx/7Z+ymjtb1hwArl5Za55znS86yOVOIi/fwji9zFxxPuxv+ef1Hvmie8XV3xVW/pvcjvR8Z3ETvR3ZTx+6q559vv4iqBaH4ef2Qv198sufzqHTO837N/7v+kj/svo4B1bCmdwOdG6O80se15n+7+YxPt1+jpcYIxUW+4r9f/QIjFIE5mTSUKuNxcUqlc5qp53rY8E13ze/Wf6RxPVrEbT+uzvmkumBpa3ZThxSCIjF+PwwxsI1y3Xi+tZJkmcYajfOexSwGWItZwaLO2ex6nPM03cCYWmVMLhpdbbbdIXm6mBc8vliw3fU07RAbh297bm5bitxSVTEw6pLyZByj0iTPDCeLivOzGZ9/ecWTyzXWRIdga3U8jnmRAr6CqrAHefD7wPsNsGQN6jGEJUKuQCxAFARRE4MpHR8H1789ixUXxQBCnhIt3QVCnRGEQshl3EZWCPWYIGcIeRYlgsHROU8zjmjpktuNTE5MgiL1e7BKEUhSEG0OvUkyrQ/MjhKxDkILeXguBDBJPz94R+tGFllcYMqXtNc/BCJlo0ySLloVl1GTd4dBZAyem6FFCsF139BOI5OP3zGq6+/JehKVvR2Tm1SauJ0PkRFLvTMgZsSt1BgZF1eT94fBOtottwS/SUGwjoSjDBAmgt9GBlHkEAZEkntGt8fX1ze9SwiRo+UpQfcp21/cydz2ARYSKecoOceoD8nML9Dy4rUSwbuJXCBlhdEfAjK5Ei7xvkn1dvHzhCgw+oOXAkqZ2KMPU83XHO8/TJLBMU4AyWFtXztG+teoj9DqEVLOU12XQMoaox4TzIRWK7R7BMT6rxhkhnTECoRCoBFCo+UZRn+Q9pWn75Gj1QXW/AIpF2h1ngLSCYJj3xpTpCSHSCydlCVWf4xSy8hU/kh2ssgNq1UVXf36iWGcmNU5VZlhbZQ3VVWG0rHewPmY8QohoGSUEu4zy3tMk+Pqesc0efLcMJ/H/e3hUv2GECRbd3HIwtVVRl3HxcvDiwU+BB6czZnPiigKdZ6uG5FSUM8yrI2DvPeeLDN88HjJalVFJ0NgtYySicW8SIuyCC0lK1vwUXXCaVZhU1H20pY8LpdJSiIji5Xu1zQicpbXaVxSnGQVP6tOOMkiA/2mULIgV6dAQMsaJfL0G7+9nfq/Re8RLSXzLCPMYq1SaaOkWklJrtXBmW+WWR7PZ+RaxwW5kCzyjEURG+lapSmMxvnozpcpxbIoqKxhUeSc1yOP53Nqa7EqFlqX1vNwNqN3seB6nmUsi5xZFoOi0hhOqxKrFBvbs7Emygi95zSxV1apw/W7P3taxWN7PJ8dnAwBlkVkEDKtqaxN94CktjZ+DymorOWsjHXHhYkB194U40FVUhkbXdvew29R65KPy0dJvhSz5Y+LM0r9wxMw+3Mi4QfXRyglY91UPzL0E0P6dxodeWHIckNZZ3gXx5JxmGibgRACRZlRlBltM7DbdDS7Hu98kgOLuOgn1mo555nSws77NPa+ItkT646SXDWxOiqZSYxSEsbxsBbZ19OFVK4ghMDcC6B8kqF2icGEyJDta7vWXce672kSewVxvZIbg9Vxjt8reWwK3EOSohbGUFobe7gRk019HwNVYzdM4xSNBJxn6Cf6Lo17uSUrDH1i84QAmxmM1Qc1QTXLmIvqwGx9n1xQJIMKKzWrrD7I/TJlOO+X7Fy0IN/bWGQqBhgrO+NBtjgwPUIISp3xi/oR/3DW8XF5zgfFGUtTk6lX974sVc4v60f8L2e/5ef1Qx4XZyxMldplCGpTcJGv4t+6YJOvDlK/fYNtkVgriTyUkjzKT3iQ2Csrowy7SkGhC56FqXgwLnFJFhjwBwMKmXp3KRHryk6yGef5iirta8+SCWWYUfBBccroJ86yBVfDhsb1KGKD5Q+KUx4XpwQCK1vTTD0P8xUX+Yq5LrFvPI9EiaaSAi8F/Tix3nTMyWOyMY1bzsWedv0Q75WQnD23u56nzzZc3zRR9j/FmkctJf0Q99W0QywRICClQEqFUnfJS2s0mYFWxGtRKnGQ8O6Z7kMiRsX1bTTH8QzDxDjFUgP5nlis9xtgiSVC75mpDISFsECoR5FbFPfrefaSv5fSvqIi8u4G1AcpkKrioYsF6F8iwhilaKIEHD7somzOxyAiV1EmWGjDMsspjWU99FSmpdAxK1MZy2leMjOW0Tu6acQqzcxESUjnJpppJFeamcnwBK67ls0wMLgYBL2tdGdfI6CFSJPfi3uRUiT9v+ey27Eeep53O1oX+TUVoowyqaQOmLxnM0QXnyiTFHEQSJ+p0vlX3xkY+lirQ3LoQwFjDKzS85Hp0Yl9KRBygZQn3JmYvF9IWWF4jJJLrP4Zzv8PxBqlVNQGRBbLxroqUSU2a2+C8d3HKESJUY9QYoHVH5L7/0ish9qzKTrJ+s5QYn63HQqtHiNlTeZ/HdkmyTyP2AAADh5JREFUhiRb8Lx4rQsO7IEQqe5rgRL1IcDS6hwhLFb/MrFgiR3+jn3FySyP9WFyicAi0Ci5JDN/i9aPCYlNuztf/qV9xf3FCVEf9hVZrR9n6lEUFqkk83lxkJhYozFWEXzgZFkxuRgMCbl38oqHeX+Svn/99sMECJpmYD4veHixYLksDwHK3g0sbhef3e/XGHUIjvLccHGxODgOrbcdzm3YNh3zWcF8VjA5x27X0wDnD+acn8+jrjuLk/f5gznzVEhrzN0gboTiLJ9R6oxcaQoV5VAPizlzU6R7WaQR8UWHp1wbSmURQnCRz5npnFLbNGm/GYyokFoTJ29zuIb/nOzTu4CSgjqzZFoxz3Mezup7C5z4mlGKRZ6jV5LH89lBVhcTWTGInwpPNxY0Q2Qb6szy0XLOw9nsIA+vrWWWZ2ilKEWU2xmpeDirgbiQtVpRGhMTZOn/iyxLPauiy9neNbDO7rLG++tREs04VkXBh4s5hTFJGQHzLD+wVJ2bpXsg1pbVNu6rTM2Q68xwVkUjg71EsDAxMHtfv/DS1Pzd/GM+Ks+RqbdRrQtq/X3Ve+8W2iiKyjIO0eyi3Q1JpibICkO9KJgvy1R/JVlfN7TNDu88bdPTtRnNtmO7bhmHCZsZbKbJckOW2xRYRfZGpCTPXXL122d3X3/XjnG+Hvd1d9YegqDuIGv9NvalCr2LBfzbYWDddYfXb7uO666LDajTYzcMsTSAuwBPpujPKBWD8jwGvpP3VMZQW8sqzyl0HEdCiDLAIcmwbq8ahmGMJiLtQNtEc4OitOSljee6GSL7WGUUZRzbpZScPKgxmcHmJgapb5iMUUJS6wIrDZXOeVye0bsh1i15n063SPVNkkwa5qaiUDY2aEcwNyV/v/iEx8XpQZpXKPvaAGtmCv5+8QkP85NYJ6tLSpVhlUEJyXm+pFI5n/iHUbroXap3vDNE2iuS9oGiEIJSWWodLfCtjA6Ip3aOnWs+Kh8w3GOs9pLHwzVwT8EghCCThpkpmekXzTwkAisNj8tTZqak9+PBqn0/7pUqj26zAXof+2QVKlri7+u0vg8xSIpzstYx4dR1E8+vt0gpUkIzyvS7fqRpR7a7jmF0h2t6ve0Yk2lV0w6xzkpHp8C2Hfn66S1dN7JrovNqlinyJBveo8gNZWG5Xd/JXV++tg5Jj2Qw1Pexjnu768kyTZnbg/Pwu8Z7DbAii/Hq7tx3CC/9+x0Sk5cXc6KEQ+n1fqFlY9+XlKXJVJROFDrqkGc2o9SWVZazyUukiEXupTYsbE5lLK2boiOV0lTGUmhDO03sxiF2PNcxM6OlTLI8cQhg3gZCCAplWGYFtYnF1BJJno5Jp94ZSsQFV+dGhBBU2qJE1GDbVHt1/+Ly4S77vd/H/jGlwSVS1RadMiSFMoe+O0oIotV5GeV/2CgJS+c6oJByQRAWIeZJIjhHyhlC1m91Lt4GUmSgMhSr97R/C8Ki5A8rwhdCodUK3tFxKREZuHcBIaI74vcPpe8XNlH3h8CJu2BJvLT4fGGE+I57re9Hdrue9aZluShZrSpOVtVhVHkhqLq3z/uvAdT1i5n3cXJYG3toFYVlPs+jDW0XF1tVlfHgbPYCU2VMwfwV9hBKSuYymlvcx8KWzM2bf9+FLVjYH76AVTJD8dfveKmkpEiGFPWrfs/0b2miSuG7MFjHIs+prGGe5zyoKj5YzO9mpH0wT2QbMqCylovX7E8TA6lg7y287i2SINkZ74OvEGItlhQsi5yTskxW0/H92kqKoAlkr/2eViusVoRgXkhX3n/f+2IaS52/FVv1rqG1Ii8t4+Do2gHTjNF4QknqWUE1yynqjDFJ2oztoynFXvxBqiXJNNooyjqyWvtAq29Hml1cPB7Yc8EhcbM3fdgjU4pVnt/91t6zyDKWRZHqo2Mz60JHJsJISWVt3FZrBDF4L41h8j4mSv2LhflZqg1U6TUhxIENyxNzpdO1ZFPCYR/07wO+ZVGwymNNINx9n70M0vvAkBitvo1218EH2p0hLyxdN9C3I0IK2l1PVtgo7Taxvm11NkXbfPnmhepSSHJlyZVlbn5YT689CpXxYZnxYXn2Ru/PleXD8gEflg9e+frCVCzM961r3wy1KajNu01AGKFZ2Rkr++btLn4QBCgVA6s8M3gfUtNuEQOv9DYpJZnVsam3lvgQyYKyMIc5ve9jQJllcR1Q5LEPJQjGZEZjrWIuc6rSUhYZPtVXKy2Z1wWzOj84gVZVdjgWazV1lVGkAEoqce94ooJtbwP/vvCeTS5+CN520H9xO6MUpbFIKTnNC1ZZauioJHUKloyUnBblQXohU1YnTw37Ig0cZR6Vtpi965TNDm6CU/BUJspF5jY/0KFvAyUkZ3kVM5DaUmqDkYqLosZImehhcZfRDoEx0cixt8Sdc+F99isQDsXyUkT9cyA247yfHVnaIjJ5CB6VMwptOEnnTYgZSn+CkCvEQc65hyda8U+RyRB5DKzEny+4OuKng+9b973pCCGlZD4rePxoSV3l5Jl+7bY/ZNTJc8PF+YI8N+hk1ay1oiwsSqnIkr3DxetfF5f0b4+Xz9cPPX8CqDPLw3rGLM8ojP6udN8P2/e94Ow+fAhs+4GbrmP0nrOqRKXarNfNKOI1f7/t+35q0EaRExk9azWLVRUDISki21LYWJw/OvpuQCrJ4qTEWsPipGI2LxAfnlDPi8hqWxVrr5Jr6e3VlmEYoYmfJ0SUDI6jYxpddCe8J7OqrOXhbMY8z6M8KQQKrSl0NBxY5Dmjc5wURWIfMz5aLBjSc0IITsqSvz07w4XAMtVT7bEPprpp4iTVak3eR1MMEWWjhTGH7H5hDOd1TWXtgZ3NUguDfQuA/X73zsjAQX4lhMBmmtrHVcRepp0VBr8IB/mkdz5W1QeS+UU4vPeIv14IRGSS5rFOchgdzt0lG+oyw6ZG3o8fLanKjNksZ17nhABlYRlHd1BmHGq4iMmR+5LgvZzPhygBN0Yl+Wxc02aZIU+B2XJRkllNXWYoJTlZljGgyy1FHttzPDxfYIxiVuXM6pwif78mFyJ8d/T2Z/ByfdVHvOkN+O1tP1vf8On6Gong4/mSD+v5C8yOeGnr+99/n12Mgcldtk/AoSbpWbvjyW5LO43R/UlrVimQy9TbxauvytDf/f8u27O/IA/PiPvvf905S3sJL2fE779HvPIz74dqL279usviLk96HESP+CF41Tj0MoP1qtdeBe89XT/R9+Mhy7ZvMvpj9xv15J6m6WmaAWs0VZ2RZyZpxH/8tf9Dj+uIiO+ay97k/Dnvebrd8XS7ozSGB3XFIr/H8r0mSHqb49ofzzA5vtps+Hq9SYvraNm+d3x7+f3fM1+/0ft+6tfS4buHO+nvvhphzy4N/cTlN7c8++YWrWWqy8qZLUtmi+JQ+3KHu9/+yZ+u+fLTZ1xfbpKJg+fxx6c8/viM2bLEJjOM+8ezn0HvS8heVry8vDa5/1yAQ6b95W3vr2Pu1jCv3u/L+/cvHc/993756TO+/PSS3bZ7YcN9/0BtY+/BcXRMg0MbhbHq4MDYbPtDvdUHH5/x8797yMXj1YFt+Klfhz9V3B9b9m1RgLta0ns/697Z8n6d6d3tme5N4I70FW/8GkD0kxIvmEXe//yXVTGvOp79sf9IvHIHfwEM1o/5Yt/edmYyHldRZz+3qXv1/t2vGNBeHd5FO+T775ZJnldqw2lRMDib+mtFeeGPaWj3uuzmy8+GNBLeJ9i//8IQB2eWN9nuu47kDi+fteNAecSPw/cVPP/QfcWAyty5i71iH2+zXyklRgvy3ERWWMeaLaXe3YLhuPB4O/zY8yaEoLR7Y4rYM+td/BbftQ8po3vcg7pCC0FudGoQrF657Zsez7/na+gQZJIWUvcmvv1rSknKOuf03Md72qqDBPBukfjqc1jUGQ8eLQ5GGd57Fqc1RZVFKZL89m8WF5aBcO932SdwX/kdXn4ihHs9zF7cLh7q64O11+0/pH2+SoocQqCaFZw/Xh6cAe8OJdqu7w0/Dg2YU6+sdhcll0IIqllONcs5fTCnqvPo2Pbv+Nr8KeDlazZe73cOn/evISkE4aVARggOUtpwb519f7vXvRZf54UL/OWg7sVjvfv7dcfzPvEXEGC9W8ySy5OAWMD8lvt51XaCqOU3UsXBm0ihK/n29Vfv6tje53ZHHPHXBp1MBgR8a8HzY7AP1vLMYI1OQdcxG/tTwH5839te6x8h+35TSCGYZZY8yRGVkKlZ/fF6emd4xamUSlLNcrIimlxJEWu0Xm6m+yqUqc5j9SDK3l6WEX5nsujHfI/3hNcdUz3PyXJzcFEEvkWtxbKFO5ZQIFjfNAdnxfNHCx48WlLWcV/vciw+4i8D35WM+O5X3v61H4M/5xX4FyARPOKII4444ogjjjjirwHh5ZqDwwuwXbdcPrllfdPy4OGcs4tFlEyKf9/M6hE/abzywj4GWEccccQRRxxxxBFHvBG+a9049hNN0zN0E0WVUVYZUr0oHzviiJ8YjgHWEUccccQRRxxxxBFHHHHEO8IrA6z3LzI/4ogjjjjiiCOOOOKII474d4JjgHXEEUccccQRRxxxxBFHHPGOcAywjjjiiCOOOOKII4444ogj3hG+z6b9WJF4xBFHHHHEEUccccQRRxzxhjgyWEccccQRRxxxxBFHHHHEEe8IxwDriCOOOOKII4444ogjjjjiHeEYYB1xxBFHHHHEEUccccQRR7wjHAOsI4444ogjjjjiiCOOOOKId4RjgHXEEUccccQRRxxxxBFHHPGOcAywjjjiiCOOOOKII4444ogj3hH+f2TKhv+SN27XAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "print('Word Cloud of Sarcastic and Non-sarcastic Headlines')\n", "data['headline'] = data['headline'].fillna('')\n", "sarcastic_headlines = ' '.join(data.loc[data['is_sarcastic'] == 1, 'cleaned_headline'])\n", "plot_wordcloud(sarcastic_headlines, title = 'Word Cloud of Sarcastic Headlines')\n", "\n", "non_sarcastic_headlines = ' '.join(data.loc[data['is_sarcastic'] == 0, 'cleaned_headline'])\n", "plot_wordcloud(non_sarcastic_headlines, title = 'Word Cloud of Isn\\'t Sarcastic Headlines')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "VPPd0YuPXi2M" }, "source": [ "### Modelling" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 238 }, "colab_type": "code", "id": "z0AXjXu78ciM", "outputId": "76aab0fd-2bcb-420e-b293-bb90f1c9d4fa" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------\n", "Five point summary for number of words\n" ] }, { "data": { "text/plain": [ "count 26709\n", "mean 10\n", "std 3\n", "min 2\n", "25% 8\n", "50% 10\n", "75% 12\n", "max 39\n", "Name: nb_words, dtype: int64" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "99% quantilie: 18.0\n", "------------------------------------------------------------\n" ] } ], "source": [ "print('--'*30); print('Five point summary for number of words')\n", "display(data['nb_words'].describe().round(0).astype(int)); \n", "\n", "print('99% quantilie: {}'.format(data['nb_words'].quantile(0.99)));print('--'*30)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "9ziybaD1RdD9" }, "source": [ "#### Set Different Parameters for the model" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "jPw9gAN_EV6m" }, "outputs": [], "source": [ "max_features = 10000\n", "maxlen = data['nb_words'].max()\n", "embedding_size = 200" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "9abSe-bM8fn9" }, "source": [ "### Applying Keras Tokenizer " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "3GcZSr5n4Djr" }, "outputs": [], "source": [ "tokenizer = Tokenizer(num_words = max_features)\n", "tokenizer.fit_on_texts(list(data['cleaned_headline']))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "0Ffi63KsST3P" }, "source": [ "### Define X and y for your model." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 170 }, "colab_type": "code", "id": "wnjxBdqmSS4s", "outputId": "d74fc064-6125-4b2f-8692-5ed17459b04a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of Samples: 26709\n", "Number of Labels: 26709\n", "\n", "First headline:\n", "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 327 686 2924 1254 54 291 107 1915 6 2014 3610]\n", "\n", "Label of the first headline: 0\n" ] } ], "source": [ "X = tokenizer.texts_to_sequences(data['cleaned_headline'])\n", "X = pad_sequences(X, maxlen = maxlen)\n", "y = np.asarray(data['is_sarcastic'])\n", "\n", "print(f'Number of Samples: {len(X)}')\n", "print(f'Number of Labels: {len(y)}')\n", "print(f'\\nFirst headline:\\n{X[0]}\\n\\nLabel of the first headline: {y[0]}')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WJLyKg-98rH_" }, "source": [ "### Get the Vocabulary size" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "q-2w0gHEUUIo", "outputId": "cbaa90e0-11e5-48e5-961a-8a27dec992dc" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique tokens: 24962\n" ] } ], "source": [ "# Reserve padding (indexed zero)\n", "w2i = tokenizer.word_index\n", "vocab_size = len(w2i) + 1\n", "print(f'Number of unique tokens: {vocab_size}')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "5hjeMi40XcB1" }, "source": [ "### Word Embedding" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "bUF1TuQa8ux0" }, "source": [ "#### Get Glove Word Embeddings" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "vq5AIfRtMeZh" }, "outputs": [], "source": [ "glove_file = './Data/glove.6B.zip'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "DJLX_n2WMecA" }, "outputs": [], "source": [ "#Extract Glove embedding zip file\n", "from zipfile import ZipFile\n", "with ZipFile(glove_file, 'r') as z:\n", " z.extractall()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "9IuXlu8-U3HG" }, "source": [ "#### Get word embeddings using embedding file" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "elZ-T5aFGZmZ" }, "outputs": [], "source": [ "EMBEDDING_FILE = './glove.6B.200d.txt'\n", "\n", "embeddings = {}\n", "for o in open(EMBEDDING_FILE):\n", " word = o.split(' ')[0]\n", " embd = o.split(' ')[1:]\n", " embd = np.asarray(embd, dtype = 'float32')\n", " embeddings[word] = embd" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "bTPxveDmVCrA" }, "source": [ "#### Create a weight matrix" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "xQgOhiywU9nU", "outputId": "1a3b4af2-c263-4e42-c62e-8806a438a1e2" }, "outputs": [ { "data": { "text/plain": [ "400000" ] }, "execution_count": 22, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# Getting the minimum number of words\n", "num_words = min(max_features, vocab_size) + 1\n", "\n", "embedding_matrix = np.zeros((num_words, embedding_size))\n", "for word, i in tokenizer.word_index.items():\n", " if i > max_features: continue\n", " embedding_vector = embeddings.get(word)\n", " if embedding_vector is not None:\n", " embedding_matrix[i] = embedding_vector\n", "\n", "len(embeddings.values())" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "u7IbWuEX82Ra" }, "source": [ "### Create and Compile Model\n", "* Split the data into train, valid and test set so that it's easy to compare and evaluate\n", "* Use Sequential model instance\n", "* Add Embedding layer\n", "* Bidirectional(LSTM) layer\n", "* GlobalMaxPool1D layer\n", "* Dense, dropout layers\n", "* Add a final dense layer with sigmoid activation for binary classification" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 153 }, "colab_type": "code", "id": "eWaqtvvDkAb7", "outputId": "56b25801-b923-4600-daa2-90fce642ef45" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------ \n", "Number of rows in training dataset: 21367\n", "Number of columns in training dataset: 39\n", "Number of unique words in training dataset: 9959\n", "------------------------------------------------------------ \n", "Number of rows in test dataset: 5342\n", "Number of columns in test dataset: 39\n", "Number of unique words in test dataset: 7397\n" ] } ], "source": [ "x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = random_state, shuffle = True)\n", "\n", "print('---'*20, f'\\nNumber of rows in training dataset: {x_train.shape[0]}')\n", "print(f'Number of columns in training dataset: {x_train.shape[1]}')\n", "print(f'Number of unique words in training dataset: {len(np.unique(np.hstack(x_train)))}')\n", "\n", "print('---'*20, f'\\nNumber of rows in test dataset: {x_test.shape[0]}')\n", "print(f'Number of columns in test dataset: {x_test.shape[1]}')\n", "print(f'Number of unique words in test dataset: {len(np.unique(np.hstack(x_test)))}')" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 476 }, "colab_type": "code", "id": "d7jhsSgYXG4l", "outputId": "4921d9dc-2b37-4a71-ea8f-2144cf76ba10" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "embedding (Embedding) (None, 39, 200) 2000200 \n", "_________________________________________________________________\n", "bidirectional (Bidirectional (None, 39, 256) 336896 \n", "_________________________________________________________________\n", "global_max_pooling1d (Global (None, 256) 0 \n", "_________________________________________________________________\n", "dropout (Dropout) (None, 256) 0 \n", "_________________________________________________________________\n", "dense (Dense) (None, 128) 32896 \n", "_________________________________________________________________\n", "dropout_1 (Dropout) (None, 128) 0 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 64) 8256 \n", "_________________________________________________________________\n", "dropout_2 (Dropout) (None, 64) 0 \n", "_________________________________________________________________\n", "dense_2 (Dense) (None, 1) 65 \n", "=================================================================\n", "Total params: 2,378,313\n", "Trainable params: 378,113\n", "Non-trainable params: 2,000,200\n", "_________________________________________________________________\n", "None\n" ] } ], "source": [ "model = Sequential()\n", "model.add(Embedding(num_words, embedding_size, embeddings_initializer = Constant(embedding_matrix), input_length = maxlen, trainable = False))\n", "model.add(Bidirectional(LSTM(128, return_sequences = True)))\n", "model.add(GlobalMaxPool1D())\n", "model.add(Dropout(0.5, input_shape = (256,)))\n", "model.add(Dense(128, activation = 'relu'))\n", "model.add(Dropout(0.5, input_shape = (128,)))\n", "model.add(Dense(64, activation = 'relu'))\n", "model.add(Dropout(0.5, input_shape = (64,)))\n", "model.add(Dense(1, activation = 'sigmoid'))\n", "\n", "model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])\n", "\n", "# Adding callbacks\n", "es = EarlyStopping(monitor = 'val_loss', mode = 'min', verbose = 1, patience = 10) \n", "mc = ModelCheckpoint('sarcasm_detector.h5', monitor = 'val_loss', mode = 'min', save_best_only = True, verbose = 1)\n", "lr_r = ReduceLROnPlateau(monitor = 'val_loss', factor = 0.1, patience = 5),\n", "logdir = 'log'; tb = TensorBoard(logdir, histogram_freq = 1)\n", "callbacks = [es, mc, lr_r, tb]\n", "\n", "print(model.summary())" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "colab_type": "code", "id": "gwChR2EjOGQo", "outputId": "1d5f5d59-a884-4e18-e83a-2283014d8f66" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkkAAAQtCAIAAADBV0wVAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzde1gTV/o48BNIIBdDuCMGECIColi0WkWh1FIphSqioui6FvtgVeoGVLYuVhBRUMQiC0L9lVLXbRVUpFAvrC5FKmzFsiJC8bKA4gWUq1wkXBIyvz/Os/PNQggBEoLh/fzlzJmceWcS52VmzoVCEAQCAAAA1IiGqgMAAAAAFAxyGwAAAHUDuQ0AAIC6gdwGAABA3VBVHYAq3bx5My4uTtVRAACA4jk5Oe3cuVPVUajMhL5ve/bsWUZGhqqjAGCsZWRkPH/+XNVRKF1RUVFRUZGqo1CNoqKimzdvqjoKVZrQ923Y+fPnVR0CAGOKQqHs2LFjzZo1qg5EuXx9fdFE/Q+Oj30im9D3bQAAANQS5DYAAADqBnIbAAAAdQO5DQAAgLqB3AYAAEDdQG4DAMjlypUrHA7n4sWLqg5EwbZu3Ur5rw0bNkgW5ebmhoaGisViHx8fCwsLOp3O5XK9vb3LysrkqTkmJsbOzo7BYLBYLDs7u7CwsPb2drJUKBSGh4fzeDwtLS0ulxsSEtLV1YWLfvrpp5iYmL6+PnLjrKwsMkhDQ0NFHLeag9wGAJCLGs8Zoq+vn5OT8/Dhw9TUVHLlvn37EhIS9uzZIxaLCwoKzpw509LSUlhY2NXV9e6779bV1Q1ZbUFBwebNm58+fVpfX3/gwIGYmJjVq1eTpcHBwbGxsdHR0c3NzadPn05JSQkICMBFy5cvp9Ppbm5ura2teI23t/fz589v3Ljh6emp0ENXW5DbAABy8fLyamtrW7ZsmbJ31NXVtWjRImXvRRKDwfDw8LCxsdHW1sZrDh8+nJ6efu7cOTabjRBycnJydnZmMplWVlZRUVFtbW1/+9vfhqxWS0vr888/NzIymjRpkq+v74oVK/75z3++ePECIfTo0aMTJ05s3LjRz8+PzWa/9957fD7/zJkz9+/fx58NCgp66623PD09RSIRQohCoXC5XBcXl+nTpyvpJKgZyG0AgPElNTW1oaFBhQFUVVWFhYXt37+fTqcjhKhUquSTWB6PhxCqrq4esp7MzExcA8blchFCr1+/RggVFxeLxeIFCxaQpR4eHgihq1evkmsiIiJKS0vj4+NHf0QTEOQ2AMDQCgsLLSwsKBTK8ePHEULJycksFovJZGZnZ3/00Uc6OjpmZmZpaWl444SEBDqdbmxsvHXrVlNTUzqdvmjRolu3buFSPp+vpaU1efJkvPj555+zWCwKhdLU1IQQCg4O3rVrV3V1NYVCsba2Rgj94x//0NHRiYqKGrODTUhIIAhi+fLlUkvxWzEdHZ3hVltZWamrqzt16lSEkIaGBkKIwWCQpfiGjLxvQwjp6em5urrGx8er8dNg5YHcBgAYmrOz86+//kouBgYG7tixo6uri81mnz17trq6msfjbd68WSgUIoT4fL6/v79AIAgKCqqpqSkpKRGJREuXLn327BlCKCEhQXK4r6SkpP3795OL8fHxy5YtmzZtGkEQVVVVCCHcpEIsFo/ZwV6+fNnW1pbJZEot/e233xBCzs7OctYmFApra2uPHz+em5ubmJiopaWFELKzs0P/m8kMDAwQQo2NjZKfnTNnTm1t7d27d0d0HBMa5DYAwMgtWrRIR0fHyMjIz8+vs7Pz6dOnZBGVSp0xY4a2tra9vX1ycnJHR8fJkydHsAsvL6/29vawsDDFRS1LZ2fn48ePp02bNrCovr4+PT09KCjIyclpsLu6gczNzc3MzCIiIo4cObJ27Vq80sHBwcPDIykpKS8vr7u7++XLl5mZmRQKBf9xQMI3c+Xl5aM7pokIchsAQAHw7Ui/SzNp3rx5TCbzwYMHYxvUSDQ0NBAEIfWmzcnJKSgoaMWKFTk5OTQaTc4Knz171tDQcObMmVOnTs2ZM4d8lZienu7r67tx40Z9ff3Fixf/+OOPBEHguzcSDqO+vn50xzQRwTwAAICxoK2t3e+B2/jU3d2NECIbTEoyNjZOTU2dOXPmsCqk0WhGRkbu7u5WVlY2NjbR0dG4eQiHwzlx4gS52YsXL9LS0qZMmSL5WfxCDocEhgXu2wAASicUCltbW83MzFQdyNBwOpHsN00yMjLS1dUdcc3W1taampoVFRVSS4uLixFCS5YskVzZ29uL/rfJCZAT5DYAgNLl5+cTBLFw4UK8SKVSB3t6qXLGxsYUCqWtrW1g0cWLF3E7fnk0NzevX79eck1lZWVfX5+5ubnU7VNSUqysrFxdXSVX4jBMTEzk3CkgQW4DACiFWCx+9eqVSCQqKysLDg62sLDw9/fHRdbW1i0tLVlZWUKhsLGx8cmTJ5If1NfXr6urq6mp6ejoEAqFOTk5Y9kHgMlk8ni8gfOSV1VVmZiYkI1BMD8/PxMTk5KSkoH1sFisa9eu5eXltbe3C4XCO3fufPLJJywWa+fOnXiDd95558mTJyKRqKamJiQkJDc3NzU1Fb+2JOEwHBwcFHmEEwPkNgDA0I4fPz5//nyE0O7du729vZOTk48dO4YQmj179qNHj1JSUnbt2oUQ8vDwqKysxB/p7u52cHBgMBguLi42NjbXr18nX2IFBgYuWbJk3bp1tra2Bw4cwM/cnJyccCeBbdu2GRsb29vbe3p6trS0jP3Benl5VVRUkKM7YlI7mfX29jY0NGRnZw8sotPpixcvDggI4HK5bDbb19fX0tKyqKho1qxZeANdXV1HR0cGgzF37twHDx4UFBT0eyCJECouLuZyubNnz1bQkU0g0JYEADC07du3b9++XXJNYGAg+W/cua3fR9hs9sC7H0xfXz8vL09yzZEjR8h/z5kzp6amhlz86KOPJIcYHgN/+tOfkpOTL1y4IDl08vTp0we2V8zIyHjvvfdwd+yBpOY80rVr12SH0dzc/PPPPx88eJBCocgXOPg/cN8GAFAKqc0xxqeurq6rV69WVlbithvW1taRkZGRkZF4fKzB9PX1ZWVldXR0+Pn5KSOqiIgIR0dHPp+PECIIoq6urrCwEPdnB0OC3AYAmOhaWlrwWMmffvopXhMaGurr6+vn5ye1UQmWn59/4cKFnJycwUYwGY24uLjS0tIrV67gjnTZ2dl4rOTLly8rfF9qCXLbWJg/f76mpqajo+NoKgkICGCz2RQKpbS0VJ7SMZttaxxO61VUVDRjxgwNDQ0KhWJiYnLw4MEx2/WFCxd4PB6eZ2vy5Mn95gObIPbs2XPy5Mm2tjYrK6uMjAxVhzOEEydOEP/1ww8/kOujoqL4fP6hQ4cG+6Cbm9vp06fJgTEVKDs7u6enJz8/X09PD69ZsWIFGSQeeBPIBu/bxkJxcfEHH3wwyl/kt99++8EHH6xbt07O0jEbX3UcDuS6cOHC+/fve3h4XL169eHDh6PpkzRcq1atWrVqlbW1dVNT08uXL8dsv+NKdHR0dHS0qqNQAHd3d3d397Hfr7e3t7e399jvV51Abhs7Y/xCGM+2pU476urqcnNzkxyxd5wYt4EBMGHBM8mxI/8AdIORnR0VmDsJgjh//vw333yjqAoVQuXTeg1m3AYGwIQFuW1ofX194eHhFhYWDAZj9uzZZ8+eRQjFx8ezWCwNDY23337bxMSERqOxWKy5c+e6uLiYm5vT6XRdXd0vvvhCsp6qqio7OzsWi4V7/BQWFsreBUKIIIjY2FhbW1ttbW0Oh/PnP/9ZskIZpcOabQsHEB0dbWtry2AwDA0NraysoqOjJSciGcybMq3XWAYmj4KCAnt7ew6HQ6fTHRwc8IyUAQEB+EXdtGnT7ty5gxDatGkTk8nkcDg//fQTGuR3cuTIESaTyWazGxoadu3axeVyHz58KGcYAKgtYgLDl4YhNwsJCdHW1s7IyHj16tWePXs0NDSKi4sJgti3bx9C6NatW52dnU1NTXja3MuXLzc2NnZ2duKWu6WlpbgSNzc3Ho/3+PFjoVD4+++/L1iwgE6n/+c//5G9iy+//JJCoXz11VevXr0SCARJSUkIoTt37uBPyS7F3WATExPJjRFCP//8c1tbW0NDg4uLC4vF6u3txaVRUVGamprZ2dkCgeD27dsmJibvvfeenKdxWDvasmULi8W6d+9ed3d3RUXF/Pnz2Wz206dPcekf/vAHExMTsubY2FiEUGNjI15ctWoVntYLu3TpEpvNjoyMHCywDz/8ECH06tWrMQ6MIIhp06ZxOBwZJ+38+fMREREtLS3Nzc0LFy40MDAgq9LU1KytrSW3XL9+/U8//YT/LeN3ghAKCgpKTExcuXLl/fv3ZeyaIAiE0NmzZ2VvowZWr169evVqVUehGhP52DG4bxtCd3d3cnKyj4/PqlWrdHV19+7dS6PRJKehsre3ZzKZBgYGuB2HhYWFoaEhk8nEDeQkJ/Vgs9mWlpZUKnXmzJkpKSnd3d34od9gu+jq6jp27NgHH3ywc+dOXV1dBoOhr69P1ia7dDCDzbaVlZX19ttvL1++HI+S4O3tfePGDdzXZ2TG7bReYxCYPFavXr1v3z49PT19ff3ly5c3NzfjMfK3bdvW19dH7re9vb24uNjT0xPJ8VM8fPjw9u3bL1y4gOe9BGAig7YkQ3j48KFAICCHyWEwGJMnT5Y6DRUeCE4kEuFF/HZtsAFhHRwcOBxOWVmZjF1UVVUJBAI3NzepNcguHVK/2ba6u7vpdDpZ2tfXR6PRNDU1R1a5jB31o8JpvcZPYPingns6v//++zY2Nt99992ePXsoFEp6erqfnx/+IuT/Kcpj7dq1/YZGVFcTdlCP1atXqzoEVYLcNoTOzk6E0N69e/fu3UuuNDU1HX3NNBoNX1gH2wUer8jIyEjqx2WXDpenp2dsbGx2dra7u3tFRUVWVtbHH3+skNw2pHE7rZdSA7t8+XJsbGxFRQUeSJdcT6FQtm7dunPnzp9//vmDDz74+9//fvr0aVyk2J9icHCwk5PTKI7gDYBHvNyxY4eqA1EBfOwTGeS2IeDkcezYseDgYAVWKxKJWlpaLCwsZOzi+vXrCKGenh6pNeDbrMFKhysiIuL27dv+/v6vX782NTVds2bN2Ay7Pm6n9VJGYDdu3Lh9+/aOHTuePn3q4+OzcuXK7777bsqUKYmJiZLNjvz9/ffs2fPtt9+am5vr6OiQYxUq9qfo5OQkT1uhN9r58+cRQmp/mFLhY5/IILcNATd6lDoUyGhcv35dLBbPnTtXxi5mzZqloaHxyy+/bNu2bWANskuHq6Kiorq6urGxkUod05/EuJ3WSxmB3b59m8ViIYTKy8uFQmFgYCCPx0MDHprp6emtXbs2PT2dzWZLDkCspJ8iAGoJ2pIMgU6nb9q0KS0tLTk5ub29va+v7/nz5y9evBhBVb29vW1tbSKRqKSkhM/nT506FU9nNdgujIyMVq1alZGRkZqa2t7eXlZWJtnhTHbpcG3fvt3CwkL2yLCKMm6n9VJUYANrFgqF9fX1+fn5OLfh+/Xc3Nzu7u7KykqyswFp27ZtPT09ly5dWrZsGblSgT9FANSfqhtqqpKcfQB6enp2795tYWFBpVJxRqmoqIiPj8cDpFpaWhYUFBw+fJjD4SCETExMTp8+nZ6ejqfK1dPTS0tLIwji5MmTS5YsMTY2plKpuFHlkydPZO+CIIiOjo6AgAADA4NJkyY5OzuHh4cjhMzMzO7evSu7NDExEffHYjKZy5cvT0pKwtFOnz69urr6m2++0dHRQQhNnToV90PIy8szMDAgfxU0Gm3GjBkXLlwY8uQMd0dbtmyh0WhcLpdKpero6KxYsaK6upqsrbm5ecmSJXQ63crK6k9/+hPusWdtbY3b4peUlEydOpXBYDg7O798+fLKlStsNvvgwYMDoyoqKpo5c6aGhgZCaPLkyVFRUWMW2Ndffz1t2rTB/rtlZmbiCnfv3q2vr6+rq+vr64u7Bk6bNo3sckAQxJw5c0JDQ+X5KcbExOD5z8zNzb///vshvzIC+gBMABP52DHIbRP6DJCSkpKCg4PJxZ6enh07dmhrawsEAsXuaMuWLfr6+oqtUyHGW2Cenp6PHj1SUuWQ29TeRD52DN63AfTy5Us+ny/5IkdLS8vCwkIoFAqFQnxPoEDjdlovlQcmFApxf4CysjJ8j6jaeAB4c8H7NoAYDAaNRktNTa2vrxcKhXV1dd9++214eLifn19dXR1lcEqaknHC2r17d2Vl5X/+859NmzYdOHBA1eFMFFu3biV/0v3mJMrNzQ0NDRWLxT4+PhYWFnQ6ncvlent7456pQ4qJibGzs2MwGCwWy87OLiwsTHICcaFQGB4ezuPxtLS0uFxuSEhIV1cXLvrpp59iYmIk/9jKysoigzQ0NFTEcas7Vd84qhI8kyTduHHjgw8+0NHR0dTU5HA4ixYtSkpKEgqFit1LaGgo7jFtaWl5/vx5xVY+GuMksC+//FJDQ8Pc3JwcZEtJEDyTlIAfR+fk5Dx8+LC7u5tcHx4evmzZMtwB0cDAoKCgoLOz89GjR0uXLuVwOJLjog3Gy8vr6NGjDQ0NHR0d586do9FoS5cuJUsDAwPpdHpaWlp7e/v169d1dHTWr19PlsbHx7u6upIjxonF4ufPn9+4ccPT05McoW30x67GJvSVHXIbmJiUndsEAoGTk5PKq5I/t3G53H4rDx06ZGNj09XVRRCEUCj8+OOPyaLffvsNIRQVFTVkzT4+PrgGzNfXFyFUV1dHEER1dbWGhsZnn31GluIu+ffu3SPX8Pl8Jyenfn9iBgUFQW6TBzyTBAAomAIn/VHJ/EFVVVVhYWH79+/HIyRQqVTJaeVxr8Tq6uoh68nMzJQcyo7L5SKEcE+b4uJisVi8YMECshQPto5nhMAiIiJKS0vj4+NHf0QTEOQ2AIAUBEHExcXhwaP19PRWrFhBjl05rEl/VDix0YglJCQQBLF8+XKppfitGO5DMiyVlZW6urp4oBncQUWyodb06dMRQvfv3yfX6Onpubq6xsfHE+NvavvxD3IbAECKiIiI0NDQL7/8sqGh4caNG8+ePXNxcamvr0cIJSQkSA5klZSUtH//fnIxPj5+2bJleNKfqqoqPp/v7+8vEAiCgoJqampKSkpEItHSpUvx1EjDqgr9ty2rWCxW6rFfvnzZ1tYWd4gcCD+TdHZ2lrM2oVBYW1t7/Pjx3NzcxMRE/GYXz9UgmclwB9N+Q5jOmTOntrb27t27IzqOCQ1yGwCgv66urri4uJUrV27YsIHD4Tg4OJw4caKpqWnEY9+odmKjYens7Hz8+LHUDvj19fXp6elBQUFOTk6D3dUNZG5ubmZmFhERceTIEXLuBQcHBw8Pj6SkpLy8vO7u7pcvX2ZmZlIolH7j2uCbufLy8tEd00QEuQ0A0F9FRcXr16/nzZtHrpk/f76WltbA4cFGQIUTG8mjoaGBIAipN21OTk5BQUErVqzIycnBPRHl8ezZs4aGhjNnzpw6dWrOnDnk68P09HRfX9+NGzfq6+svXrz4xx9/JAhCcngghBAOA98ug2GBvtsAgP5aW1sRQpMmTZJcqaur29HRoZD6x+3ERgih7u5uhJC2tvbAImNj49TU1JkzZw6rQhqNZmRk5O7ubmVlZWNjEx0djZuHcDicEydOkJu9ePEiLS1typQpkp/FL+RwSGBY4L4NANCfrq4uQqhfJlPUpD/jdmIjDKcTqYPUGBkZ4TMzMtbW1pqamhUVFVJLi4uLEUJLliyRXNnb24v+t8kJkBPkNgBAf7NmzZo0adK///1vcs2tW7d6e3vffvttvDiaSX/G7cRGmLGxMYVCaWtrG1h08eJF3I5fHs3NzevXr5dcU1lZ2dfXZ25uLnX7lJQUKysrV1dXyZU4DDzwOhgWyG0AgP7odPquXbsyMzN/+OGH9vb28vLybdu2mZqabtmyBW8w3El/xu3ERgMxmUwej4fntZdUVVVlYmJCNgbB/Pz8TExMSkpKBtbDYrGuXbuWl5eHRza5c+fOJ598wmKxdu7ciTd45513njx5IhKJampqQkJCcnNzU1NTcStKEg7DwcFBkUc4MUBuAwBIsW/fvujo6MjISENDQ1dXV0tLS3L+OYRQYGDgkiVL1q1bZ2tre+DAAfzQzMnJCbfs37Ztm7Gxsb29vaenZ0tLC0Kou7vbwcGBwWC4uLjY2Nhcv36dfKE13KrGgJeXV0VFBTm6Iya1k1lvb29DQ0N2dvbAIjqdvnjx4oCAAC6Xy2azfX19LS0ti4qKZs2ahTfQ1dV1dHRkMBhz58598OBBQUFBvweSCKHi4mIulzt79mwFHdlEorIRUcYBGHMLTExobMeTVNX8QSMec6uyspJKpcozGV5fX5+Li0tqaurIoxxcU1MTnU4/evSo5EoYc0tOcN8GAFA6lc8fJFtXV9fVq1crKytx2w1ra+vIyMjIyEjZM9H39fVlZWV1dHQoaUKMiIgIR0dHPp+PECIIoq6urrCwEPdhB0OC3AYAmOhaWlo8PDxsbGw+/fRTvCY0NNTX19fPz09qoxIsPz//woULOTk5g41gMhpxcXGlpaVXrlzBHemys7O5XK6Li8vly5cVvi+1BLkNAKBEe/bsOXnyZFtbm5WVVUZGhqrDkeLEiRPkg6wffviBXB8VFcXn8w8dOjTYB93c3E6fPk0OhqlA2dnZPT09+fn5enp6eM2KFSvIIPFgm0A26LsNAFCi6Ojo6OhoVUcxQu7u7u7u7mO/X29vb29v77HfrzqB+zYAAADqBnIbAAAAdQO5DQAAgLqB3AYAAEDdQFsSdO7cOVWHAMBYu3nzpqpDUDo8YNXE/A/+/PnzcTsa9RhRQX/xcQOPSwIAAOpngo9LQiGkDZIGAFA4CoVy9uzZNWvWqDoQANQfvG8DAACgbiC3AQAAUDeQ2wAAAKgbyG0AAADUDeQ2AAAA6gZyGwAAAHUDuQ0AAIC6gdwGAABA3UBuAwAAoG4gtwEAAFA3kNsAAACoG8htAAAA1A3kNgAAAOoGchsAAAB1A7kNAACAuoHcBgAAQN1AbgMAAKBuILcBAABQN5DbAAAAqBvIbQAAANQN5DYAAADqBnIbAAAAdQO5DQAAgLqB3AYAAEDdQG4DAACgbiC3AQAAUDeQ2wAAAKgbyG0AAADUDeQ2AAAA6gZyGwAAAHUDuQ0AAIC6gdwGAABA3UBuAwAAoG4oBEGoOgYA1NOWLVsePnxILpaUlFhZWenp6eFFTU3NU6dOmZmZqSg6ANQZVdUBAKC2TExMvvnmG8k1ZWVl5L95PB4kNgCUBJ5JAqAs69evH6xIS0vL399/DGMBYGKBZ5IAKNGsWbPu3bsn9X/Zw4cPbWxsxj4kACYCuG8DQIk2btyoqanZbyWFQnnrrbcgsQGgPJDbAFCidevW9fX19Vupqan5ySefqCQeACYIeCYJgHItWrTo1q1bYrGYXEOhUJ49e8blclUYFQDqDe7bAFCuP/7xjxQKhVzU0NBwdnaGxAaAUkFuA0C5fH19JRcpFMrGjRtVFQwAEwTkNgCUy9DQ0M3NjWxRQqFQfHx8VBsSAGoPchsASrdhwwb8YltTU/PDDz80MDBQdUQAqDnIbQAo3cqVK7W0tBBCBEFs2LBB1eEAoP4gtwGgdCwW6+OPP0YIaWlpLVu2TNXhAKD+ILcBMBb+8Ic/IIR8fHxYLJaqYwFA/UH/Nul8fX0zMjJUHQUAAAwBruFSwTwAg1q4cOGOHTtUHQVQHz/88IOfnx+VKuU/3bFjxxBCav97u3nzZnx8/NmzZ1UdiJrA51PVUYxTkNsGZWZmtmbNGlVHAdTH8uXL6XS61KLz588jhCbC7y0+Pn4iHOaYgdw2GHjfBsAYGSyxAQAUDnIbAAAAdQO5DQAAgLqB3AYAAEDdQG4DAACgbiC3AfCmunLlCofDuXjxoqoDGY9yc3NDQ0PFYrGPj4+FhQWdTudyud7e3mVlZfJ8PCYmxs7OjsFgsFgsOzu7sLCw9vZ2slQoFIaHh/N4PC0tLS6XGxIS0tXVhYt++umnmJiYgRPSgjEGuQ2ANxV02h3Mvn37EhIS9uzZIxaLCwoKzpw509LSUlhY2NXV9e6779bV1Q1ZQ0FBwebNm58+fVpfX3/gwIGYmJjVq1eTpcHBwbGxsdHR0c3NzadPn05JSQkICMBFuKeHm5tba2ursg4PyAFyGwBvKi8vr7a2tjEYoLKrq2vRokXK3ouiHD58OD09/dy5c2w2GyHk5OTk7OzMZDKtrKyioqLa2tr+9re/DVmJlpbW559/bmRkNGnSJF9f3xUrVvzzn/988eIFQujRo0cnTpzYuHGjn58fm81+7733+Hz+mTNn7t+/jz8bFBT01ltveXp6ikQiZR4okAVyGwBgCKmpqQ0NDaqOQi5VVVVhYWH79+/HvQmpVKrkM1sej4cQqq6uHrKezMxMyf6IeJ70169fI4SKi4vFYvGCBQvIUg8PD4TQ1atXyTURERGlpaXQsVqFILcB8EYqLCy0sLCgUCjHjx9HCCUnJ7NYLCaTmZ2d/dFHH+no6JiZmaWlpeGNExIS6HS6sbHx1q1bTU1N6XT6okWLbt26hUv5fL6WltbkyZPx4ueff85isSgUSlNTE0IoODh4165d1dXVFArF2toaIfSPf/xDR0cnKipKBYc9lISEBIIgli9fLrUUvxXT0dEZbrWVlZW6urpTp05FCGloaCCEGAwGWTp9+nSEEHnfhhDS09NzdXWNj4+H58aqArkNgDeSs7Pzr7/+Si4GBgbu2LGjq6uLzWafPXu2urqax+Nt3rxZKBQihPh8vr+/v0AgCAoKqqmpKSkpEYlES5cuffbsGUIoISFBchyspKSk/fv3k4vx8fHLli2bNm0aQRBVVVUIIdxQQiwWj9nByu/y5cu2trZMJlNq6W+//YYQcnZ2lrM2oVBYW1t7/Pjx3NzcxMREPAmfnZ0d+t9MhiebbWxslPzsnDlzamtr7969O6LjAKMFuQ0AtbJo0SIdHR0jIyM/P7/Ozs6nT5+SRV5R0TUAACAASURBVFQqdcaMGdra2vb29snJyR0dHSdPnhzBLry8vNrb28PCwhQXtWJ0dnY+fvx42rRpA4vq6+vT09ODgoKcnJwGu6sbyNzc3MzMLCIi4siRI2vXrsUrHRwcPDw8kpKS8vLyuru7X758mZmZSaFQ8J8RJHwzV15ePrpjAiMEuQ0A9YRvMvpdcEnz5s1jMpkPHjwY26CUq6GhgSAIqTdtTk5OQUFBK1asyMnJodFoclb47NmzhoaGM2fOnDp1as6cOeRLx/T0dF9f340bN+rr6y9evPjHH38kCALfvZFwGPX19aM7JjBCMA8AABOUtrZ2v8dob7ru7m6EkLa29sAiY2Pj1NTUmTNnDqtCGo1mZGTk7u5uZWVlY2MTHR2Nm4dwOJwTJ06Qm7148SItLW3KlCmSn8Uv5HBIYOzBfRsAE5FQKGxtbTUzM1N1IIqE04nUftNGRka6urojrtna2lpTU7OiokJqaXFxMUJoyZIlkit7e3vR/zY5AWMJchsAE1F+fj5BEAsXLsSLVCp1sKeXbxBjY2MKhdLW1jaw6OLFi7gdvzyam5vXr18vuaaysrKvr8/c3Fzq9ikpKVZWVq6urpIrcRgmJiZy7hQoFuQ2ACYKsVj86tUrkUhUVlYWHBxsYWHh7++Pi6ytrVtaWrKysoRCYWNj45MnTyQ/qK+vX1dXV1NT09HRIRQKc3JyxmcfACaTyePxnj9/3m99VVWViYkJ2RgE8/PzMzExKSkpGVgPi8W6du1aXl5ee3u7UCi8c+fOJ598wmKxdu7ciTd45513njx5IhKJampqQkJCcnNzU1NT8QtOEg7DwcFBkUcI5Aa5DYA30vHjx+fPn48Q2r17t7e3d3Jy8rFjxxBCs2fPfvToUUpKyq5duxBCHh4elZWV+CPd3d0ODg4MBsPFxcXGxub69evkq6nAwMAlS5asW7fO1tb2wIED+Emak5MT7iSwbds2Y2Nje3t7T0/PlpYWlRyvnLy8vCoqKsjRHTGpncx6e3sbGhqys7MHFtHp9MWLFwcEBHC5XDab7evra2lpWVRUNGvWLLyBrq6uo6Mjg8GYO3fugwcPCgoK+j2QRAgVFxdzudzZs2cr6MjAMBFAmtWrV69evVrVUYCJYgx+b1u2bNHX11fqLoZ09uxZZV9zKisrqVTq999/P+SWfX19Li4uqampygijqamJTqcfPXpUGZWTxuB8vrngvg2AiWIiDE5vbW0dGRkZGRmJx8caTF9fX1ZWVkdHh5+fnzLCiIiIcHR05PP5yqgcyANym4rNnz9fU1PT0dFxNJUEBASw2WwKhVJaWipP6djMjXLhwgUej0eRxtLScgQVqvG5AgoUGhrq6+vr5+cntVEJlp+ff+HChZycnMFGMBmNuLi40tLSK1euyN+RDigc5DYVKy4uHvikfri+/fbblJQU+UuJMRnjbtWqVY8ePZo2bRqHw8FPCUQikUAgqK+vH9kFRY3PlbLt2bPn5MmTbW1tVlZWGRkZqg5H6aKiovh8/qFDhwbbwM3N7fTp0+QQmgqUnZ3d09OTn5+vp6en8MqB/KDv9rhAoVDGcnd4bpSx3COmqanJYDAYDIaNjc2IK5kg50qxoqOjo6OjVR3FmHJ3d3d3dx/7/Xp7e3t7e4/9fkE/cN82Loz+2YXsK74C8wFBEOfPn//mm29GU0lWVtaIPzvRzhUAYAQgt41KX19feHi4hYUFg8GYPXs2brYUHx/PYrE0NDTefvttExMTGo3GYrHmzp3r4uJibm5Op9N1dXW/+OILyXqqqqrs7OxYLBZun11YWCh7FwghgiBiY2NtbW21tbU5HM6f//xnyQpllA5rbhQcQHR0tK2tLYPBMDQ0tLKyio6OJoeNH+V0JxPqXAEAxo5qmmeOe3K2yQ4JCdHW1s7IyHj16tWePXs0NDSKi4sJgti3bx9C6NatW52dnU1NTXjqwsuXLzc2NnZ2duLWU6WlpbgSNzc3Ho/3+PFjoVD4+++/L1iwgE6n/+c//5G9iy+//JJCoXz11VevXr0SCARJSUkIoTt37uBPyS7FnZYSExPJjRFCP//8c1tbW0NDg4uLC4vF6u3txaVRUVGamprZ2dkCgeD27dsmJibvvfceeQYuXbrEZrMjIyMHO0WS79sIgggKCiovL5fcYOKcKxkmSJ8TaLOuWHA+ZYDzIp0815quri4mk+nn54cXBQKBtrZ2YGAg8d/rdUdHBy46deoUQoi8puNJpNLT0/Gim5vbW2+9RVZbVlaGEAoJCZGxC4FAwGQyly5dSn4K3z3gK7LsUmKQ63VXVxdexBf3qqoqvDh//vx33nmHrOqzzz7T0NDo6emR4ywSBEEMnHBEam6b4OcKchsYATifMkBbkpF7+PChQCAghypgMBiTJ0+WOmkIHoxHJBLhRfzGaLDh+xwcHDgcDr5qD7aLqqoqgUDg5uYmtQbZpUPqNzdKd3c3nU4nS/v6+mg0mqampvwVcjic1tZW/O/g4GB59j4Bz9Xz58/PnTs3sjDeFDdv3kQIqf1hjhl8PoFUkNtGrrOzEyG0d+/evXv3kitNTU1HXzONRsOXy8F2gYeqMzIykvpx2aXD5enpGRsbm52d7e7uXlFRkZWV9fHHHw8rt0nCU4QokNqcq6Kion4DHqqrCXKYQLWgLcnI4QvisWPHJG+ER/+XlEgkamlpsbCwkLELfHPQ09MjtQbZpcMVERHx/vvv+/v76+jorFy5cs2aNTL6h40xdTpX8EwSDBfZWgoMBLlt5HBDPqnDW4zG9evXxWLx3LlzZexi1qxZGhoav/zyi9QaZJcOV0VFRXV1dWNjo1AofPr0aXJy8ug7pb548WLTpk2jj20inCsAwAhAbhs5Op2+adOmtLS05OTk9vb2vr6+58+fv3jxYgRV9fb2trW1iUSikpISPp8/depUPPnIYLswMjJatWpVRkZGampqe3t7WVmZZCcq2aXDtX37dgsLi8FG5xvudCcEQXR1dV24cEFHR2dk8by55woAMHZUfVc9TsnZbq2np2f37t0WFhZUKhVfJSsqKuLj4/GYUpaWlgUFBYcPH+ZwOAghExOT06dPp6en4+kK9fT00tLSCII4efLkkiVLjI2NqVSqgYHBunXrnjx5InsXBEF0dHQEBAQYGBhMmjTJ2dk5PDwcIWRmZnb37l3ZpYmJiXioISaTuXz58qSkJBzt9OnTq6urv/nmG5x1pk6ditvW5+XlGRgYkD8YGo02Y8aMCxcu4PCuXLnCZrMPHjw48ORkZmYObCRJ2rt3L0EQE+pcjf739qaDZ5KKBedTBgqhFsPlKZyvry9C6Pz586oORPWSk5MrKyvx3GAIod7e3r/85S/JycmvXr3Cs3wB0ojP1QT5vZ07d27t2rVwzVEUOJ8yQDtJIMvLly/5fL7kSywtLS0LCwuhUCgUCiG3SYJzBcD4Ae/bgCwMBoNGo6WmptbX1wuFwrq6um+//TY8PNzPz2/EL8zUFZwrAMYPyG1AFg6Hc+3atd9//93GxobBYNjb2588efLw4cN49BAgCc6VwuXm5oaGhorFYh8fHwsLCzqdzuVyvb29cW/9IcXExNjZ2TEYDBaLZWdnFxYW1t7eTpYKhcLw8HAej6elpcXlckNCQrq6uuQMLDIy0t7eXkdHR1tb29ra+osvvujXgKiwsHDx4sVMJtPU1HT37t39OpkMVvrTTz/FxMRMhClkx4KK3/eNVxPk3T4YJybI721YbR/Cw8OXLVvW3t4uFAoNDAwKCgo6OzsfPXq0dOlSDodTW1s7ZA1eXl5Hjx5taGjo6Og4d+4cjUaTHFwtMDCQTqenpaW1t7dfv35dR0dn/fr1csbm6uqalJTU3Nzc3t5+9uxZGo3m4eFBlv7+++8MBiMsLOz169e//vqroaHhpk2b5CyNj493dXV99eqVPGFAWxIZ4LxIN0GuNWCcGIPfm0AgcHJyUm1V8l+LDx06ZGNjg8ftFAqFH3/8MVmEhxiNiooashIfHx9y5E+CIHCDnbq6OoIgqqurNTQ0PvvsM7IUD2dz7949ecLz8vISiUTkIp7q4enTp3hx7dq1VlZWYrEYL8bGxlIolPv378tTShAEn893cnISCoVDhgG5TQZ4JgnAhJCamtrQ0DDeqpKqqqoqLCxs//79eNQYKpV68eJFspTH4yGEqqurh6wnMzNTcnhPLpeLEMIPD4uLi8Vi8YIFC8hSPAHF1atX5Ynw0qVLkkOpGRoaIoQEAgFCSCQSXb582dXVlZwI8KOPPiIIIjs7e8hSLCIiorS0VOGj0000kNsAeGMQBBEXFzdjxgxtbW09Pb0VK1aQY3Pz+XwtLS3cGw8h9Pnnn7NYLAqF0tTUhBAKDg7etWtXdXU1hUKxtrZOSEig0+nGxsZbt241NTWl0+mLFi26devWCKpCo57Db6CEhASCIJYvXy61FL8VG0HznMrKSl1d3alTpyKENDQ0EEKSjVenT5+OELp///4IAq6trWUwGFZWVgihR48evX79Go8Dh+FenvgdoexSTE9Pz9XVNT4+noDG/aMAuQ2AN0ZERERoaOiXX37Z0NBw48aNZ8+eubi41NfXI4QSEhIkJ0FNSkrav38/uRgfH79s2bJp06YRBFFVVcXn8/39/QUCQVBQUE1NTUlJiUgkWrp0KZ7QZ1hVIYRw2wexWKyow7x8+bKtrS3uJj8Qfibp7OwsZ21CobC2tvb48eO5ubmJiYl46gY7Ozv0v5kMd7pvbGwcbrQCgSAvL2/z5s245pcvXyKE2Gw2uQGdTmcwGPhrkl1KmjNnTm1t7d27d4cbDCBBbgPgzdDV1RUXF7dy5coNGzZwOBwHB4cTJ040NTWNeJAwKpWKbwHt7e2Tk5M7OjpOnjw5gnq8vLza29vDwsJGFkY/nZ2djx8/ljqiTX19fXp6elBQkJOT02B3dQOZm5ubmZlFREQcOXKEnILAwcHBw8MjKSkpLy+vu7v75cuXmZmZFAplsNmUZIiOjjY1NT148CBexI0e+03+QKPR8O2m7FISvoksLy8fbjCABLkNgDdDRUXF69ev582bR66ZP3++lpYW+SxxNObNm8dkMqXOPjjGGhoaCIKQetPm5OQUFBS0YsWKnJwcPLGfPJ49e9bQ0HDmzJlTp07NmTOHfFOYnp7u6+u7ceNGfX39xYsX//jjjwRBSA6ZJo/MzMxz585dvXqVvBXDb/jICQix3t5e/PxTdikJH36/mzkwLDAuCQBvBjy/66RJkyRX6urqdnR0KKR+bW3tETyRU7ju7m4czMAiY2Pj1NTUmTNnDqtCGo1mZGTk7u5uZWVlY2MTHR2Nm2lwOJwTJ06Qm7148SItLW3KlCny15yenh4XF5efny/5KfyeUrIjnUAg6O7uxjM7yi4l4VSHTwUYGchtALwZdHV1EUL9Mllra6uZmdnoKxcKhYqqapTwZV1q/2UjIyN8EkbG2tpaU1OzoqJCamlxcTFCaMmSJXLWlpiYePXq1by8vH5/bVhZWbHZ7CdPnpBr8FvJ2bNnD1lK6u3tRf/b1AUMFzyTBODNMGvWrEmTJv373/8m19y6dau3t/ftt9/Gi1QqdQSvi7D8/HyCIBYuXDj6qkbJ2NiYQqG0tbUNLLp48SJuxy+P5ubm9evXS66prKzs6+szNzeXun1KSoqVlZWrq+uQNRMEsXv37vLy8qysrH6JDSFEpVI9PT1v3LhBNq7JycmhUCj4BaHsUhI+fDwJBhgZyG0AvBnodPquXbsyMzN/+OGH9vb28vLybdu2mZqabtmyBW9gbW3d0tKSlZUlFAobGxslbw4QQvr6+nV1dTU1NR0dHThvicXiV69eiUSisrKy4OBgCwsLPBPecKsa7hx+sjGZTB6P9/z5837rq6qqTExMyMYgmJ+fn4mJSUlJycB6WCzWtWvX8vLy8Mgmd+7c+eSTT1gs1s6dO/EG77zzzpMnT0QiUU1NTUhISG5ubmpqKm7rKLvme/fuHTlyJCUlhUajUSQcPXoUbxAWFlZfX79v377Ozs6bN2/Gxsb6+/vb2trKU4rhw3dwcBju2QMkyG0AvDH27dsXHR0dGRlpaGjo6upqaWmZn5/PYrFwaWBg4JIlS9atW2dra3vgwAH8RMvJyQm37N+2bZuxsbG9vb2np2dLSwtCqLu728HBgcFguLi42NjYXL9+nXzLNdyqFMvLy6uioqJf00Gpnb16e3sbGhokOz6T6HT64sWLAwICuFwum8329fW1tLQsKiqaNWsW3kBXV9fR0ZHBYMydO/fBgwcFBQWSDyRl1Dxkt7OZM2devXr12rVrBgYGq1at+vTTT7/++ms5S7Hi4mIul9vvQSUYHpWMhjL+wZhbYCyN/e9ty5Yt+vr6Y7lHQu4xoiorK6lU6vfffz/kln19fS4uLqmpqYqIboxqHlJTUxOdTj969OiQW8KYWzLAfRsAE9S4HW/e2to6MjIyMjKy3+D6/fT19WVlZXV0dPj5+Sk2AOXVLI+IiAhHR0c+nz/2u1YnkNsAAONOaGior6+vn5+f1EYlWH5+/oULF3JycgYbwWTElFfzkOLi4kpLS69cuSJ/Bz4gFeQ2ACacPXv2nDx5sq2tzcrKKiMjQ9XhSBcVFcXn8w8dOjTYBm5ubqdPnybHvVQg5dUsW3Z2dk9PT35+vp6e3hjvWv1A/zYAJpzo6Ojo6GhVRzE0d3d3d3d3VUcxdry9vb29vVUdhZqA+zYAAADqBnIbAAAAdQO5DQAAgLqB3AYAAEDdQFuSQRUVFfn6+qo6CjAhFBUVIYTU/veGh5JS+8McMwNHJgMkCgHTlksTFxd38+ZNVUcB1EpOTs6cOXPGvmU5UG/nz59XdQjjEeQ2AMYIhUI5e/bsmjVrVB0IAOoP3rcBAABQN5DbAAAAqBvIbQAAANQN5DYAAADqBnIbAAAAdQO5DQAAgLqB3AYAAEDdQG4DAACgbiC3AQAAUDeQ2wAAAKgbyG0AAADUDeQ2AAAA6gZyGwAAAHUDuQ0AAIC6gdwGAABA3UBuAwAAoG4gtwEAAFA3kNsAAACoG8htAAAA1A3kNgAAAOoGchsAAAB1A7kNAACAuoHcBgAAQN1AbgMAAKBuILcBAABQN5DbAAAAqBvIbQAAANQN5DYAAADqBnIbAAAAdQO5DQAAgLqB3AYAAEDdQG4DAACgbqiqDgAAtdXa2koQhOSazs7OV69ekYuTJk2i0WhjHhcA6o/S7/8eAEBR3n///evXrw9WqqmpWVtba2JiMpYhATBBwDNJAJRl3bp1FApFapGGhsa7774LiQ0AJYHcBoCyrF69mkqV/tifQqFs3LhxjOMBYOKA3AaAsujp6bm7u2tqag4s0tDQ8PHxGfuQAJggILcBoEQbNmwQi8X9VlKpVC8vLw6Ho5KQAJgIILcBoETLly/X1tbut7Kvr2/Dhg0qiQeACQJyGwBKxGQyfXx8+jX0ZzAYnp6eqgoJgIkAchsAyrV+/XqhUEgu0mi01atXMxgMFYYEgNqD3AaAcn344YeSr9aEQuH69etVGA8AEwHkNgCUi0aj+fn5aWlp4UVdXV03NzfVhgSA2oPcBoDSrVu3rre3FyFEo9E2bNgwWKc3AICiwJhbACidWCyeMmVKfX09QqiwsHDx4sWqjggANQf3bQAonYaGxh//+EeEkKmp6aJFi1QdDgDqT4nPRp4/f/7rr78qr34A3iCGhoYIoQULFpw/f17VsQAwLpibmzs5OSmrdkJpzp49q6ygAQAAvOFWr16tvASk9HfaBLzPAwAhhFBGRsbq1atVHYXiUSiUs2fPrlmzRtWBKJevry9CCG67FQWfT+WB920AjBG1TGwAjE+Q2wAAAKgbyG0AAADUDeQ2AAAA6gZyGwAAAHUDuQ0AAIC6gdwGAFCBK1eucDicixcvqjoQZcnNzQ0NDRWLxT4+PhYWFnQ6ncvlent7l5WVyfPxmJgYOzs7BoPBYrHs7OzCwsLa29vJUqFQGB4ezuPxtLS0uFxuSEhIV1eXnIFFRkba29vr6Ohoa2tbW1t/8cUXr1+/ltwADwvHZDJNTU13797d09MjT+lPP/0UExPT19cnZxjKBrkNAKAC6t3zdd++fQkJCXv27BGLxQUFBWfOnGlpaSksLOzq6nr33Xfr6uqGrKGgoGDz5s1Pnz6tr68/cOBATEyMZB+S4ODg2NjY6Ojo5ubm06dPp6SkBAQEyBlbXl7e9u3ba2pqmpqaoqOj4+PjJbuaVVRUuLu7u7m5NTY2ZmZmfvfdd9u2bZOndPny5XQ63c3NrbW1Vc5IlEt53cLxuCTKqx8AMB4ghM6ePavqKAYlEAicnJxGX8/q1avlHEfj0KFDNjY2XV1dBEEIhcKPP/6YLPrtt98QQlFRUUNW4uPjg2vAcPqpq6sjCKK6ulpDQ+Ozzz4jS/fu3YsQunfvnjzheXl5iUQichF3un/69CleXLt2rZWVlVgsxouxsbEUCuX+/fvylBIEwefznZychELhkGHIfz5HBu7bAADqLDU1taGhYcx2V1VVFRYWtn//fjqdjhCiUqmSz115PB5CqLq6esh6MjMzcQ0Yl8tFCOGHh8XFxWKxeMGCBWSph4cHQujq1avyRHjp0iVNTU1yEY90KhAIEEIikejy5cuurq4UCgWXfvTRRwRBZGdnD1mKRURElJaWxsfHyxOJUkFuAwCMtcLCQgsLCwqFcvz4cYRQcnIyi8ViMpnZ2dkfffSRjo6OmZlZWloa3jghIYFOpxsbG2/dutXU1JROpy9atOjWrVu4lM/na2lpTZ48GS9+/vnnLBaLQqE0NTUhhIKDg3ft2lVdXU2hUKytrRFC//jHP3R0dKKiopR0aAkJCQRBLF++XGopfiumo6Mz3GorKyt1dXWnTp2KENLQ0EAIMRgMsnT69OkIofv3748g4NraWgaDYWVlhRB69OjR69evLSwsyNJp06YhhPA7QtmlmJ6enqura3x8PKHqZ86Q2wAAY83Z2VlykpDAwMAdO3Z0dXWx2eyzZ89WV1fzeLzNmzcLhUKEEJ/P9/f3FwgEQUFBNTU1JSUlIpFo6dKlz549QwglJCRIDmWZlJS0f/9+cjE+Pn7ZsmXTpk0jCKKqqgohhBs7iMViJR3a5cuXbW1tmUym1FL8TNLZ2VnO2oRCYW1t7fHjx3NzcxMTE/Hs7XZ2duh/M5mBgQFCqLGxcbjRCgSCvLy8zZs345pfvnyJEGKz2eQGdDqdwWDgqQdll5LmzJlTW1t79+7d4QajWJDbAADjxaJFi3R0dIyMjPz8/Do7O58+fUoWUanUGTNmaGtr29vbJycnd3R0nDx5cgS78PLyam9vDwsLU1zU/6ezs/Px48f4bqaf+vr69PT0oKAgJyenwe7qBjI3NzczM4uIiDhy5MjatWvxSgcHBw8Pj6SkpLy8vO7u7pcvX2ZmZlIoFPynwLBER0ebmpoePHgQL+JGj5JPLBFCNBoN327KLiXhm8jy8vLhBqNYkNsAAOMOvo0Y7GI9b948JpP54MGDsQ1qaA0NDQRBSL1pc3JyCgoKWrFiRU5ODo1Gk7PCZ8+eNTQ0nDlz5tSpU3PmzCFfHKanp/v6+m7cuFFfX3/x4sU//vgjQRD47k1+mZmZ586du3r1Knkrht/wiUQiyc16e3vx80/ZpSR8+P1u5sae0ue4AQAAhdPW1h7BIzhl6+7uRghpa2sPLDI2Nk5NTZ05c+awKqTRaEZGRu7u7lZWVjY2NrjJPkKIw+GcOHGC3OzFixdpaWlTpkyRv+b09PS4uLj8/HzJT+HXlpId6QQCQXd3t6mp6ZClJJzq8KlQIchtAIA3jFAobG1tNTMzU3Ug/eHLutT+y0ZGRrq6uiOu2draWlNTs6KiQmppcXExQmjJkiVy1paYmHj16tW8vLxJkyZJrreysmKz2U+ePCHX4JeUs2fPHrKU1Nvbi/63qYtKwDNJAMAbJj8/nyCIhQsX4kUqlTqCV03KYGxsTKFQ2traBhZdvHgRt+OXR3Nz8/r16yXXVFZW9vX1mZubS90+JSXFysrK1dV1yJoJgti9e3d5eXlWVla/xIYQolKpnp6eN27cINva5OTkUCgU/IJQdikJH76JiYlch6o0kNsAAG8AsVj86tUrkUhUVlYWHBxsYWHh7++Pi6ytrVtaWrKysoRCYWNjo+SNBUJIX1+/rq6upqamo6NDKBTm5OQorw8Ak8nk8XjPnz/vt76qqsrExIRsDIL5+fmZmJiUlJQMrIfFYl27di0vL6+9vV0oFN65c+eTTz5hsVg7d+7EG7zzzjtPnjwRiUQ1NTUhISG5ubmpqan4JaXsmu/du3fkyJGUlBQajUaRcPToUbxBWFhYfX39vn37Ojs7b968GRsb6+/vb2trK08phg/fwcFhuGdPsSC3AQDG2vHjx+fPn48Q2r17t7e3d3Jy8rFjxxBCs2fPfvToUUpKyq5duxBCHh4elZWV+CPd3d0ODg4MBsPFxcXGxub69evka63AwMAlS5asW7fO1tb2wIED+GmYk5MT7iSwbds2Y2Nje3t7T0/PlpYWZR+al5dXRUVFv6aDUjt79fb2NjQ0SHZ8JtHp9MWLFwcEBHC5XDab7evra2lpWVRUNGvWLLyBrq6uo6Mjg8GYO3fugwcPCgoKJB9Iyqh5yG5nM2fOvHr16rVr1wwMDFatWvXpp59+/fXXcpZixcXFXC6334NKFVDekCcw5hYAEwFS/phbW7Zs0dfXV+ouhiTnGFGVlZVUKvX7778fcsu+vj4XF5fU1FRFRDdGNQ+pqamJTqcfPXp0yC1hzC0AAJDeQGMcsra2joyMjIyM7De4fj99fX1ZWVkdHR1+fn6KDUB5NcsjIiLC0dGRz+eP/a77UXFumz9/vqampqOj42AbyJgIIyAggM1mUyiU0tLSITdWCGXXf/ToUfwuWrJ1L4bny5CxgUIMd5aKCxcu8Hg8yaf2vq4LYgAAIABJREFUVCrV0NDwgw8+yMzMlNwSvkcMf4+S523y5MkbNmwYrKq7d+/6+flZWVlpa2sbGhq+9dZbZDdbPz8/ikyXLl2S3NFgvZXj4uIoFIqGhoadnd2NGzfG20wlb6LQ0FBfX18/Pz+pjUqw/Pz8Cxcu5OTkDDaCyYgpr+YhxcXFlZaWXrlyRf4OfMqj4txWXFwsu90qMfjT4W+//TYlJUXOjRVC2fWHhIRIDkREIufLGGwDRRnuLBWrVq169OjRtGnTOBwOfg7Q2Nh49uzZ2traVatW4YfSGHyPSOJ7lDxvL1++/OGHH6TWU15evmjRosmTJ1+/fr2tre3XX3/18PDIz88nN7h27Vpra6tQKHzx4gVCaPny5b29vZ2dnQ0NDZs3b0YSXxBC6Ntvvx3YmLCvry8hIQEh9P777z948ODdd98ddzOVILRnz56TJ0+2tbVZWVllZGSoOhy5REVF8fn8Q4cODbaBm5vb6dOnyWEwFUh5NcuWnZ3d09OTn5+vp6c3xruWTnmPO+V83+bm5ubo6DiyXeDRVO/cuTOyjw9JUbNjyA+/Of/666/JNZLzZUjdYKBRhi3/LBWYZG7D8HjkK1eulLOGCfg9EtLOWz8bN26cMmWK5Jqenh5ywhQ8KhX+N85t3t7e5JYnTpy4ePEiuaO3334bIXTu3Ll+uzh79uyiRYsQQm5ubpLrh/UbQON7jhtFUfb7oYlmQrxvG/ENLDnVgpKM8ewYA/WbL0NOowx79LNUWFpaIoTk/8Mfvkepmpub29raJJv2aWlpkY9S09LSZDx02rJly8cff0wuBgYGIoQGNmmLi4vDLRL7GT8zlQAwMuMit1VVVdnZ2bFYLNzAt7CwEK/vNxEGQoggiNjYWFtbW21tbQ6H8+c//5mspN/GR44cYTKZbDa7oaFh165dXC734cOHfX194eHhFhYWDAZj9uzZkg/Nvv/++3nz5tHpdBaLZWlpeeDAgX6zY0gNJi4uDo/fqqent2LFCnKAO9lzdiCECgoK7O3tORwOnU53cHAYbOIl2fNlIIR++eWXd955h8lk6ujoODg4tLe39ws7Pj6exWJpaGi8/fbbJiYmNBqNxWLNnTvXxcXF3NycTqfr6up+8cUXknX2m6ViBHOC4DkvyJ6k8D0O+T1KNX/+/M7Ozvfff/9f//rXsD440Pvvvz9jxozr168/fPiQXPmvf/1LIBC4u7sP3H78zFQCwAgp75ZQ/meSPB7v8ePHQqHw999/X7BgAZ1O/89//oNLcQ+VxMREvPjll19SKJSvvvrq1atXAoEgKSkJSTzLGrgxQigoKCgxMXHlypX3798PCQnR1tbOyMh49erVnj17NDQ0iouLCYLAfWsOHTrU3Nzc0tLy//7f//vDH/5AEMSqVavw7BhS6w8PD9fS0vr+++9bW1vLysrmzp1raGj48uVLyb3//PPPbW1tDQ0NLi4uLBart7cXl54/fz4iIqKlpaW5uXnhwoUGBgZ4fb9nWTwez97eXvJ0SW7w+vVrHR2dmJiYrq6uly9frly5srGxcWDY+/btQwjdunWrs7OzqakJT2N4+fLlxsbGzs5O3KKptLRUci+hoaHkib106RKbzY6MjBzsG5R8tiYQCHJycqZOneru7v769evBTh18j4QczyQFAsG8efPw/1N7e/uYmJjm5mapWw58JtlvR48fP/7rX/+KEAoODibX+/j4nDx5sqOjAw14Jkn8729ANgTPJMHwKft8jovc9tZbb5GL+E/+kJAQvCh5GRIIBEwmc+nSpeTG/d7TSL0mkm84urq6mEymn58fXhQIBNra2oGBgb29vbq6ukuWLCGrFYlE+C9WGddEgUAwadIksjbiv7PFkzmg397x5buqqmrgGYiOjkb/HUG8X+qiUCjLli2T3Fhyg99//x0hdOnSpX4VSs1tHR0dePHUqVMIofLycsmw09PTJWv47rvvEEJ///vfB0Y70MAZPRwcHE6dOtXT0zPYqYPvkZAjtxEE0dvb+9e//hXP14UQMjY2xsNN9SNPbmttbWWxWHp6egKBgCCI6upqMzOznp6ewXKb/L8ByG1gBJR9PsfdWMkODg4cDkdyIldSVVWVQCBwc3MbWc0PHz4UCARkx34GgzF58uQHDx6UlZW1trZ++OGH5JaamppBQUGya6uoqHj9+jX5ZzVCaP78+VpaWuR0wP3ImLMDv24c2OpaxnwZGI/HMzY23rBhQ1BQkL+/P37LNSQcCTlRBd57v8CGO0sFh8PBb9dEIlF9ff21a9f4fH50dHRhYSGesV4SfI/yo9FofD6fz+ffunXr8OHDWVlZvr6+Dx8+HEFTNA6Hs379+pSUlPT09E2bNh07diwwMFBLSwuPbDvQsH4Dx44dO3/+/HBDerMUFRUhhHx9fVUdiJooKioiRwRVhnHxvq0fGo0m9dqBhykzMjIaWbWdnZ0Iob1795IdgJ48eSIQCPCUDcMdohtfyvsNNqqrq4v/Ch7S5cuX33vvPSMjI21t7X6vu0gy5svAGAxGXl6es7NzVFQUj8fz8/PrN9LPiI14lgoqlcrlcjdt2nT06NGHDx9KbQMN3+MILFiw4Mcff9y2bVtjY+P169dHVgluUXLixInW1tbz589v3bpVxsbjZKYSAEZm3N23iUSilpYWCwuLgUW4jRme+3UE8MX02LFjwcHBkuvx2/WmpqZh1Yavof2ugHLOu/H06VMfH5+VK1d+9913U6ZMSUxMlHpZlDFfBmnmzJkXL15sbGyMi4s7fPjwzJkzFTKh8OhnqcAjpd67d29gEXyPMty4ceP27ds7duxACOE+glTq//0n/eMf//j1118LBAJ5qhrI0dFx4cKFRUVFW7Zs8fX1lX3zN6zfwI4dO9asWTOyqN4U+I5N7W9Px4yy74DH3X3b9evXxWLx3LlzBxbNmjVLQ0Pjl19+GVnNuFkgOfgFydLSUl9f/9q1a8OqbdasWZMmTfr3v/9Nrrl161Zvby/uSCRbeXm5UCgMDAzk8Xh0On2wFvAy5svA6urqcPIwMjI6dOjQ3LlzpeaSERj9LBW3b99GCPUbIByD71GG27dvs1gs/O+enp5+XyjO36MZhRbfumVkZOD0KcM4makEgJEZF7mtt7e3ra1NJBKVlJTw+fypU6eSs1dIMjIyWrVqVUZGRmpqant7e1lZ2TfffCP/Xuh0+qZNm9LS0pKTk9vb2/v6+p4/f/7ixQttbe09e/bcuHGDz+fX1taKxeKOjg58Tek3O0a/2nbt2pWZmfnDDz+0t7eXl5dv27bN1NR0y5YtQ0aC70pzc3O7u7srKysHe7Uz2HwZpLq6uq1btz548KC3t/fOnTtPnjzBz69lhC0nyVkq5JwTpKurSywWEwRRV1d38uTJvXv3GhoaSr2AwvcolVAorK+vz8/PJ3MbQsjHx+fcuXOtra1tbW3Z2dl/+ctfvL29R5Pb1qxZY2ho6OPjw+PxZG85TmYqAWCElNdMRc52kidPnlyyZImxsTGVSjUwMFi3bt2TJ09wUWJiIh45hslkLl++nCCIjo6OgIAAAwODSZMmOTs7h4eHI4TMzMzu3r3bb+OYmBj8OMXc3Jwck7unp2f37t0WFhZUKhVfYSsqKnDR8ePHHRwc6HQ6nU6fM2dOUlISQRAlJSVTp05lMBjOzs579+7tF4xYLI6NjZ0+fTqNRtPT0/Px8Xn48CGuLSkpCb+Knz59enV19TfffKOjo4MQmjp1Ku7esHv3bn19fV1dXV9fX9zRatq0acHBwfjPZBaLhQf14PP5NBoNN2wjCOKrr76S3KCmpmbRokV6enqamppTpkz58ssvRSJRv7BDQ0NxJJaWlgUFBYcPH+ZwOAghExOT06dPp6en4wr19PTS0tLIL8XLy4vL5eJcdeXKFTabffDgwYHfXWZm5sBGktra2tOnTw8MDHz69Cl8j1K/R6nnjZSZmYk3u3bt2tq1a6dNm6atra2lpWVraxsREdHd3S35FbS3t7/77rv6+voIIQ0NDWtr66ioqIFfkKGh4fbt2/HKL7744tdff8X/Js+GhoaGvb19QUGB1N+AbAjaSYLhU/8+AEAG+efLUCD5Z6kAclLJ9zgaw/oNQG4DIzAhxtwCg5FzvgzFGj+zVKgNlXyPowG/AfCmg9w23skzX4YCjatZKtTJGH+PowG/AYXA8xmJxWIfHx8LCws6nc7lcr29vaV23h0oJibGzs6OwWCwWCw7O7uwsDDcywUTCoXh4eE8Hk9LS4vL5YaEhMjf/ycyMtLe3l5HR0dbW9va2vqLL76Q/JPr4MGD/SZLIvuSkruOjo62trbW0tLS1dWdNWtWTU0NGv4MWcoGue0NMOR8GYoy7mapUC9j9j2OBvwGFIKcz0gsFhcUFJw5c6alpaWwsLCrq+vdd9+tq6sbsoaCgoLNmzc/ffq0vr7+wIEDMTExq1evJkuDg4NjY2Ojo6Obm5tPnz6dkpISEBAgZ2x5eXnbt2+vqalpamqKjo7+/+zdeVxTV94/8BMIIYQlgAJFNlkUBbFotRqEokO1VqqAZbO1led56VitA1bbUlwqoGBdijwo6lPLQ1tHRVwG3NAZB2lxKpW6YcFWQRGEEURk0QQJ5P7+OL9m0gAhICFw+bz/8t57cu73hitf7nLONzk5uUev44eFhX333XcHDhwQi8W3bt1ydnamqXHAVUfS3O1OPG8DGAqIhp+39WGJohfpSv3nQ4r1jKRSqbwsEfP7jG6K7/t0JSgoSLEiEk0/1dXVDMOUlZXp6Oj8+c9/lm9dt24dIaSkpESd8Pz9/elLZxQdmCh/82vjxo0qHgwfOnSIw+EUFRV11UD96kh43gYAQ1oflijqh2pHSvWMuFyuYoV3OvSirKys236OHz+uWBHJxsaGEEKvkAoLC2Uy2ZQpU+Rb6QToXZWhUHLq1CldXV35Ip0VT80JAfbs2TNx4kQVI0MGTnUk5DYA0Dim60JCkZGRPB5PXif6ww8/NDQ05HA4dIoZpRJFKSkpfD7f0tLygw8+sLa25vP5Xl5e8pGFPeqK9Kp+U7dU1zOiT8XoSJIeuXPnjqmpqYODAyFER0eH/HHKmFGjRhFCbt261YuAq6qqDAwMHB0du23Z2tpaUFDg6empos3AqY6E3AYAGhcbGxsTE7N27dra2toffvihsrLSx8eHTsSckpKiOF9XampqXFycfDE5OXnu3Lm0jENpaWlkZGRERIRYLI6KiiovL7969WpbW9vMmTNpbYcedUV+nwhNJpP14ZGePn3a1dW1q6mx6T1Jb29vNXuTSqVVVVW7du06f/78zp076VTdtC6EYiYbNmwYIeTRo0c9jVYsFufm5i5ZsoT2TMXExJiZmfF4PEdHx8DAwMLCQrq+urq6tbX1ypUrM2bMoH9YjB07lg4hVexzwoQJVVVVN27c6GkwfQu5DQA0SyKRJCUlzZ8/f+HChUKh0MPDY+/evXV1dT2aj0YRl8ull4Bubm67d+9ubm5OT0/vRT/+/v5NTU19MgUr9ezZs3v37nU6ML+mpiYjIyMqKkokEqlfpdbOzs7W1jY2Nnbr1q1hYWF0pYeHx+zZs1NTU3Nzc1taWh4+fHj8+HEOh9OLSYgSExOtra03bdokX7No0aITJ05UVlY+ffr00KFDFRUVvr6+xcXF5Pc7ohYWFgkJCcXFxTU1NYGBgStWrDh48KBin/Qi8ubNmz0Npm8htwGAZvW0kFCPTJo0SSAQyO9wapeKekYikSgqKiowMDAnJ0f9wRWVlZW1tbUHDx789ttvJ0yYIH9YmJGRERIS8v7775ubm0+bNu1vf/sbwzD06k19x48fz8zMPHfunLGxsXylnZ3dhAkTjIyMeDze1KlT09PTJRIJLVtIa1m4u7t7eXmZm5sLhcK4uDihUKj0N0pPK2RpyICrAwAALPOChYS6pa+v34vbcZqgop6RpaVlWlqau7t7jzrU09OzsLCYNWuWo6Pj6NGj6Sv7hBChULh37155s3//+9+HDh0aMWKE+j1nZGQkJSXl5eWp/pSHh4euru7t27cJIdbW1uSPpTZ4PJ6Dg4PSqzEDpDoSchsAaNaLFBLqllQq7auuXpyKekYWFhY9LS6oyMXFRVdXl94b7Ig+EpsxY4aave3cufPcuXO5ublKf3B0JJPJZDIZzdZGRkajRo1Sqk3R1tZGp6iVe/EKWX0C9yQBQLO6LSTE5XJ7V7CCEJKXl8cwjLyC84t09eJU1DM6efIkfY9fHY8fP37nnXcU19y5c6e9vd3Ozq7T9vv27XN0dPT19e22Z4ZhoqOjb968mZWV1WliU6xcTwgpLCxkGEYkEtHFsLCwa9eu3b17ly6KxeL79+8rDQkYINWRkNsAQLO6LSTk4uJSX1+flZUllUofPXp0//59xY93LFEkk8mePHnS1tZWVFS0cuVKe3t7eVWsHnWlZv0m9XVVz6i0tNTKykr+MggVHh5uZWV19erVjv0YGhr+/e9/z83NbWpqkkql165dW7RokaGh4apVq2iDV1999f79+21tbeXl5R9//PH58+fT0tLk7zqq6LmkpGTr1q379u3T09NTnFhr+/bttEFVVVVGRkZDQ4NUKr106dLixYvt7e2XLVtGt65atYrWIKuoqHj8+HF0dLREIvnss88UdzFAqiMhtwGAxm3YsCExMTE+Pn748OG+vr4jR45UrFS3fPnyGTNmLFiwwNXVdePGjfR2lkgkom/2L1u2zNLS0s3Nbc6cOfX19YSQlpYWDw8PAwMDHx+f0aNHX7hwQf6Iq6dd9Tl/f//i4mKl2R07HezV2tpaW1ubnZ3dcROfz582bdrixYttbGyMjY1DQkJGjhxZUFAgn9rR1NTU09PTwMBg4sSJv/76a35+vuINSRU9dzvsbPbs2evWrbO1tRUIBKGhodOmTSsoKJC/pWJmZpafn29ra+vp6WljY3P58uXTp08rjXgrLCy0sbF5kSqDfUNzU55gzi2AoYD0b42bpUuXmpub99vu5NScI0r9ekbt7e0+Pj5paWl9EV0/9dwt9asjYc4tAIA/GDiTzXekZj2j9vb2rKys5ubm8PDwvg1Acz2rY+BUR0JuAwDoS+rUM8rLyzt27FhOTk5XM5j0muZ67taAqo6E3AYAg8aaNWvS09MbGxsdHR2PHj2q7XC61G09Iz8/vwMHDsinvuxDmutZtYFWHQnj2wBg0EhMTExMTNR2FGqZNWvWrFmztB1F/wkICAgICNB2FP+B6zYAAGAb5DYAAGAb5DYAAGAb5DYAAGAb5DYAAGAdzQ0Lp/OSAAAAdKTReUk4THfTi/XagwcPfvzxRw11DjDohIWFrVy5Uj6lOsAQZ2dnp7n/DhrMbQCgiMPhHD58ODQ0VNuBALAfnrcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbILcBAADbcLUdAABrHTp0qLm5WXHN+fPnGxoa5ItBQUEWFhb9HhcA+3EYhtF2DADsFBER8e233+rp6dFF+n+Nw+EQQtrb242MjGpra/X19bUZIgBL4Z4kgKYsWLCAECL9XVtbW1tbG/23rq5uSEgIEhuAhuC6DUBT2trarKys6uvrO936z3/+809/+lM/hwQwROC6DUBTuFzuggUL5PckFQ0fPtzX17f/QwIYIpDbADRowYIFUqlUaaWent57772nq6urlZAAhgLckwTQIIZh7O3tHzx4oLT+8uXLkydP1kpIAEMBrtsANIjD4SxcuFDptqSdnd2kSZO0FRLAUIDcBqBZSrcl9fT0IiIi6EgAANAQ3JME0LgxY8b89ttv8sVffvnF3d1di/EAsB6u2wA07r333pPflnRzc0NiA9A05DYAjVu4cGFb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efGmsLCwa9eu3b17ly6KxeL79+8rDQmgQdIZvTUKuQ0ABpNuq/y4uLjU19dnZWVJpdJHjx7dv39f8ePm5ubV1dXl5eXNzc00b3VVgqqnXamu7qRRAoHAycnpwYMHSutLS0utrKzCwsIUV4aHh1tZWV29erVjPyUlJVu3bt23b5+enp7ixFrbt2+nDaqqqjIyMhoaGqRS6aVLlxYvXmxvby8v5bhq1SpaW6qiouLx48fR0dESieSzzz5T3AUNUsUYuL6C3AYAg8yGDRsSExPj4+OHDx/u6+s7cuTIvLw8Q0NDunX58uUzZsxYsGCBq6vrxo0b6e0vkUhE3+xftmyZpaWlm5vbnDlzaMnAlpYWDw8PAwMDHx+f0aNHX7hwQf7gqqddaZG/v39xcTEdxybX6TCy1tbW2tra7Ozsjpu6HXY2e/bsdevW2draCgSC0NDQadOmFRQUyOsimZmZ5efn29raenp62tjYXL58+fTp00oj3goLC21sbMaPH9+zw+sFxUlKMOcWAGgX6d/5JLVVgqrP59y6c+cOl8tVMSGWXHt7u4+PT1paWh/uXU11dXV8Pn/79u193jPm3AIA+IOBVoKqd1xcXOLj4+Pj41WXTW9vb8/KympubtZKlZLY2FhPT8/IyMh+2BdyGwAAG8TExISEhISHh3f6UgmVl5d37NixnJycrmYw0ZykpKTr16+fOXOmR8Pseg25DQCGqDVr1qSnpzc2Njo6Oh49elTb4fSBhISEyMjIzZs3d9XAz8/vwIED8kky+012dvbz58/z8vLMzMz6Z48Y3wYAQ1RiYmJiYqK2o+hjs2bNmjVrlrajUBYQEBAQENCfe8R1GwAAsA1yGwAAsA1yGwAAsA1yGwAAsE0n75JkZmb2fxwAANSlS5e0HYLG0amn8Mu2rzx48EB5hmvFgdx0XhIAAIDBRWleEg7T3QRiANAnOBzO4cOHQ0NDtR0IAPvheRsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsAALANchsA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UALkNgCNsX379uTk5MTExDFjxvj4+EyYMKGwsNDIyIhuXbduna+v74oVK1xdXb/66iv6XhnzBsTatWutra3d3NwWLVrU1NRECGlvb3d3dzc0NPT29p40adKlS5eYp1zD7Uq+/P39y8rK6HFsjD6HkXV0dNTX1+fl5fXZz/Xr1728vMaOHXvjxo2SkhJbW9u5c+devny5v94YHA4nJycnLCxs9erVFhYWbm5ujx49On78uLe3t+xmt27dsrOzmz59+rDPEJRAVROiaCfMuQV9Uv6cTBEREZaWlso8IjXk7395eTmXy2Uq8A2gu7vb29s7IyNDHtENT2NjI4/H27dv31A2xpxbyofrNgAtpbYz2bu4uCQmJiYmJvaYmL+H7u7u3NxckUikkkIT8fHxHh4ekZGRyj80DAVyGwConZiYmJCQkLCwsD5fKqEVFhYeP348Pz+/vxlMFCclJaW4uPjs2bNyHGYH8oXcBqB1NKK4T1JSUmRk5M6dO/vbwM/P78iRI8y8l0qTl5f38uXLwsJCCwsLJR8ahg5jAAC0TnJycnJysqqjGNyCBQsWLFig6ih6CggICAgIUHUUMAhctwEAANsgtwEAANsgtwEAANsgtwEAANvgXRIVyM7OVnUIoF7o2ZtY/8W4du0a0YLT7K2mpkYd5qHWKhwKBdGVKDs7u8eEeACgDYKDg3NyclQdhRZBbgNQEg6Hk5WVtXz5clUHAsB+eN4GAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsg9wGAABsw6EoStUxALBTRETE/fv3mcWioiJHR0cLCwt6UVdX99///re9vb2KogNgM66qAwBgLRsbm0OHDsmuKS0tZf7t5OSExAagILgnCaAo7733Xn9N+vr64eHhSowFQLvgniSAAk2bNu3u3bt9/pbdv39/0qRJyg8JQBvgug1AgT744ANdXd0eKzkczowZM5DYABQHuQ1AgVasWNHd3d1j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\n", "text/plain": [ "" ] }, "execution_count": 25, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "tf.keras.utils.plot_model(model, show_shapes = True)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "IJFMxZwMWoTw" }, "source": [ "### Fitting model\n", "* Setting batch_size = 100 and epoch = 2" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 425 }, "colab_type": "code", "id": "ZpVkajCcWnRK", "outputId": "c2675bc7-3411-4f36-8ac1-65fa941a9a85" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/6\n", "\n", "Epoch 00001: val_loss improved from inf to 0.45601, saving model to sarcasm_detector.h5\n", "171/171 - 5s - loss: 0.6003 - accuracy: 0.6652 - val_loss: 0.4560 - val_accuracy: 0.7964 - lr: 0.0010\n", "Epoch 2/6\n", "\n", "Epoch 00002: val_loss improved from 0.45601 to 0.37185, saving model to sarcasm_detector.h5\n", "171/171 - 4s - loss: 0.4396 - accuracy: 0.8054 - val_loss: 0.3719 - val_accuracy: 0.8329 - lr: 0.0010\n", "Epoch 3/6\n", "\n", "Epoch 00003: val_loss improved from 0.37185 to 0.35007, saving model to sarcasm_detector.h5\n", "171/171 - 4s - loss: 0.3802 - accuracy: 0.8364 - val_loss: 0.3501 - val_accuracy: 0.8425 - lr: 0.0010\n", "Epoch 4/6\n", "\n", "Epoch 00004: val_loss improved from 0.35007 to 0.33750, saving model to sarcasm_detector.h5\n", "171/171 - 4s - loss: 0.3344 - accuracy: 0.8583 - val_loss: 0.3375 - val_accuracy: 0.8505 - lr: 0.0010\n", "Epoch 5/6\n", "\n", "Epoch 00005: val_loss improved from 0.33750 to 0.32761, saving model to sarcasm_detector.h5\n", "171/171 - 4s - loss: 0.3032 - accuracy: 0.8754 - val_loss: 0.3276 - val_accuracy: 0.8533 - lr: 0.0010\n", "Epoch 6/6\n", "\n", "Epoch 00006: val_loss improved from 0.32761 to 0.32238, saving model to sarcasm_detector.h5\n", "171/171 - 4s - loss: 0.2740 - accuracy: 0.8866 - val_loss: 0.3224 - val_accuracy: 0.8610 - lr: 0.0010\n" ] } ], "source": [ "batch_size = 100\n", "epochs = 6\n", "\n", "h = model.fit(x_train, y_train, epochs = epochs, validation_split = 0.2, batch_size = batch_size, verbose = 2, callbacks = callbacks)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 821, "resources": { "https://localhost:6006/": { "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48aHRtbCBsYW5nPSJlbiI+PG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CiAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1RQUFBREVDQVlBQUFEQXBvNXJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQmFiZ0FBV200QnhXc2pPQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUJsMFNVUkJWSGljN1oxNWVGVFYzY2MvdjVzRkNWUnhxVnRwdFZXMlZseGY2MXF0aXEwTDlHbDlOWFVCRkVwRlJUSWhoQkFEQ1RkQU1BRWtDWXNLN3FCOStrRDcycWZCV2l2cVc3VmE2NzRpcmU5cmF4WDFiWlZXWlRITC9ONC81ZzRHU0dEdXpMMXo3NTA1bjM4NHpNdzU1OHZNL1hLMjN6a0hESUdqaXpoUEYzRmUwRG9NSUVFTHlHZDBQb093YUFBdWNWNWFoMFc1VlBCNmtMcnlHV09JQUZDYi92U2pFcWdHK3V6d0t3Z2R3QzEwVUNmVi9Ec1loZm1MTVVRV1VSdUxFa1lEOHhFTzJ2N0dqb1p3UHN4SFdNeGhJRXVsbEs1czZzeG5qQ0d5aEM3Z0pKUlc0Q1NnWnhQMG5INEppNWlVODdqZkdnM0dFTDZqVFF3RTVnR2prVzdmZCtxR1NMS1dJc3BrTW0vN0lOUGdZQXpoRTJwVFFoK3FzS2dDK2dMdVRiQnJlaXV3bUhZYVpEcWZlaXJZQUJoRGVJNHFRaU1YQXdzUUR2UEFCRDJsTnlMVXM0bmJ4U2FldVdwREVtTUlEOUViT1FGb1JUaHQrNHYrR0NMNTU3TkF1Y1I0S2kzQmhsMHdodkFBYmVBUUxHeGdBbUQ1YW9MdTZjU2ZpdkFMbEVxSjhZNUw2WWFkTUliSUFMVXBwb2hyRVdZajdMMzlqZXdhSXBuZWpMS1F2V21VY1d4TDZSOWcyQVZqaURUUnVZekNvZ1g0QnBBOUUzUlA5L3orMzRHWlVzYktYcVFiZG9NeGhFdTBnYU1SbWxITzl2QUIvNk9UT3RrRFF5VFN5aU1vNVJManRaNytIWWFlc1lJV0VCWFVaaitkU3l2d1BNclpIaFc3RVdFaW4zRWFVemtWb1JUNG15Y2xDK2RnOGJJdVphWGV3b0dlbEprSG1CWmlENmhOSVVXTVIya0FEdkNvVmRpS3NKajRydXNKdXB3U1BxTUtxRUtjOVl2ZXlrbTl6azFBRXdmU0xLVzBZK2dWWTRqZG9QV2NnMFVMd2xIYlg4emNFR3NSeW1UYTdsZWN0WW1CRkRrcjNPeXd4cDJPSVpMcERRaFQ1VG9lMkYzZCtZd3hSQS9vSEFaQnQ3QnNiMXFGRnltZ1hDcmR4U1RwSXM0RVdoQ08zYVhNOUxXc280Q1lYTU1iYnJUa0E4WVEzVkNiL2dpVnlFNWgyWmtaNGlPRU9SeWVmdFNxMmxnTVlEVEtmT0FnajNSMW9OeENJWFV5MFlTWkp6R0d3SG5nTE9lQjZ5a3NPNzBITC9IQWlYZjdHblFaL1dudndiRHBhd1NjTVBQOVRKZzVHRU9nczFNSXkzYi9zSzBqVGt4cS9PbVNhQ3VEVUJxUTdUdnR2T2pXdlloUUx0ZmtkNWg1M2hwQ2JSZGgyYWsvVkJ0UUtxU0czM2dxdGhlMGxYT0FGdUFvRDlkRTFsSkFtZncwUDhQTTg4NFFhbE1DenJSbXFtSFplMzZRTmlFMDhUbk5ZbWQzV2xOdEN0bVg4WWd6TGR5N1JqZnBSSmg1RVEzeWsvd0tNODhiUXlnSWRWeU14UUxVWlZoMjcrOTNvdHlKTUZOcStJZlhtdDJnaTlpUFFtWUIxeUVVYm44ak0zTzhoMUxEUkZhSm9KNEtEaWw1WVFpdDVRUWtnN0Rzbmw5N0ZJdHlxZVpWVDhWbWlDNWhLRW96NGh4cjQwMVg2bG1VbUZ6RDB4NUtEU1U1YlFpdDRSQ0tzTkVNdzdKM2ZPMHRsQnFaeVJxUDVYcUtMbVlVUWd2aUJCOUNwdVpRNEY0NnFKSkpmT0NwMkJDUms0WlFtMkk2UFF6TFR2eVpDSy9laHh1bGpNODlsdXdMYWxQTS9zNzNBSHQ3MUZwc1JsaElZVzZHbWVlY0lYU0c1MkhaY1lUN0VLYkpERDcwVm0xMjBPVWNRZ2MyNHJTVTRNWDM4aFpDalV3SWQwdnBscHd4aE43QVVBcG9Cczd6Y0FyeUdaU1kxUEdNaDFJRFEyOTJ0cmdxcDNuMkhWazhTcHdwOGxOZThWQnFZRVRlRUdxekh4M01RcmdPbk5tVnpIL3NkNEVaMU9iZTdJb3F3aTNPSVFod0dPREY5OVdKT0xOdDQ0T2RiY3VVeUJwQ2JRcnBZRHg0R3BhOUJWakFsMmlTQ3JaNktEZDA2SEpLNktRS1NTSE1QTlcweFNiaU5MRjNkTVBNSTJrSXJYRldhTDBMeTFiZ0Z4UXdUV1o2dEVFbkl1amlGTUxNM2FZVFllWVZNaTQ3Sy9aZUVpbEQ2RXdHRWZjOExQczVMTXFsamo5NHB6UjY2TTJjNlV4RzdCcG03amI5eFd2cktLUk14ckxlTzZYK0VnbERxTzFFZVNyVkNIMjJ2NUdaSVRZQzlXQU8rMHFpTmhZSE80Y3hkdzh6aDB6V2JSSlJ2eDNSQ0RNUHRTSFV4bUlybzdHY0h3aThhQlhhZ1ZzcFlhWTVEckpuZEJuOXNhakVjc0xNSVJOREpFbUVtZmNOZDVoNWFBMmhOM1FMeS9adUduVXRRa3hzL3RkRHFUbUwzc29neE9taVptNklaUG9GbEhJWnh4TmVhdldLMEJsQ3F4aUkxVzJRQjE2MENpK2hsTXNjZnUrcDJEeEJWekRDaVk5S1RHSmtab2hrZWkxeEpzczQvdXFsMWt3SmpTSFVwb1F0empRZzlQV29WVWhzMzF6UFVsa1QzbVk2Q3FoTklWOXhUaDhSSjh3Y01qRUVKS2E1bDlDWHVWTEtaOTRxVG8vQURhRWdUT05peEZrb2N2K2w5cFJPWEV2VlRwMDBoWDhnRnlYMGR2WkRtUVZNQWdveU5FUXkvUjVDRGFPRFh3Z04xQkE2bFJPd2VnbkxUdDhRNnhES1pZNjV1TkJQOURhR0FZdVFicmVuWnY3Yi9RbUxtSXplZnBKaDFnbkVFRnJ1aEdYdjdyUnM5MS9xQnVKTWxYbm16S0Zzb3JjekNweGdTbTlhZDBXY01QTngyUTh6ejZvaG5PN1JOSlJhaFA0OXFuRC9wWDRNMUZQRXpXTFQ2YTFpUXlyb1hleEZuQXJnQnFDL1IrTy9UN0NZUXhHTHN4a0drdlVXUWlzNHpqa043NHdlVmFSdWlFUllkaEdWWXZOL2ZtZzF1RU9YY3dpRlBvV1pYNUdkTVBQQXhoQmF5U2lFVnVEcnJnMmhQSW93UmVibFJzaHhycUYzY3dKZHp0alF1eldrUjFIS1piUy9XM2FESFZUYkZMT1pheEhtQUYvYVFWSFBYOHhiV05SSVEyNXRTc2xGVkJIdTlpSE1ITzZraUpsUzZrK1llZURUcmdCYXhhSEFMR0FDMG1OVG05aTJXRXlqMkxtM2JUR1gwZVdVVUp6aWFlYXBwemVoMUhNb3krUXNiOGVOb1RCRUVxM2lQNXh1MUttT3NzVEc5aTZxWkVIdWJtelBCL1EyQmxMTVBOVERNSE40RTRzS3VaUUh2ZElaS2tPQU14TTFuVEVJRjJOaHl6eGVDRnFUd1R2MExyN3JoSmtmcy8zRnpNMXhQM0VxNVlyTVk5UkNad2hEN3FNMkZvYzdZZWFTUVpqNWp1a09MRzZoZzFvWnpTZnBhak9HTUFTR3JxWS9XN3VkWmc2WnR4YkMreWcyRm5la0UyWnVER0VJSEwyUFFYU2xFV2ErdXpROGowVzVsUEtrR3kzR0VJYlFvUGR3UHNJaWhLRkFwb2FBeEtYMkUrVEgzSm1xQnRlM2tHbzVFN1NjSDdyTlp6RHNDYm1TQjluSzBjQkU0SjllRkFrYzZpYUQrMnQ1bFNOUjd0Y1k2L1I2eDhrR2cwZklSRHBrREN2b3d4QmdNV1IzSDBzNmhpaHlVdWRRd0NzYW8xV3Y2eGFvWnpCNGdKVHlzWXdtUnB6aHdHK3pWYTk3UTFqYkRRRlFCSlJSeEhxTk1kWXpWUWFEZzR4bHZZem1mSVFmZ1A5NzRUTnBJYm96RUxoSHkzallkS01NZmlDWDAwWVJ3NEJ5U0grZFlVKzROd1E5R2lLQk1JSUNYdFlwTktyTlh1bkxNaGgyUlVwcGx5dG9SUmdHL3B5bDVhMGhFaFNqVE9kZnZLNHhScVlqeW1EWUhYSVpHOEdmdmRkK0dDTEpOeERhZEFwdFdzblgwNmpIWU1nNlhvMGhkc2RJdW5oZEs3Qk5OOG9RZGpLZFpVcVZ2aWl6K0lUWHRKSUwwOGh2TUdTRmJMUVEzVG1DT0d1MWdqWXQ1L0FNeWpFWWZNSFBNY1R1R0VrQmIyaWw2VVlad2tWUWhvQmtOK3BUWHRWcFhPQlJtUVpEUmdScGlDUkhvanlnVTJuVGF0T05NZ1JMdHNjUXZTT01wSlBYdFFwYkozZTdGTVZneUNMdURTRStHU0pCQ2Nvcyt2Q2FUdXQyWnFqQmtDWEMwR1hhRmVGSTRFR3RvazJuT21mNkdBeFpJSnlHK0lMRWJKVHBSaG15Uk5nTkFWQUN6S0tFVjNVNjM4OXkzWVk4SXdxR1NESUkrSzFXMDZiVCtWcEFHZ3c1VHBRTWtVQVppYkJlcTdIVnBqaFFMWWFjSTNxR1NKRG9SbTNqVmEzbWUwR0xNZVFPVVRWRWtzRUlEK2tOdE9rTXZocTBHRVAwaWJvaGtvd2t6bnF0TWQwb1EyYmtpaUVBK2dHemFPY1ZyZUhjb01VWW9va3JRMmppNEtkQ243UjR4UkRnZHpyRGRLTU03bkhYUWx3ZGVqTjBaeVN3WG1lYWJsUmVFM2QzR0lIYkxsTll1MHU5MFE5bEZsMjhyRE1aRWJRWVExYlpqRkxQTmhhNXllVE9FUHRHemhBSmxLSEE3M1FtSzdXR2c0S1dZL0FWQlZiUndTQzVERnZHdWJ1Q3paMGhPaU5xaUFRQ2pLR0FEVHFUbU5xUjZ2NFpVa0g1RXhhbnlhV01sVEc4bjA0UjdnelJGV2xESk5rSG9ZVXVudE5hVGd0YWpNRVQza1c0a2tzNVdVcDVPcE9DM0JuQ3I4MUJ3WEFNd2hOYVo3cFJrVVhaQXRSVHdHQzVsSlVpbVI5ZTVzNFE4Wnd5QkNTN1VZVzhxWFhFOUJJS2doWmtTQkZoRlVVTWxzdXdwWlN0M2hYckFyMmVvUlN3M2xXcDBVcS9oREJKYko3Q2tKZTRheUdLY3E2RjJKbGpnU2ZWWnFYYUhCaTBHRVAyeWVjeFJNK28wNDJDRFZwUFRGZWJibFErWVF6Uk93TlFXbGpQc3pxYlU0SVdZOGdPdWI1UzdRWEhvZnhCNjFtcDgvaHkwR0lNL21KYWlOUklkS002MmFCelREY3FsM0ZuQ01uN0lMbDlVVnJZd0o5MExpY0hMY2JnUGFiTGxBN0s4U2hQNlJ6VGpjbzFUSmNwZlJMZHFDN1RqY29sVEF1Uk9mc2l0UEFYbnRIWm5CUzBHRU5tdURORWVyY0g1UWZLQ1ZnOHBYTlpxVFlIQkMzSGtCNm1oZkFXQzJFTVJXelFCbUpxcDdWblBWUm9Nd09DMXBBSnVwcUQzWHplN1ErMjV6MEVycUtqY3BiOWdCYUtlVkliT1Nab01lbWdTemhVbDdLY1l1WUVyU1VkZEJWRDlHYzhRQWRUM2VSek82aDJOKzFxekhFS1NsblFJdHlnTnNXNmhCZ1dieUpjVFhvbnN3U0czc2UrZWgrTldMd0M3bSttY3JkclRDbEsreUhmTWQ5bTRER2dqUzZlb0lqSDBCemRreENuUFdnSnFhTExHSVhTQ3RHN1YxeHRMSTVnTkxBQTBnL01kTHVOTXBNeHhOc29Ed05yMlllSHhQN2lRZEZLS29EN01pZzd2QWdkUVV2WUU3cU1ZNG5UZ25KbTBGclNRZS9qTE9LMElCeWRhVm51REdGUjVHSlBVaGVKL1FWckVkcmtKcDd2N1lPeWtKOXBKWmRERHQ1aExlRnRJWFFwK3dOMXhKa0UwVnRIMFpWOERZdTVLR084NnA2Nzd6THRuczJJMHhVcTVOZXlnQTljS0xtZUxyNUw0Z1MrM0VIRDEwTG9jb3BvNXpyaTFDUHNFN1FldCtoSytpRk1BNmFqN09YbFdOV0xMdFBiQ0E4anUzYUYzQ0NOL0ZXcmFFQ1psM2doblZKQ1NNZ01vWXNad2VlMEFOOEtXb3RiVkJIdVpReEtFN2liVGsyVmRBenhSVmNvVHBzczdyMHI1Sm9TRnJDWlVoSTcxM0lES3h5RzBLVU1wb3RGS0JkRzhUOGJ2WXNUV1VVcitMczN4WjBodXJpYkl1WkxNeC83SVVac09yV1M2eENlcFB0MFgyLzdvS05Cb0dNSWJXWUFRalZkVElIb1JTdnJQWHdGdUJFWVRSWitmVmVHa0tXODZaZVE3WFVzNUdtZHhuTGdXci9yeWdvQmRablV4bUpBNXRPUVFhR3I2Y3RXeW9BWndKZXlWVzg0RjEyMlVZM3czaDQvRjRYV0lvQlpKcjJKczlpSEY0QjdpS0laN21JVVczZ0RwWkVzbWdGQ2FnaFp3aWRBaGJ0TS9takptQ3kyRUhvVFg5Vm1WbUx4S0VRdlpFVHY1SGk5aThjUmZnMGNIb1NHMEo1dktrMnMxbW1NUmhqbFByTVBndElsQzRiUUJmVERZaHJDZEdBdnYrdnpHcjJIL2VtaURnbCtQU1MwaGdEQTRucVVzNEQrYVpjUnZEbDg2ektwSWl6aVlvU0ZFTDJyaW5VNVJSUnpIVjNoV1E4SlpaY3BpVFR4RGtLOWR3VjZWbExxK0RUdHFnczVrVVU4Q2F3bWltYTRreEVVOFJKS0M0VERESkJsUTZoTm9icDlMUHZTQXJ6b3VaanNtR01UeXF0ZUZxaE5IS29MV1k3d1IrQlVMOHZPQm5vSFEvUjJIbkRpMnI0WnRKNmQ4ZDBRT3BrK09vVVJXa0Vybi9BdVU3aktUWDZ4NlVTNW1zU0NvRC80WVE3bEF5ek9raHJlOEt6SWhWeEVBWCtHNklWbEEranRqQWRlUTl5SFpXY0xYNzVVblVKZm5jSW9uY0pLQ3ZrUWVCZ29BdzVDYU5ZcUJyb3BUK2J6SEhDekgxcDNyY3lUVXQ2bWdPOUlOUzk3VXRvWEhFTzBZNzJHRWZKeHEyZml0SndCS09jaWpFTDVFZEMvbDRkckg3cTRCVnpPSGlrekVINEU3c3lVRWVtWjR6VUsrYjVNWjZQSGFneFpJS01XUWlleHY4WVlxekhhVUQ0a01jQWJ3NTVuaFVacUJUOTJVNWZNNTFNazlMdlBIcWVBMDQwWm9vdHJRK2hrQm1vWlYydU1OZ3A1bjhScTZFamN4c2tJUzdYUzNTcXFOSEkveXE5YzFlTVZlMjR0MWxMQ2VWTE52N09neHVBVDdpNXVMK2NpTE41QldFN0NCSm5zb0R1QU9NMnVjeW1USU9DSGJtZHpLUGZ5WlM2U0N1OXVzakVFZzlzcnRmcmg1WnlNY0xsTzVZZXVzc3huSThvc3p6Umtpc1VTdXJoU0pvWWp6TnVRR2NGUDNRazNhelg3dXNyVGx5WEFILzBSbERJSzFNc015c1FtSHJBV2cwY0Vid2c0aEU2YTNHUVFtemdXRXlHdy81VzdVSzZSV3V5QTZqZjRSQmdNQVRCQnAvRTlOeGxrSHE4QVMzelNzenZhRVM2VE9sWUVVTGZCWjhKaUNDSE9jclZkQnZIMW9SWjQyeDlKUGJJWllaVE1aRTBXNnpSa2tiQVlBb1REMmN4Y1YxbHN0amdodzluZ1l5eEdTQzIveTFKOWhnQUlqeUVTVE5icG5PNG1nOHpqUWVBWFB1bEo4ZzdDcVRJejhJRzh3V2ZDWmdpTE9MZXI3WEtUU3llVGdYLzVJNG4xRkhDNjFMTEJwL0lOSVNKc2hnQVl3bVpxM1dSd0RrU2I2WU9XNXlqaVRKbkozOU10UUJzNHlrdEJCbjhKb3lFQXFyU2FFMXpsS09ZVzRDa1BOVHpHWHB3dE5md2ozUUwwUnFZalZIcW95ZUF6WVRWRUlYSHUwS3RURHcwUm16Z0ZYSU0zYXhPL0FpNlE2WHlhYmdIYXdHem4xQWhEaEFpcklRQ09ZUUJWYmpMSUhGNUYwb2lQMnBHN2dVdkVabHM2bVZVUmJhQUZjZGZ0TTRTRE1Cc0NvRmFudXp5RGRBczI4RDlwMVNZMGljMDRzZWxNSjd1dXBvQjUzQTdFMHFyZkVEaGhOMFFmNEE2OUpQV2pTYVNaclU1RWJPb0lpbElwTnRWdUJTYlIxUlR3Wis0Q3hxZGJoaUY0d200SVVFN2k2MHgyazBYbThSREN6MVA4ZUJjd1FXWnprM3R4Q2RTbW1EK3pCbUZNdW1VWXdrSDREUUVnTkdnMVI3cktFNmNjMkxTSFQzMU9Zcnh3WjdyUzFLYUVRdHFBSDZWYmhpRThSTU1RVUlKeW01c2piR1FlSDhKdXUwRC93bUtFek9iK2RFWHBBdm81Wm5BVm1HZ0lMMUV4Qk1CM3FlYW5ybkkwY0J2d1pBL3ZKSTZJc1h0OEx5WFVaZ0RiV0FlY25XNFpodkFSSlVPQXNrQm44TlZVUHk2SlRUd1RTSFNOa2lTT2lMRjVLVzBaTmdkU3dIOERKNmRiaGlHY1JNc1FzRGRkM09vbWc4eGxBN0RRK2V2cnhQbU8yTHlWcmdDMU9aZ0NIaUdDcDJzYjlrelVEQUZ3Z1Zaemhhc2NoY3hGdVpzQ1RwZUdGTzZkNkFXZHkyRllQQUVtUGlsWENmVXBhcnVoVld0WTV3eWM5NGl6Nmp3dWt3clZaakJ4MWtIcVhUWkQ5SWhpQ3dHd1A4cmliRldtY3hpR3hXTVlNK1E4VVRVRUtLVjZBeGY1WG8zTjhjUjVIRGpVNzdvTXdSTmRReVJZcGpiNytWVzR6dVpFaEllQkEveXF3eEF1b202SWc5bVdmc2pGN3REWm5JbnlDUGhuT0VQNGlMb2hRTGhLcXpuUHl5SzFudk9KOHlCWnZnSFRFRHpSTndTQXNGeXJ2SGw0MWVZSEtQY0RmYjBvenhBdGNzTVE4RFVLdVRIVFFyU095NEJma2dnN04rUWh1V0lJZ0d0MUJtZWttMWx0cmthNGwraXV6Umc4SUpjTVlhSGNwbFBjZDNXMGprbkFyZVRXOTJGSWcxeDdBQVpUNHU0QVlxMWpPc0pTTkFRM1doc0NKOWNNQWNwVXJlWEVsRDQ2aTNvd0oyUGtNRytnL05KTkJuZUc2T0p4SlBSbm14WVE1dzYxZTcvaVMwRjBGcTBvZGRrVVpzZ2FtNEJxQ2psT1JyczdmdFRWQUZLVzhUZmcrenFGRWNScEFaY25ZbVNQNGJSekExQy84eHRxWTlISkNwU2ZCS0RMNEM5eDRENkttQ3FsNlIwd2wxYVhTWnBaeDFhT1F5a242UHZlZWtPbzBWcUdkMzlKTDZHQVR1NUVqQmx5RHVGUkxJNlRLeGlicmhrZ2d6R0VyS0JERnROS0owY0FpMG1jWGhFbWlvbHpqOXFKVmxCdGlobkthb1FyZ3habThKUzNFRXJsQ3M2Unkza2wwOEl5SGxUTE1qNlNWbUlJdzRHSE1pM1BZNDZqZzNLZFRCODZXUVArUjhjYXNzWm1vSjVPaHNzVjNsMWc0OWtpbExTd0hqaFBZMXlDTUI4NDNLdXlNMEtZelQ1Y0JKd1N0QlNESnlod0w1MVV5VGcrOExwd3o2ZGRwWlUxREdBSVFqbndpZGZscDBGZmpCbHloV2RSVHBPeGpQWERET0RUT29UWXRFc3pyUlF4REZnQjV0cGFRMGE4aDNJbFl6aEpydVJwUHl2eWRXRk81ck5SbXBrSW5BVDh3Yys2RERuSlZxQ0p2Z3lWcTFncGd2cGRZVllDMmFTWjV4UytRd1VYQXd1QXc3SlJyeUhTckVXWkxGZngxMnhXbXJYUURRR1ZSYXpoTTc2SlVFL0MvUWJEenJ5QWNvWmN4U2dabDEwelFBQ3hUTEtDTGJJUW13SUdBNnZBLzJiUUVBaytBc3JweDdkbEhFOEVKU0t3NEQ2Wno3dHlFMk9CVXhCejNXMGUwd0VzcHAwalpCeXRVaHJzQW0vZzBhNnlrR2ZveDJuT0NuSktCNDhaY29aMXdMRXlucGhNREVjSVVPQ0dnTVNGaWJLQWxTaEhPT09Mei9lWXlSQmxObUJ4b1l6blhCblBHMEdMNlU0b0RKRkVGckpaNW1OVHdGR0lkOHZ4aHREd01jcGsvczVSTW83ZkJDMm1KMEs1ZjFnYWVRc28xV3JPZHNMTWgrOHBqeUg4eUlUTUQ0THdtMUMxRURzampUeEtDY2NqVElUMFEzb05obFFKdFNFQXhLWlRHbG1CTUFTbENXZ1BXcE1oZHdtOUlaSklJNXRrUHRYRU9SckMyZjgwUkovSUdDS0p6R2VETkhJaGNDNkVhNGJDRUgwaVo0Z2swc2c2UHVKWUo4dzhGSFBZaHVnVFdVT0FzNDExSHEzQUVjNEZLbUhieG1xSUdKRTJSQks1a1kva1JtTEVPUkY0UEdnOWh1aVNFNFpJSW8yOEtQTTRFL2dCOEhiUWVnelJJNmNNa1VRYWFHTUwzMEtwQmo0TldvOGhPdVNrSVFDa21hMHlqeVlLR1lxYWJheUcxTWhaUXlRUm00M1N3RVNVa3hDZUNscFB4UGd2NHRzdnZjOExjdDRRU2FTQjU1ak42UWlsd0R0QjZ3azVid0xueXlUK1V5Ym4xMWdzYnd3QnpqYlcyYXloZ0dFa3puM2RGclNta1BFeFNqbi9aTGhNNHJkQml3bUN2REpFRXJIWklyT3hzUmdFckNJTHB6bUVuRTVnQlVVTWtjbTBpazFuMElLQ0lpOE5rVVJzM3BYWmpLV0xzNENYZ3RZVENNb2p4RGxPSmpOUkp2TFBvT1VFVFY0Yklvbk00ZmNJSitUWk50YS9JSlJLR1NNa3htdEJpd2tMeGhBT1loTVhtNVhBa1pEVDIxZy9RNmtIaHN0a3N5dHhaNHdoZGtKc1BoTWJtd0tHUTA0OU1IRmdGY3FSRXNPV3NwdzFmRWFFY2d0cEdKQmEvZ0tVYWozbkFNMUVleHZyTXlneEtlZVpvSVdFSGROQzdBR1p4U01veDBNa3Q3RytDMXhKakZPTUdWTERHQ0lGeEtaVDZsaEJuS0VrYmtzSys3VGtGcUNlT0lPbFBEdUhCT2NLeGhBdUVKdVBwWTRZQlF4SGVUQm9QVDJnd0JxNitLWk13WllLYzM2dVc4d1lJZzJraGplQkMzUU9JMGkwR01NQ2xnVEM4MEJNcHBockJ6TEJ0QkFaSUxXczQ4c2NFL0J0ck84alRPVGZmTnVZSVhPTUlUSkVKdElodGJSaWNRU1MxVzJzN2NCaWloZ3FVMWdodGdsdjl3SmpDSStRR2o2U0dtTEF0OEgzNDl6WFlqRk1waEtUc2xEYzQ1Y3ptREdFeDhnTVhnRE8wTG1Nd3FMVjQrTGZSRGhicHZLWXgrVWFEUDZqTmlYYXlCbEI2ekNrenY4RFFkN1FyTWJMUjFBQUFBQUFTVVZPUks1Q1lJST0iPgogIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCiAgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgfQo8L3N0eWxlPgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcmlwcGxlIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CgogICAgICAgIC8qIFNlZSBQb2x5bWVyRWxlbWVudHMvcGFwZXItYmVoYXZpb3JzL2lzc3Vlcy8zNC4gT24gbm9uLUNocm9tZSBicm93c2VycywKICAgICAgICAgKiBjcmVhdGluZyBhIG5vZGUgKHdpdGggYSBwb3NpdGlvbjphYnNvbHV0ZSkgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudAogICAgICAgICAqIGhhbmRsZXIgImludGVycnVwdHMiIHRoYXQgZXZlbnQgaGFuZGxlciAod2hpY2ggaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAqIHJpcHBsZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCkgKi8KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGluZ10pIHsKICAgICAgICAvKiBUaGlzIHJlc29sdmVzIGEgcmVuZGVyaW5nIGlzc3VlIGluIENocm9tZSAoYXMgb2YgNDApIHdoZXJlIHRoZQogICAgICAgICAgIHJpcHBsZSBpcyBub3QgcHJvcGVybHkgY2xpcHBlZCBieSBpdHMgcGFyZW50ICh3aGljaCBtYXkgaGF2ZQogICAgICAgICAgIHJvdW5kZWQgY29ybmVycykuIFNlZTogaHR0cDovL2pzYmluLmNvbS90ZW1leGEvNAoKICAgICAgICAgICBOb3RlOiBXZSBvbmx5IGFwcGx5IHRoaXMgc3R5bGUgY29uZGl0aW9uYWxseS4gT3RoZXJ3aXNlLCB0aGUgYnJvd3NlcgogICAgICAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW5nIGxheWVyIGZvciBldmVyeSByaXBwbGUgZWxlbWVudCBvbiB0aGUKICAgICAgICAgICBwYWdlLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWQuICovCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgI3dhdmVzLAogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgLndhdmUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgICN3YXZlcywKICAgICAgLndhdmUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgI2JhY2tncm91bmQsCiAgICAgIDpob3N0KC5jaXJjbGUpICN3YXZlcyB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAud2F2ZS1jb250YWluZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iYmFja2dyb3VuZCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ3YXZlcyI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC8qCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoZXNlIGdlbmVyaWMgdmFyaWFibGVzIGluIHlvdXIgZWxlbWVudHMgZm9yIGVhc3kgdGhlbWluZy4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIGFsbCB5b3VyIGVsZW1lbnRzIHVzZSBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5odG1sIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2hlY2tib3giPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlZCBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNjaGVja2JveENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwoKICAgICAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgICAgICB0b3A6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2luazpkaXIocnRsKSB7CiAgICAgICAgcmlnaHQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAjaW5rW2NoZWNrZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgIH0KCiAgICAgIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICAgICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNjaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja21hcmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMzYlOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2ttYXJrLWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIHByb3RlY3QgYWdhaW5zdCBwYWdlLWxldmVsIGJveC1zaXppbmcgKi8KICAgICAgfQoKICAgICAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgIH0KCiAgICAgIC8qIGxhYmVsICovCiAgICAgICNjaGVja2JveExhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZC1jb2xvciwgdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbDpkaXIocnRsKSB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNjaGVja2JveCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWVycm9yLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94Q29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICAgICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWExMXktYW5ub3VuY2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWNoYXItY291bnRlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QsIC5wYXBlci1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1taW4taGVpZ2h0LCA0OHB4KTsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgfQoKICAgICAgLnBhcGVyLWl0ZW0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBib3JkZXI6bm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCguaXJvbi1zZWxlY3RlZCksIC5wYXBlci1pdGVtLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLXNlbGVjdGVkLXdlaWdodCwgYm9sZCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pLCAucGFwZXItaXRlbVtkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pdGVtLWRpc2FibGVkLWNvbG9yLCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyksIC5wYXBlci1pdGVtOmZvY3VzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpOmJlZm9yZSwgLnBhcGVyLWl0ZW06Zm9jdXM6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwoKICAgICAgICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGFyay1kaXZpZGVyLW9wYWNpdHkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iYWNrZW5kIj4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zdG9yYWdlIj4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogIDpyb290IHsKICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7CiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7CiAgICAtLXRiLW9yYW5nZS1kYXJrOiAjZGM3MzIwOwogICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjsKICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzOwogICAgLS10Yi11aS1kYXJrLWFjY2VudDogIzc1NzU3NTsKICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwOwogICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMzsKICB9Cjwvc3R5bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImRhc2hib2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nOiAxNXB4OwogICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7CiAgICAgIH0KCiAgICAgIFtzbG90PSdzaWRlYmFyJ10gewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgKiAyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pbnB1dCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gewogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbjpsYXN0LW9mLXR5cGUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRhc2hib2FyZC1sYXlvdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNpZGViYXIiPgogICAgICA8c2xvdCBuYW1lPSJzaWRlYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjZW50ZXIiPgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXIiIGNsYXNzPSJzY29sbGJhciI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcHRpb24tc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcGFuZVJlbmRlcmVkXV0iIGlkPSJpZlJlbmRlcmVkIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhZGluZyIgb24tdGFwPSJfdG9nZ2xlUGFuZSIgb3Blbi1idXR0b24kPSJbW29wZW5lZF1dIj4KICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4+VGFncyBtYXRjaGluZyBtdWx0aXBsZSBleHBlcmltZW50czwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDs8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZ2h0Ij5UYWdzIG1hdGNoaW5nIC88L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnldXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gKGFsbCB0YWdzKTwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiA8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVdXSI+CiAgICAgICAgICAgIDxzcGFuPltbX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJleHBhbmQtbW9yZSIgY2xhc3M9ImV4cGFuZC1hcnJvdyI+PC9pcm9uLWljb24+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2J1dHRvbj4KICAgICAgCiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tvcGVuZWRdXSIgbm8tYW5pbWF0aW9uPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgPHNwYW4gaWQ9InRvcC1vZi1jb250YWluZXIiPjwvc3Bhbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiaWctcGFnZS1idXR0b25zIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweDsiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzTmV4dFBhZ2VdXSI+TmV4dCBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJjb250cm9scy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCA1cHgiPgogICAgICAgICAgICAgICAgUGFnZQogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdlLWlucHV0IiB0eXBlPSJudW1iZXIiIG5vLWxhYmVsLWZsb2F0IG1pbj0iMSIgbWF4PSJbW19wYWdlQ291bnRdXSIgdmFsdWU9IltbX3BhZ2VJbnB1dFZhbHVlXV0iIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIDVweCAxcHggMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZpcnN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6bGFzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gewogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIC5leHBhbmQtYXJyb3cgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlWigxODBkZWcpOwogICAgICB9CgogICAgICAubmFtZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAuY2F0ZWdvcnktbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHBhZGRpbmc6IDJweCAwOwogICAgICB9CgogICAgICAuY291bnQgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbGV4LWJhc2lzOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgICNwYWdlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IHZhcigtLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgsIDEwMCUpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMjRweCA0MHB4OwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1kaWFsb2ctYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtYm9keTE7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZzsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgqOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLyogSW4gMS54LCB0aGlzIHNlbGVjdG9yIHdhcyBgOmhvc3QgPiA6OmNvbnRlbnQgaDJgLiBJbiAyLnggPHNsb3Q+IGFsbG93cwogICAgICB0byBzZWxlY3QgZGlyZWN0IGNoaWxkcmVuIG9ubHksIHdoaWNoIGluY3JlYXNlcyB0aGUgd2VpZ2h0IG9mIHRoaXMKICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDIpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXRpdGxlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSwKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLmJ1dHRvbnMpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDsKICAgICAgICBtYXJnaW46IDA7CgogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY29sb3Itc2NhbGUiPgogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpY29ucyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iM2Qtcm90YXRpb24iPjxwYXRoIGQ9Ik03LjUyIDIxLjQ4QzQuMjUgMTkuOTQgMS45MSAxNi43NiAxLjU1IDEzSC4wNUMuNTYgMTkuMTYgNS43MSAyNCAxMiAyNGwuNjYtLjAzLTMuODEtMy44MS0xLjMzIDEuMzJ6bS44OS02LjUyYy0uMTkgMC0uMzctLjAzLS41Mi0uMDgtLjE2LS4wNi0uMjktLjEzLS40LS4yNC0uMTEtLjEtLjItLjIyLS4yNi0uMzctLjA2LS4xNC0uMDktLjMtLjA5LS40N2gtMS4zYzAgLjM2LjA3LjY4LjIxLjk1LjE0LjI3LjMzLjUuNTYuNjkuMjQuMTguNTEuMzIuODIuNDEuMy4xLjYyLjE1Ljk2LjE1LjM3IDAgLjcyLS4wNSAxLjAzLS4xNS4zMi0uMS42LS4yNS44My0uNDRzLjQyLS40My41NS0uNzJjLjEzLS4yOS4yLS42MS4yLS45NyAwLS4xOS0uMDItLjM4LS4wNy0uNTYtLjA1LS4xOC0uMTItLjM1LS4yMy0uNTEtLjEtLjE2LS4yNC0uMy0uNC0uNDMtLjE3LS4xMy0uMzctLjIzLS42MS0uMzEuMi0uMDkuMzctLjIuNTItLjMzLjE1LS4xMy4yNy0uMjcuMzctLjQyLjEtLjE1LjE3LS4zLjIyLS40Ni4wNS0uMTYuMDctLjMyLjA3LS40OCAwLS4zNi0uMDYtLjY4LS4xOC0uOTYtLjEyLS4yOC0uMjktLjUxLS41MS0uNjktLjItLjE5LS40Ny0uMzMtLjc3LS40M0M5LjEgOC4wNSA4Ljc2IDggOC4zOSA4Yy0uMzYgMC0uNjkuMDUtMSAuMTYtLjMuMTEtLjU3LjI2LS43OS40NS0uMjEuMTktLjM4LjQxLS41MS42Ny0uMTIuMjYtLjE4LjU0LS4xOC44NWgxLjNjMC0uMTcuMDMtLjMyLjA5LS40NXMuMTQtLjI1LjI1LS4zNGMuMTEtLjA5LjIzLS4xNy4zOC0uMjIuMTUtLjA1LjMtLjA4LjQ4LS4wOC40IDAgLjcuMS44OS4zMS4xOS4yLjI5LjQ5LjI5Ljg2IDAgLjE4LS4wMy4zNC0uMDguNDktLjA1LjE1LS4xNC4yNy0uMjUuMzctLjExLjEtLjI1LjE4LS40MS4yNC0uMTYuMDYtLjM2LjA5LS41OC4wOUg3LjV2MS4wM2guNzdjLjIyIDAgLjQyLjAyLjYuMDdzLjMzLjEzLjQ1LjIzYy4xMi4xMS4yMi4yNC4yOS40LjA3LjE2LjEuMzUuMS41NyAwIC40MS0uMTIuNzItLjM1LjkzLS4yMy4yMy0uNTUuMzMtLjk1LjMzem04LjU1LTUuOTJjLS4zMi0uMzMtLjctLjU5LTEuMTQtLjc3LS40My0uMTgtLjkyLS4yNy0xLjQ2LS4yN0gxMnY4aDIuM2MuNTUgMCAxLjA2LS4wOSAxLjUxLS4yNy40NS0uMTguODQtLjQzIDEuMTYtLjc2LjMyLS4zMy41Ny0uNzMuNzQtMS4xOS4xNy0uNDcuMjYtLjk5LjI2LTEuNTd2LS40YzAtLjU4LS4wOS0xLjEtLjI2LTEuNTctLjE4LS40Ny0uNDMtLjg3LS43NS0xLjJ6bS0uMzkgMy4xNmMwIC40Mi0uMDUuNzktLjE0IDEuMTMtLjEuMzMtLjI0LjYyLS40My44NS0uMTkuMjMtLjQzLjQxLS43MS41My0uMjkuMTItLjYyLjE4LS45OS4xOGgtLjkxVjkuMTJoLjk3Yy43MiAwIDEuMjcuMjMgMS42NC42OS4zOC40Ni41NyAxLjEyLjU3IDEuOTl2LjR6TTEyIDBsLS42Ni4wMyAzLjgxIDMuODEgMS4zMy0xLjMzYzMuMjcgMS41NSA1LjYxIDQuNzIgNS45NiA4LjQ4aDEuNUMyMy40NCA0Ljg0IDE4LjI5IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0iYWNjZXNzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDJjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem05IDdoLTZ2MTNoLTJ2LTZoLTJ2Nkg5VjlIM1Y3aDE4djJ6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2libGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iNCIgcj0iMiIgLz48cGF0aCBkPSJNMTkgMTN2LTJjLTEuNTQuMDItMy4wOS0uNzUtNC4wNy0xLjgzbC0xLjI5LTEuNDNjLS4xNy0uMTktLjM4LS4zNC0uNjEtLjQ1LS4wMSAwLS4wMS0uMDEtLjAyLS4wMUgxM2MtLjM1LS4yLS43NS0uMy0xLjE5LS4yNkMxMC43NiA3LjExIDEwIDguMDQgMTAgOS4wOVYxNWMwIDEuMS45IDIgMiAyaDV2NWgydi01LjVjMC0xLjEtLjktMi0yLTJoLTN2LTMuNDVjMS4yOSAxLjA3IDMuMjUgMS45NCA1IDEuOTV6bS02LjE3IDVjLS40MSAxLjE2LTEuNTIgMi0yLjgzIDItMS42NiAwLTMtMS4zNC0zLTMgMC0xLjMxLjg0LTIuNDEgMi0yLjgzVjEyLjFjLTIuMjguNDYtNCAyLjQ4LTQgNC45IDAgMi43NiAyLjI0IDUgNSA1IDIuNDIgMCA0LjQ0LTEuNzIgNC45LTRoLTIuMDd6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZSI+PHBhdGggZD0iTTQgMTB2N2gzdi03SDR6bTYgMHY3aDN2LTdoLTN6TTIgMjJoMTl2LTNIMnYzem0xNC0xMnY3aDN2LTdoLTN6bS00LjUtOUwyIDZ2MmgxOVY2bC05LjUtNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlLXdhbGxldCI+PHBhdGggZD0iTTIxIDE4djFjMCAxLjEtLjkgMi0yIDJINWMtMS4xMSAwLTItLjktMi0yVjVjMC0xLjEuODktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ2MWgtOWMtMS4xMSAwLTIgLjktMiAydjhjMCAxLjEuODkgMiAyIDJoOXptLTktMmgxMFY4SDEydjh6bTQtMi41Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1ib3giPjxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjExIDAtMiAuOS0yIDJ6bTEyIDRjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzem0tOSA4YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxSDZ2LTF6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiIgLz48L2c+CjxnIGlkPSJhZGQiPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1hbGVydCI+PHBhdGggZD0iTTEwLjAxIDIxLjAxYzAgMS4xLjg5IDEuOTkgMS45OSAxLjk5czEuOTktLjg5IDEuOTktMS45OWgtMy45OHptOC44Ny00LjE5VjExYzAtMy4yNS0yLjI1LTUuOTctNS4yOS02LjY5di0uNzJDMTMuNTkgMi43MSAxMi44OCAyIDEyIDJzLTEuNTkuNzEtMS41OSAxLjU5di43MkM3LjM3IDUuMDMgNS4xMiA3Ljc1IDUuMTIgMTF2NS44MkwzIDE4Ljk0VjIwaDE4di0xLjA2bC0yLjEyLTIuMTJ6TTE2IDEzLjAxaC0zdjNoLTJ2LTNIOFYxMWgzVjhoMnYzaDN2Mi4wMXoiIC8+PC9nPgo8ZyBpZD0iYWRkLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJhZGQtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFkZC1zaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNMTEgOWgyVjZoM1Y0aC0zVjFoLTJ2M0g4djJoM3Yzem0tNCA5Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yem0xMCAwYy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnptLTkuODMtMy4yNWwuMDMtLjEyLjktMS42M2g3LjQ1Yy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjg2LTcuMDFMMTkuNDIgNGgtLjAxbC0xLjEgMi0yLjc2IDVIOC41M2wtLjEzLS4yN0w2LjE2IDZsLS45NS0yLS45NC0ySDF2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTMgMC0uMjUtLjExLS4yNS0uMjV6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIuNSA4SDExdjZsNC43NSAyLjg1Ljc1LTEuMjMtNC0yLjM3Vjh6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiIgLz48L2c+CjxnIGlkPSJhbGFybS1hZGQiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptMS0xMWgtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zVjl6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtLW9mZiI+PHBhdGggZD0iTTEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAuODQtLjE2IDEuNjUtLjQzIDIuNGwxLjUyIDEuNTJjLjU4LTEuMTkuOTEtMi41MS45MS0zLjkyIDAtNC45Ny00LjAzLTktOS05LTEuNDEgMC0yLjczLjMzLTMuOTIuOTFMOS42IDYuNDNDMTAuMzUgNi4xNiAxMS4xNiA2IDEyIDZ6bTEwLS4yOGwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTIuOTIgMi4yOUwxLjY1IDMuNTcgMi45OCA0LjlsLTEuMTEuOTMgMS40MiAxLjQyIDEuMTEtLjk0LjguOEMzLjgzIDguNjkgMyAxMC43NSAzIDEzYzAgNC45NyA0LjAyIDkgOSA5IDIuMjUgMCA0LjMxLS44MyA1Ljg5LTIuMmwyLjIgMi4yIDEuMjctMS4yN0wzLjg5IDMuMjdsLS45Ny0uOTh6bTEzLjU1IDE2LjFDMTUuMjYgMTkuMzkgMTMuNyAyMCAxMiAyMGMtMy44NyAwLTctMy4xMy03LTcgMC0xLjcuNjEtMy4yNiAxLjYxLTQuNDdsOS44NiA5Ljg2ek04LjAyIDMuMjhMNi42IDEuODZsLS44Ni43MSAxLjQyIDEuNDIuODYtLjcxeiIgLz48L2c+CjxnIGlkPSJhbGFybS1vbiI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0tMS40Ni01LjQ3TDguNDEgMTIuNGwtMS4wNiAxLjA2IDMuMTggMy4xOCA2LTYtMS4wNi0xLjA2LTQuOTMgNC45NXoiIC8+PC9nPgo8ZyBpZD0iYWxsLW91dCI+PHBhdGggZD0iTTE2LjIxIDQuMTZsNCA0di00em00IDEybC00IDRoNHptLTEyIDRsLTQtNHY0em0tNC0xMmw0LTRoLTR6bTEyLjk1LS45NWMtMi43My0yLjczLTcuMTctMi43My05LjkgMHMtMi43MyA3LjE3IDAgOS45IDcuMTcgMi43MyA5LjkgMCAyLjczLTcuMTYgMC05Ljl6bS0xLjEgOC44Yy0yLjEzIDIuMTMtNS41NyAyLjEzLTcuNyAwcy0yLjEzLTUuNTcgMC03LjcgNS41Ny0yLjEzIDcuNyAwIDIuMTMgNS41NyAwIDcuN3oiIC8+PC9nPgo8ZyBpZD0iYW5kcm9pZCI+PHBhdGggZD0iTTYgMThjMCAuNTUuNDUgMSAxIDFoMXYzLjVjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41VjE5aDJ2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgxYy41NSAwIDEtLjQ1IDEtMVY4SDZ2MTB6TTMuNSA4QzIuNjcgOCAyIDguNjcgMiA5LjV2N2MwIC44My42NyAxLjUgMS41IDEuNVM1IDE3LjMzIDUgMTYuNXYtN0M1IDguNjcgNC4zMyA4IDMuNSA4em0xNyAwYy0uODMgMC0xLjUuNjctMS41IDEuNXY3YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNXYtN2MwLS44My0uNjctMS41LTEuNS0xLjV6bS00Ljk3LTUuODRsMS4zLTEuM2MuMi0uMi4yLS41MSAwLS43MS0uMi0uMi0uNTEtLjItLjcxIDBsLTEuNDggMS40OEMxMy44NSAxLjIzIDEyLjk1IDEgMTIgMWMtLjk2IDAtMS44Ni4yMy0yLjY2LjYzTDcuODUuMTVjLS4yLS4yLS41MS0uMi0uNzEgMC0uMi4yLS4yLjUxIDAgLjcxbDEuMzEgMS4zMUM2Ljk3IDMuMjYgNiA1LjAxIDYgN2gxMmMwLTEuOTktLjk3LTMuNzUtMi40Ny00Ljg0ek0xMCA1SDlWNGgxdjF6bTUgMGgtMVY0aDF2MXoiIC8+PC9nPgo8ZyBpZD0iYW5ub3VuY2VtZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDloLTJWNWgydjZ6bTAgNGgtMnYtMmgydjJ6IiAvPjwvZz4KPGcgaWQ9ImFwcHMiPjxwYXRoIGQ9Ik00IDhoNFY0SDR2NHptNiAxMmg0di00aC00djR6bS02IDBoNHYtNEg0djR6bTAtNmg0di00SDR2NHptNiAwaDR2LTRoLTR2NHptNi0xMHY0aDRWNGgtNHptLTYgNGg0VjRoLTR2NHptNiA2aDR2LTRoLTR2NHptMCA2aDR2LTRoLTR2NHoiIC8+PC9nPgo8ZyBpZD0iYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU0IDUuMjNsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNi41NUwzLjQ2IDUuMjNDMy4xNyA1LjU3IDMgNi4wMiAzIDYuNVYxOWMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OC0uMTctLjkzLS40Ni0xLjI3ek0xMiAxNy41TDYuNSAxMkgxMHYtMmg0djJoMy41TDEyIDE3LjV6TTUuMTIgNWwuODEtMWgxMmwuOTQgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJhcnJvdy1iYWNrIj48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZG93bndhcmQiPjxwYXRoIGQ9Ik0yMCAxMmwtMS40MS0xLjQxTDEzIDE2LjE3VjRoLTJ2MTIuMTdsLTUuNTgtNS41OUw0IDEybDggOCA4LTh6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMTJsLTQtNGg4bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtdXAiPjxwYXRoIGQ9Ik03IDE0bDUtNSA1IDV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWZvcndhcmQiPjxwYXRoIGQ9Ik0xMiA0bC0xLjQxIDEuNDFMMTYuMTcgMTFINHYyaDEyLjE3bC01LjU4IDUuNTlMMTIgMjBsOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy11cHdhcmQiPjxwYXRoIGQ9Ik00IDEybDEuNDEgMS40MUwxMSA3LjgzVjIwaDJWNy44M2w1LjU4IDUuNTlMMjAgMTJsLTgtOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFzcGVjdC1yYXRpbyI+PHBhdGggZD0iTTE5IDEyaC0ydjNoLTN2Mmg1di01ek03IDloM1Y3SDV2NWgyVjl6bTE0LTZIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0iYXNzZXNzbWVudCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50Ij48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIgMTRIN3YtMmg3djJ6bTMtNEg3di0yaDEwdjJ6bTAtNEg3VjdoMTB2MnoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1pbmQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCA0YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xLjRjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xVjE5eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWxhdGUiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS02IDE1aC0ydi0yaDJ2MnptMC00aC0yVjhoMnY2em0tMS05Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTQgMTJoLTR2M2wtNS01IDUtNXYzaDR2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1yZXR1cm5lZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDE1bC01LTVoM1Y5aDR2NGgzbC01IDV6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtdHVybmVkLWluIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS0yIDE0bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9ImF0dGFjaG1lbnQiPjxwYXRoIGQ9Ik0yIDEyLjVDMiA5LjQ2IDQuNDYgNyA3LjUgN0gxOGMyLjIxIDAgNCAxLjc5IDQgNHMtMS43OSA0LTQgNEg5LjVDOC4xMiAxNSA3IDEzLjg4IDcgMTIuNVM4LjEyIDEwIDkuNSAxMEgxN3YySDkuNDFjLS41NSAwLS41NSAxIDAgMUgxOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTJINy41QzUuNTcgOSA0IDEwLjU3IDQgMTIuNVM1LjU3IDE2IDcuNSAxNkgxN3YySDcuNUM0LjQ2IDE4IDIgMTUuNTQgMiAxMi41eiIgLz48L2c+CjxnIGlkPSJhdXRvcmVuZXciPjxwYXRoIGQ9Ik0xMiA2djNsNC00LTQtNHYzYy00LjQyIDAtOCAzLjU4LTggOCAwIDEuNTcuNDYgMy4wMyAxLjI0IDQuMjZMNi43IDE0LjhjLS40NS0uODMtLjctMS43OS0uNy0yLjggMC0zLjMxIDIuNjktNiA2LTZ6bTYuNzYgMS43NEwxNy4zIDkuMmMuNDQuODQuNyAxLjc5LjcgMi44IDAgMy4zMS0yLjY5IDYtNiA2di0zbC00IDQgNCA0di0zYzQuNDIgMCA4LTMuNTggOC04IDAtMS41Ny0uNDYtMy4wMy0xLjI0LTQuMjZ6IiAvPjwvZz4KPGcgaWQ9ImJhY2tzcGFjZSI+PHBhdGggZD0iTTIyIDNIN2MtLjY5IDAtMS4yMy4zNS0xLjU5Ljg4TDAgMTJsNS40MSA4LjExYy4zNi41My45Ljg5IDEuNTkuODloMTVjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTMgMTIuNTlMMTcuNTkgMTcgMTQgMTMuNDEgMTAuNDEgMTcgOSAxNS41OSAxMi41OSAxMiA5IDguNDEgMTAuNDEgNyAxNCAxMC41OSAxNy41OSA3IDE5IDguNDEgMTUuNDEgMTIgMTkgMTUuNTl6IiAvPjwvZz4KPGcgaWQ9ImJhY2t1cCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImJsb2NrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNCAxMmMwLTQuNDIgMy41OC04IDgtOCAxLjg1IDAgMy41NS42MyA0LjkgMS42OUw1LjY5IDE2LjlDNC42MyAxNS41NSA0IDEzLjg1IDQgMTJ6bTggOGMtMS44NSAwLTMuNTUtLjYzLTQuOS0xLjY5TDE4LjMxIDcuMUMxOS4zNyA4LjQ1IDIwIDEwLjE1IDIwIDEyYzAgNC40Mi0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJib29rIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJib29rbWFyayI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmstYm9yZGVyIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJidWctcmVwb3J0Ij48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIgLz48L2c+CjxnIGlkPSJidWlsZCI+PHBhdGggZD0iTTIyLjcgMTlsLTkuMS05LjFjLjktMi4zLjQtNS0xLjUtNi45LTItMi01LTIuNC03LjQtMS4zTDkgNiA2IDkgMS42IDQuN0MuNCA3LjEuOSAxMC4xIDIuOSAxMi4xYzEuOSAxLjkgNC42IDIuNCA2LjkgMS41bDkuMSA5LjFjLjQuNCAxIC40IDEuNCAwbDIuMy0yLjNjLjUtLjQuNS0xLjEuMS0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNhY2hlZCI+PHBhdGggZD0iTTE5IDhsLTQgNGgzYzAgMy4zMS0yLjY5IDYtNiA2LTEuMDEgMC0xLjk3LS4yNS0yLjgtLjdsLTEuNDYgMS40NkM4Ljk3IDE5LjU0IDEwLjQzIDIwIDEyIDIwYzQuNDIgMCA4LTMuNTggOC04aDNsLTQtNHpNNiAxMmMwLTMuMzEgMi42OS02IDYtNiAxLjAxIDAgMS45Ny4yNSAyLjguN2wxLjQ2LTEuNDZDMTUuMDMgNC40NiAxMy41NyA0IDEyIDRjLTQuNDIgMC04IDMuNTgtOCA4SDFsNCA0IDQtNEg2eiIgLz48L2c+CjxnIGlkPSJjYW1lcmEtZW5oYW5jZSI+PHBhdGggZD0iTTkgM0w3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDNIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6bTAtMWwxLjI1LTIuNzVMMTYgMTNsLTIuNzUtMS4yNUwxMiA5bC0xLjI1IDIuNzVMOCAxM2wyLjc1IDEuMjV6IiAvPjwvZz4KPGcgaWQ9ImNhbmNlbCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJjYXJkLWdpZnRjYXJkIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtbWVtYmVyc2hpcCI+PHBhdGggZD0iTTIwIDJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoNHY1bDQtMiA0IDJ2LTVoNGMxLjExIDAgMi0uODkgMi0yVjRjMC0xLjExLS44OS0yLTItMnptMCAxM0g0di0yaDE2djJ6bTAtNUg0VjRoMTZ2NnoiIC8+PC9nPgo8ZyBpZD0iY2FyZC10cmF2ZWwiPjxwYXRoIGQ9Ik0yMCA2aC0zVjRjMC0xLjExLS44OS0yLTItMkg5Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6TTkgNGg2djJIOVY0em0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoM3YyaDJWOGg2djJoMlY4aDN2NnoiIC8+PC9nPgo8ZyBpZD0iY2hhbmdlLWhpc3RvcnkiPjxwYXRoIGQ9Ik0xMiA3Ljc3TDE4LjM5IDE4SDUuNjFMMTIgNy43N00xMiA0TDIgMjBoMjBMMTIgNHoiIC8+PC9nPgo8ZyBpZD0iY2hlY2siPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGVjay1ib3gtb3V0bGluZS1ibGFuayI+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0yIDE1bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tcmlnaHQiPjxwYXRoIGQ9Ik0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiIC8+PC9nPgo8ZyBpZD0iY2hyb21lLXJlYWRlci1tb2RlIj48cGF0aCBkPSJNMTMgMTJoN3YxLjVoLTd6bTAtMi41aDdWMTFoLTd6bTAgNWg3VjE2aC03ek0yMSA0SDNjLTEuMSAwLTIgLjktMiAydjEzYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNWgtOVY2aDl2MTN6IiAvPjwvZz4KPGcgaWQ9ImNsYXNzIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJjbGVhciI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiIC8+PC9nPgo8ZyBpZD0iY2xvc2UiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem00LjUgMTRIOGMtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtM2wuMTQuMDFDOC41OCA4LjI4IDEwLjEzIDcgMTIgN2MyLjIxIDAgNCAxLjc5IDQgNGguNWMxLjM4IDAgMi41IDEuMTIgMi41IDIuNVMxNy44OCAxNiAxNi41IDE2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb25lIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xMCAxN2wtMy41LTMuNSAxLjQxLTEuNDFMMTAgMTQuMTcgMTUuMTggOWwxLjQxIDEuNDFMMTAgMTd6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLWRvd25sb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNyAxM2wtNSA1LTUtNWgzVjloNHY0aDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLW9mZiI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0Yy0xLjQ4IDAtMi44NS40My00LjAxIDEuMTdsMS40NiAxLjQ2QzEwLjIxIDYuMjMgMTEuMDggNiAxMiA2YzMuMDQgMCA1LjUgMi40NiA1LjUgNS41di41SDE5YzEuNjYgMCAzIDEuMzQgMyAzIDAgMS4xMy0uNjQgMi4xMS0xLjU2IDIuNjJsMS40NSAxLjQ1QzIzLjE2IDE4LjE2IDI0IDE2LjY4IDI0IDE1YzAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0zIDUuMjdsMi43NSAyLjc0QzIuNTYgOC4xNSAwIDEwLjc3IDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTEuNzNsMiAyTDIxIDIwLjczIDQuMjcgNCAzIDUuMjd6TTcuNzMgMTBsOCA4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoMS43M3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtcXVldWUiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE5IDE4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoLjcxQzcuMzcgNy42OSA5LjQ4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtdXBsb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiIC8+PC9nPgo8ZyBpZD0iY29kZSI+PHBhdGggZD0iTTkuNCAxNi42TDQuOCAxMmw0LjYtNC42TDggNmwtNiA2IDYgNiAxLjQtMS40em01LjIgMGw0LjYtNC42LTQuNi00LjZMMTYgNmw2IDYtNiA2LTEuNC0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNvbXBhcmUtYXJyb3dzIj48cGF0aCBkPSJNOS4wMSAxNEgydjJoNy4wMXYzTDEzIDE1bC0zLjk5LTR2M3ptNS45OC0xdi0zSDIyVjhoLTcuMDFWNUwxMSA5bDMuOTkgNHoiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1jb3B5Ij48cGF0aCBkPSJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY3V0Ij48cGF0aCBkPSJNOS42NCA3LjY0Yy4yMy0uNS4zNi0xLjA1LjM2LTEuNjQgMC0yLjIxLTEuNzktNC00LTRTMiAzLjc5IDIgNnMxLjc5IDQgNCA0Yy41OSAwIDEuMTQtLjEzIDEuNjQtLjM2TDEwIDEybC0yLjM2IDIuMzZDNy4xNCAxNC4xMyA2LjU5IDE0IDYgMTRjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNGMwLS41OS0uMTMtMS4xNC0uMzYtMS42NEwxMiAxNGw3IDdoM3YtMUw5LjY0IDcuNjR6TTYgOGMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptMCAxMmMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptNi03LjVjLS4yOCAwLS41LS4yMi0uNS0uNXMuMjItLjUuNS0uNS41LjIyLjUuNS0uMjIuNS0uNS41ek0xOSAzbC02IDYgMiAyIDctN1YzeiIgLz48L2c+CjxnIGlkPSJjb250ZW50LXBhc3RlIj48cGF0aCBkPSJNMTkgMmgtNC4xOEMxNC40Ljg0IDEzLjMgMCAxMiAwYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem03IDE4SDVWNGgydjNoMTBWNGgydjE2eiIgLz48L2c+CjxnIGlkPSJjb3B5cmlnaHQiPjxwYXRoIGQ9Ik0xMC4wOCAxMC44NmMuMDUtLjMzLjE2LS42Mi4zLS44N3MuMzQtLjQ2LjU5LS42MmMuMjQtLjE1LjU0LS4yMi45MS0uMjMuMjMuMDEuNDQuMDUuNjMuMTMuMi4wOS4zOC4yMS41Mi4zNnMuMjUuMzMuMzQuNTMuMTMuNDIuMTQuNjRoMS43OWMtLjAyLS40Ny0uMTEtLjktLjI4LTEuMjlzLS40LS43My0uNy0xLjAxLS42Ni0uNS0xLjA4LS42Ni0uODgtLjIzLTEuMzktLjIzYy0uNjUgMC0xLjIyLjExLTEuNy4zNHMtLjg4LjUzLTEuMi45Mi0uNTYuODQtLjcxIDEuMzZTOCAxMS4yOSA4IDExLjg3di4yN2MwIC41OC4wOCAxLjEyLjIzIDEuNjRzLjM5Ljk3LjcxIDEuMzUuNzIuNjkgMS4yLjkxIDEuMDUuMzQgMS43LjM0Yy40NyAwIC45MS0uMDggMS4zMi0uMjNzLjc3LS4zNiAxLjA4LS42My41Ni0uNTguNzQtLjk0LjI5LS43NC4zLTEuMTVoLTEuNzljLS4wMS4yMS0uMDYuNC0uMTUuNThzLS4yMS4zMy0uMzYuNDYtLjMyLjIzLS41Mi4zYy0uMTkuMDctLjM5LjA5LS42LjEtLjM2LS4wMS0uNjYtLjA4LS44OS0uMjMtLjI1LS4xNi0uNDUtLjM3LS41OS0uNjJzLS4yNS0uNTUtLjMtLjg4LS4wOC0uNjctLjA4LTF2LS4yN2MwLS4zNS4wMy0uNjguMDgtMS4wMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZSI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0iY3JlYXRlLW5ldy1mb2xkZXIiPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tMSA4aC0zdjNoLTJ2LTNoLTN2LTJoM1Y5aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9ImNyZWRpdC1jYXJkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJkYXNoYm9hcmQiPjxwYXRoIGQ9Ik0zIDEzaDhWM0gzdjEwem0wIDhoOHYtNkgzdjZ6bTEwIDBoOFYxMWgtOHYxMHptMC0xOHY2aDhWM2gtOHoiIC8+PC9nPgo8ZyBpZD0iZGF0ZS1yYW5nZSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTItN2gtMVYyaC0ydjJIOFYySDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDIwYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY5aDE0djExeiIgLz48L2c+CjxnIGlkPSJkZWxldGUiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6TTE5IDRoLTMuNWwtMS0xaC01bC0xIDFINXYyaDE0VjR6IiAvPjwvZz4KPGcgaWQ9ImRlbGV0ZS1mb3JldmVyIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtc3dlZXAiPjxwYXRoIGQ9Ik0xNSAxNmg0djJoLTR6bTAtOGg3djJoLTd6bTAgNGg2djJoLTZ6TTMgMThjMCAxLjEuOSAyIDIgMmg2YzEuMSAwIDItLjkgMi0yVjhIM3YxMHpNMTQgNWgtM2wtMS0xSDZMNSA1SDJ2MmgxMnoiIC8+PC9nPgo8ZyBpZD0iZGVzY3JpcHRpb24iPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiIgLz48L2c+CjxnIGlkPSJkbnMiPjxwYXRoIGQ9Ik0yMCAxM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xek03IDE5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMjAgM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6TTcgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUtYWxsIj48cGF0aCBkPSJNMTggN2wtMS40MS0xLjQxLTYuMzQgNi4zNCAxLjQxIDEuNDFMMTggN3ptNC4yNC0xLjQxTDExLjY2IDE2LjE3IDcuNDggMTJsLTEuNDEgMS40MUwxMS42NiAxOWwxMi0xMi0xLjQyLTEuNDF6TS40MSAxMy40MUw2IDE5bDEuNDEtMS40MUwxLjgzIDEyIC40MSAxMy40MXoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtbGFyZ2UiPjxwYXRoIGQ9Ik0xMSA1LjA4VjJjLTUgLjUtOSA0LjgxLTkgMTBzNCA5LjUgOSAxMHYtMy4wOGMtMy0uNDgtNi0zLjQtNi02LjkyczMtNi40NCA2LTYuOTJ6TTE4Ljk3IDExSDIyYy0uNDctNS00LTguNTMtOS05djMuMDhDMTYgNS41MSAxOC41NCA4IDE4Ljk3IDExek0xMyAxOC45MlYyMmM1LS40NyA4LjUzLTQgOS05aC0zLjAzYy0uNDMgMy0yLjk3IDUuNDktNS45NyA1LjkyeiIgLz48L2c+CjxnIGlkPSJkb251dC1zbWFsbCI+PHBhdGggZD0iTTExIDkuMTZWMmMtNSAuNS05IDQuNzktOSAxMHM0IDkuNSA5IDEwdi03LjE2Yy0xLS40MS0yLTEuNTItMi0yLjg0czEtMi40MyAyLTIuODR6TTE0Ljg2IDExSDIyYy0uNDgtNC43NS00LTguNTMtOS05djcuMTZjMSAuMyAxLjUyLjk4IDEuODYgMS44NHpNMTMgMTQuODRWMjJjNS0uNDcgOC41Mi00LjI1IDktOWgtNy4xNGMtLjM0Ljg2LS44NiAxLjU0LTEuODYgMS44NHoiIC8+PC9nPgo8ZyBpZD0iZHJhZnRzIj48cGF0aCBkPSJNMjEuOTkgOGMwLS43Mi0uMzctMS4zNS0uOTQtMS43TDEyIDEgMi45NSA2LjNDMi4zOCA2LjY1IDIgNy4yOCAyIDh2MTBjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMmwtLjAxLTEwek0xMiAxM0wzLjc0IDcuODQgMTIgM2w4LjI2IDQuODRMMTIgMTN6IiAvPjwvZz4KPGcgaWQ9ImVqZWN0Ij48cGF0aCBkPSJNNSAxN2gxNHYySDV6bTctMTJMNS4zMyAxNWgxMy4zNHoiIC8+PC9nPgo8ZyBpZD0iZXJyb3IiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJlcnJvci1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTVoMnYyaC0yem0wLThoMnY2aC0yem0uOTktNUM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJldXJvLXN5bWJvbCI+PHBhdGggZD0iTTE1IDE4LjVjLTIuNTEgMC00LjY4LTEuNDItNS43Ni0zLjVIMTV2LTJIOC41OGMtLjA1LS4zMy0uMDgtLjY2LS4wOC0xcy4wMy0uNjcuMDgtMUgxNVY5SDkuMjRDMTAuMzIgNi45MiAxMi41IDUuNSAxNSA1LjVjMS42MSAwIDMuMDkuNTkgNC4yMyAxLjU3TDIxIDUuM0MxOS40MSAzLjg3IDE3LjMgMyAxNSAzYy0zLjkyIDAtNy4yNCAyLjUxLTguNDggNkgzdjJoMy4wNmMtLjA0LjMzLS4wNi42Ni0uMDYgMSAwIC4zNC4wMi42Ny4wNiAxSDN2MmgzLjUyYzEuMjQgMy40OSA0LjU2IDYgOC40OCA2IDIuMzEgMCA0LjQxLS44NyA2LTIuM2wtMS43OC0xLjc3Yy0xLjEzLjk4LTIuNiAxLjU3LTQuMjIgMS41N3oiIC8+PC9nPgo8ZyBpZD0iZXZlbnQiPjxwYXRoIGQ9Ik0xNyAxMmgtNXY1aDV2LTV6TTE2IDF2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMmgtMVYxaC0yem0zIDE4SDVWOGgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZXZlbnQtc2VhdCI+PHBhdGggZD0iTTQgMTh2M2gzdi0zaDEwdjNoM3YtNkg0em0xNS04aDN2M2gtM3pNMiAxMGgzdjNIMnptMTUgM0g3VjVjMC0xLjEuOS0yIDItMmg2YzEuMSAwIDIgLjkgMiAydjh6IiAvPjwvZz4KPGcgaWQ9ImV4aXQtdG8tYXBwIj48cGF0aCBkPSJNMTAuMDkgMTUuNTlMMTEuNSAxN2w1LTUtNS01LTEuNDEgMS40MUwxMi42NyAxMUgzdjJoOS42N2wtMi41OCAyLjU5ek0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnY0aDJWNWgxNHYxNEg1di00SDN2NGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbGVzcyI+PHBhdGggZD0iTTEyIDhsLTYgNiAxLjQxIDEuNDFMMTIgMTAuODNsNC41OSA0LjU4TDE4IDE0eiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbW9yZSI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiIC8+PC9nPgo8ZyBpZD0iZXhwbG9yZSI+PHBhdGggZD0iTTEyIDEwLjljLS42MSAwLTEuMS40OS0xLjEgMS4xcy40OSAxLjEgMS4xIDEuMWMuNjEgMCAxLjEtLjQ5IDEuMS0xLjFzLS40OS0xLjEtMS4xLTEuMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMi4xOSAxMi4xOUw2IDE4bDMuODEtOC4xOUwxOCA2bC0zLjgxIDguMTl6IiAvPjwvZz4KPGcgaWQ9ImV4dGVuc2lvbiI+PHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIgLz48L2c+CjxnIGlkPSJmYWNlIj48cGF0aCBkPSJNOSAxMS43NWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6bTYgMGMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04IDAtLjI5LjAyLS41OC4wNS0uODYgMi4zNi0xLjA1IDQuMjMtMi45OCA1LjIxLTUuMzdDMTEuMDcgOC4zMyAxNC4wNSAxMCAxNy40MiAxMGMuNzggMCAxLjUzLS4wOSAyLjI1LS4yNi4yMS43MS4zMyAxLjQ3LjMzIDIuMjYgMCA0LjQxLTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlIj48cGF0aCBkPSJNMTIgMjEuMzVsLTEuNDUtMS4zMkM1LjQgMTUuMzYgMiAxMi4yOCAyIDguNSAyIDUuNDIgNC40MiAzIDcuNSAzYzEuNzQgMCAzLjQxLjgxIDQuNSAyLjA5QzEzLjA5IDMuODEgMTQuNzYgMyAxNi41IDMgMTkuNTggMyAyMiA1LjQyIDIyIDguNWMwIDMuNzgtMy40IDYuODYtOC41NSAxMS41NEwxMiAyMS4zNXoiIC8+PC9nPgo8ZyBpZD0iZmF2b3JpdGUtYm9yZGVyIj48cGF0aCBkPSJNMTYuNSAzYy0xLjc0IDAtMy40MS44MS00LjUgMi4wOUMxMC45MSAzLjgxIDkuMjQgMyA3LjUgMyA0LjQyIDMgMiA1LjQyIDIgOC41YzAgMy43OCAzLjQgNi44NiA4LjU1IDExLjU0TDEyIDIxLjM1bDEuNDUtMS4zMkMxOC42IDE1LjM2IDIyIDEyLjI4IDIyIDguNSAyMiA1LjQyIDE5LjU4IDMgMTYuNSAzem0tNC40IDE1LjU1bC0uMS4xLS4xLS4xQzcuMTQgMTQuMjQgNCAxMS4zOSA0IDguNSA0IDYuNSA1LjUgNSA3LjUgNWMxLjU0IDAgMy4wNC45OSAzLjU3IDIuMzZoMS44N0MxMy40NiA1Ljk5IDE0Ljk2IDUgMTYuNSA1YzIgMCAzLjUgMS41IDMuNSAzLjUgMCAyLjg5LTMuMTQgNS43NC03LjkgMTAuMDV6IiAvPjwvZz4KPGcgaWQ9ImZlZWRiYWNrIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDEyaC0ydi0yaDJ2MnptMC00aC0yVjZoMnY0eiIgLz48L2c+CjxnIGlkPSJmaWxlLWRvd25sb2FkIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmaWxlLXVwbG9hZCI+PHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIgLz48L2c+CjxnIGlkPSJmaWx0ZXItbGlzdCI+PHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIgLz48L2c+CjxnIGlkPSJmaW5kLWluLXBhZ2UiPjxwYXRoIGQ9Ik0yMCAxOS41OVY4bC02LTZINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4Yy40NSAwIC44NS0uMTUgMS4xOS0uNGwtNC40My00LjQzYy0uOC41Mi0xLjc0LjgzLTIuNzYuODMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1YzAgMS4wMi0uMzEgMS45Ni0uODMgMi43NUwyMCAxOS41OXpNOSAxM2MwIDEuNjYgMS4zNCAzIDMgM3MzLTEuMzQgMy0zLTEuMzQtMy0zLTMtMyAxLjM0LTMgM3oiIC8+PC9nPgo8ZyBpZD0iZmluZC1yZXBsYWNlIj48cGF0aCBkPSJNMTEgNmMxLjM4IDAgMi42My41NiAzLjU0IDEuNDZMMTIgMTBoNlY0bC0yLjA1IDIuMDVDMTQuNjggNC43OCAxMi45MyA0IDExIDRjLTMuNTMgMC02LjQzIDIuNjEtNi45MiA2SDYuMWMuNDYtMi4yOCAyLjQ4LTQgNC45LTR6bTUuNjQgOS4xNGMuNjYtLjkgMS4xMi0xLjk3IDEuMjgtMy4xNEgxNS45Yy0uNDYgMi4yOC0yLjQ4IDQtNC45IDQtMS4zOCAwLTIuNjMtLjU2LTMuNTQtMS40NkwxMCAxMkg0djZsMi4wNS0yLjA1QzcuMzIgMTcuMjIgOS4wNyAxOCAxMSAxOGMxLjU1IDAgMi45OC0uNTEgNC4xNC0xLjM2TDIwIDIxLjQ5IDIxLjQ5IDIwbC00Ljg1LTQuODZ6IiAvPjwvZz4KPGcgaWQ9ImZpbmdlcnByaW50Ij48cGF0aCBkPSJNMTcuODEgNC40N2MtLjA4IDAtLjE2LS4wMi0uMjMtLjA2QzE1LjY2IDMuNDIgMTQgMyAxMi4wMSAzYy0xLjk4IDAtMy44Ni40Ny01LjU3IDEuNDEtLjI0LjEzLS41NC4wNC0uNjgtLjItLjEzLS4yNC0uMDQtLjU1LjItLjY4QzcuODIgMi41MiA5Ljg2IDIgMTIuMDEgMmMyLjEzIDAgMy45OS40NyA2LjAzIDEuNTIuMjUuMTMuMzQuNDMuMjEuNjctLjA5LjE4LS4yNi4yOC0uNDQuMjh6TTMuNSA5LjcyYy0uMSAwLS4yLS4wMy0uMjktLjA5LS4yMy0uMTYtLjI4LS40Ny0uMTItLjcuOTktMS40IDIuMjUtMi41IDMuNzUtMy4yN0M5Ljk4IDQuMDQgMTQgNC4wMyAxNy4xNSA1LjY1YzEuNS43NyAyLjc2IDEuODYgMy43NSAzLjI1LjE2LjIyLjExLjU0LS4xMi43LS4yMy4xNi0uNTQuMTEtLjctLjEyLS45LTEuMjYtMi4wNC0yLjI1LTMuMzktMi45NC0yLjg3LTEuNDctNi41NC0xLjQ3LTkuNC4wMS0xLjM2LjctMi41IDEuNy0zLjQgMi45Ni0uMDguMTQtLjIzLjIxLS4zOS4yMXptNi4yNSAxMi4wN2MtLjEzIDAtLjI2LS4wNS0uMzUtLjE1LS44Ny0uODctMS4zNC0xLjQzLTIuMDEtMi42NC0uNjktMS4yMy0xLjA1LTIuNzMtMS4wNS00LjM0IDAtMi45NyAyLjU0LTUuMzkgNS42Ni01LjM5czUuNjYgMi40MiA1LjY2IDUuMzljMCAuMjgtLjIyLjUtLjUuNXMtLjUtLjIyLS41LS41YzAtMi40Mi0yLjA5LTQuMzktNC42Ni00LjM5LTIuNTcgMC00LjY2IDEuOTctNC42NiA0LjM5IDAgMS40NC4zMiAyLjc3LjkzIDMuODUuNjQgMS4xNSAxLjA4IDEuNjQgMS44NSAyLjQyLjE5LjIuMTkuNTEgMCAuNzEtLjExLjEtLjI0LjE1LS4zNy4xNXptNy4xNy0xLjg1Yy0xLjE5IDAtMi4yNC0uMy0zLjEtLjg5LTEuNDktMS4wMS0yLjM4LTIuNjUtMi4zOC00LjM5IDAtLjI4LjIyLS41LjUtLjVzLjUuMjIuNS41YzAgMS40MS43MiAyLjc0IDEuOTQgMy41Ni43MS40OCAxLjU0LjcxIDIuNTQuNzEuMjQgMCAuNjQtLjAzIDEuMDQtLjEuMjctLjA1LjUzLjEzLjU4LjQxLjA1LjI3LS4xMy41My0uNDEuNTgtLjU3LjExLTEuMDcuMTItMS4yMS4xMnpNMTQuOTEgMjJjLS4wNCAwLS4wOS0uMDEtLjEzLS4wMi0xLjU5LS40NC0yLjYzLTEuMDMtMy43Mi0yLjEtMS40LTEuMzktMi4xNy0zLjI0LTIuMTctNS4yMiAwLTEuNjIgMS4zOC0yLjk0IDMuMDgtMi45NCAxLjcgMCAzLjA4IDEuMzIgMy4wOCAyLjk0IDAgMS4wNy45MyAxLjk0IDIuMDggMS45NHMyLjA4LS44NyAyLjA4LTEuOTRjMC0zLjc3LTMuMjUtNi44My03LjI1LTYuODMtMi44NCAwLTUuNDQgMS41OC02LjYxIDQuMDMtLjM5LjgxLS41OSAxLjc2LS41OSAyLjggMCAuNzguMDcgMi4wMS42NyAzLjYxLjEuMjYtLjAzLjU1LS4yOS42NC0uMjYuMS0uNTUtLjA0LS42NC0uMjktLjQ5LTEuMzEtLjczLTIuNjEtLjczLTMuOTYgMC0xLjIuMjMtMi4yOS42OC0zLjI0IDEuMzMtMi43OSA0LjI4LTQuNiA3LjUxLTQuNiA0LjU1IDAgOC4yNSAzLjUxIDguMjUgNy44MyAwIDEuNjItMS4zOCAyLjk0LTMuMDggMi45NHMtMy4wOC0xLjMyLTMuMDgtMi45NGMwLTEuMDctLjkzLTEuOTQtMi4wOC0xLjk0cy0yLjA4Ljg3LTIuMDggMS45NGMwIDEuNzEuNjYgMy4zMSAxLjg3IDQuNTEuOTUuOTQgMS44NiAxLjQ2IDMuMjcgMS44NS4yNy4wNy40Mi4zNS4zNS42MS0uMDUuMjMtLjI2LjM4LS40Ny4zOHoiIC8+PC9nPgo8ZyBpZD0iZmlyc3QtcGFnZSI+PHBhdGggZD0iTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiIgLz48L2c+CjxnIGlkPSJmbGFnIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LWxhbmQiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTcuMTgtNS43M2w0LjM1IDEuMTYgNS4zMSAxLjQyYy44LjIxIDEuNjItLjI2IDEuODQtMS4wNi4yMS0uOC0uMjYtMS42Mi0xLjA2LTEuODRsLTUuMzEtMS40Mi0yLjc2LTkuMDJMMTAuMTIgMnY4LjI4TDUuMTUgOC45NWwtLjkzLTIuMzItMS40NS0uMzl2NS4xN2wxLjYuNDMgNS4zMSAxLjQzeiIgLz48L2c+CjxnIGlkPSJmbGlnaHQtdGFrZW9mZiI+PHBhdGggZD0iTTIuNSAxOWgxOXYyaC0xOXptMTkuNTctOS4zNmMtLjIxLS44LTEuMDQtMS4yOC0xLjg0LTEuMDZMMTQuOTIgMTBsLTYuOS02LjQzLTEuOTMuNTEgNC4xNCA3LjE3LTQuOTcgMS4zMy0xLjk3LTEuNTQtMS40NS4zOSAxLjgyIDMuMTYuNzcgMS4zMyAxLjYtLjQzIDUuMzEtMS40MiA0LjM1LTEuMTZMMjEgMTEuNDljLjgxLS4yMyAxLjI4LTEuMDUgMS4wNy0xLjg1eiIgLz48L2c+CjxnIGlkPSJmbGlwLXRvLWJhY2siPjxwYXRoIGQ9Ik05IDdIN3YyaDJWN3ptMCA0SDd2Mmgydi0yem0wLThjLTEuMTEgMC0yIC45LTIgMmgyVjN6bTQgMTJoLTJ2Mmgydi0yem02LTEydjJoMmMwLTEuMS0uOS0yLTItMnptLTYgMGgtMnYyaDJWM3pNOSAxN3YtMkg3YzAgMS4xLjg5IDIgMiAyem0xMC00aDJ2LTJoLTJ2MnptMC00aDJWN2gtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnpNNSA3SDN2MTJjMCAxLjEuODkgMiAyIDJoMTJ2LTJINVY3em0xMC0yaDJWM2gtMnYyem0wIDEyaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1mcm9udCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMiA0di0ySDNjMCAxLjEuODkgMiAyIDJ6TTMgOWgyVjdIM3Yyem0xMiAxMmgydi0yaC0ydjJ6bTQtMThIOWMtMS4xMSAwLTIgLjktMiAydjEwYzAgMS4xLjg5IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJIOVY1aDEwdjEwem0tOCA2aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyIj48cGF0aCBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlci1vcGVuIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTJINFY4aDE2djEweiIgLz48L2c+CjxnIGlkPSJmb2xkZXItc2hhcmVkIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS01IDNjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem00IDhoLTh2LTFjMC0xLjMzIDIuNjctMiA0LTJzNCAuNjcgNCAydjF6IiAvPjwvZz4KPGcgaWQ9ImZvbnQtZG93bmxvYWQiPjxwYXRoIGQ9Ik05LjkzIDEzLjVoNC4xNEwxMiA3Ljk4ek0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTQuMDUgMTYuNWwtMS4xNC0zSDkuMTdsLTEuMTIgM0g1Ljk2bDUuMTEtMTNoMS44Nmw1LjExIDEzaC0yLjA5eiIgLz48L2c+CjxnIGlkPSJmb3J3YXJkIj48cGF0aCBkPSJNMTIgOFY0bDggOC04IDh2LTRINFY4eiIgLz48L2c+CjxnIGlkPSJmdWxsc2NyZWVuIj48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbi1leGl0Ij48cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIgLz48L2c+CjxnIGlkPSJnLXRyYW5zbGF0ZSI+PHBhdGggZD0iTTIwIDVoLTkuMTJMMTAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDdsMSAzaDhjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnpNNy4xNyAxNC41OWMtMi4yNSAwLTQuMDktMS44My00LjA5LTQuMDlzMS44My00LjA5IDQuMDktNC4wOWMxLjA0IDAgMS45OS4zNyAyLjc0IDEuMDdsLjA3LjA2LTEuMjMgMS4xOC0uMDYtLjA1Yy0uMjktLjI3LS43OC0uNTktMS41Mi0uNTktMS4zMSAwLTIuMzggMS4wOS0yLjM4IDIuNDJzMS4wNyAyLjQyIDIuMzggMi40MmMxLjM3IDAgMS45Ni0uODcgMi4xMi0xLjQ2SDcuMDhWOS45MWgzLjk1bC4wMS4wN2MuMDQuMjEuMDUuNC4wNS42MSAwIDIuMzUtMS42MSA0LTMuOTIgNHptNi4wMy0xLjcxYy4zMy42Ljc0IDEuMTggMS4xOSAxLjdsLS41NC41My0uNjUtMi4yM3ptLjc3LS43NmgtLjk5bC0uMzEtMS4wNGgzLjk5cy0uMzQgMS4zMS0xLjU2IDIuNzRjLS41Mi0uNjItLjg5LTEuMjMtMS4xMy0xLjd6TTIxIDIwYzAgLjU1LS40NSAxLTEgMWgtN2wyLTItLjgxLTIuNzcuOTItLjkyTDE3Ljc5IDE4bC43My0uNzMtMi43MS0yLjY4Yy45LTEuMDMgMS42LTIuMjUgMS45Mi0zLjUxSDE5di0xLjA0aC0zLjY0VjloLTEuMDR2MS4wNGgtMS45NkwxMS4xOCA2SDIwYy41NSAwIDEgLjQ1IDEgMXYxM3oiIC8+PC9nPgo8ZyBpZD0iZ2F2ZWwiPjxwYXRoIGQ9Ik0xIDIxaDEydjJIMXpNNS4yNDUgOC4wN2wyLjgzLTIuODI3IDE0LjE0IDE0LjE0Mi0yLjgyOCAyLjgyOHpNMTIuMzE3IDFsNS42NTcgNS42NTYtMi44MyAyLjgzLTUuNjU0LTUuNjZ6TTMuODI1IDkuNDg1bDUuNjU3IDUuNjU3LTIuODI4IDIuODI4LTUuNjU3LTUuNjU3eiIgLz48L2c+CjxnIGlkPSJnZXN0dXJlIj48cGF0aCBkPSJNNC41OSA2Ljg5Yy43LS43MSAxLjQtMS4zNSAxLjcxLTEuMjIuNS4yIDAgMS4wMy0uMyAxLjUyLS4yNS40Mi0yLjg2IDMuODktMi44NiA2LjMxIDAgMS4yOC40OCAyLjM0IDEuMzQgMi45OC43NS41NiAxLjc0LjczIDIuNjQuNDYgMS4wNy0uMzEgMS45NS0xLjQgMy4wNi0yLjc3IDEuMjEtMS40OSAyLjgzLTMuNDQgNC4wOC0zLjQ0IDEuNjMgMCAxLjY1IDEuMDEgMS43NiAxLjc5LTMuNzguNjQtNS4zOCAzLjY3LTUuMzggNS4zNyAwIDEuNyAxLjQ0IDMuMDkgMy4yMSAzLjA5IDEuNjMgMCA0LjI5LTEuMzMgNC42OS02LjFIMjF2LTIuNWgtMi40N2MtLjE1LTEuNjUtMS4wOS00LjItNC4wMy00LjItMi4yNSAwLTQuMTggMS45MS00Ljk0IDIuODQtLjU4LjczLTIuMDYgMi40OC0yLjI5IDIuNzItLjI1LjMtLjY4Ljg0LTEuMTEuODQtLjQ1IDAtLjcyLS44My0uMzYtMS45Mi4zNS0xLjA5IDEuNC0yLjg2IDEuODUtMy41Mi43OC0xLjE0IDEuMy0xLjkyIDEuMy0zLjI4QzguOTUgMy42OSA3LjMxIDMgNi40NCAzIDUuMTIgMyAzLjk3IDQgMy43MiA0LjI1Yy0uMzYuMzYtLjY2LjY2LS44OC45M2wxLjc1IDEuNzF6bTkuMjkgMTEuNjZjLS4zMSAwLS43NC0uMjYtLjc0LS43MiAwLS42LjczLTIuMiAyLjg3LTIuNzYtLjMgMi42OS0xLjQzIDMuNDgtMi4xMyAzLjQ4eiIgLz48L2c+CjxnIGlkPSJnZXQtYXBwIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJnaWYiPjxwYXRoIGQ9Ik0xMS41IDlIMTN2NmgtMS41ek05IDlINmMtLjYgMC0xIC41LTEgMXY0YzAgLjUuNCAxIDEgMWgzYy42IDAgMS0uNSAxLTF2LTJIOC41djEuNWgtMnYtM0gxMFYxMGMwLS41LS40LTEtMS0xem0xMCAxLjVWOWgtNC41djZIMTZ2LTJoMnYtMS41aC0ydi0xeiIgLz48L2c+CjxnIGlkPSJncmFkZSI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJncm91cC13b3JrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNOCAxNy41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXpNOS41IDhjMC0xLjM4IDEuMTItMi41IDIuNS0yLjVzMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41UzkuNSA5LjM4IDkuNSA4em02LjUgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0iaGVscCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJoZWxwLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQtb2ZmIj48cGF0aCBkPSJNMTQuNTkgOEwxMiAxMC41OSA5LjQxIDggOCA5LjQxIDEwLjU5IDEyIDggMTQuNTkgOS40MSAxNiAxMiAxMy40MSAxNC41OSAxNiAxNiAxNC41OSAxMy40MSAxMiAxNiA5LjQxIDE0LjU5IDh6TTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJoaXN0b3J5Ij48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJob21lIj48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiIgLz48L2c+CjxnIGlkPSJob3VyZ2xhc3MtZW1wdHkiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnptMTAgMTQuNVYyMEg4di0zLjVsNC00IDQgNHptLTQtNWwtNC00VjRoOHYzLjVsLTQgNHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWZ1bGwiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnoiIC8+PC9nPgo8ZyBpZD0iaHR0cCI+PHBhdGggZD0iTTQuNSAxMWgtMlY5SDF2NmgxLjV2LTIuNWgyVjE1SDZWOUg0LjV2MnptMi41LS41aDEuNVYxNUgxMHYtNC41aDEuNVY5SDd2MS41em01LjUgMEgxNFYxNWgxLjV2LTQuNUgxN1Y5aC00LjV2MS41em05LTEuNUgxOHY2aDEuNXYtMmgyYy44IDAgMS41LS43IDEuNS0xLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNXptMCAyLjVoLTJ2LTFoMnYxeiIgLz48L2c+CjxnIGlkPSJodHRwcyI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydGFudC1kZXZpY2VzIj48cGF0aCBkPSJNMjMgMTEuMDFMMTggMTFjLS41NSAwLTEgLjQ1LTEgMXY5YzAgLjU1LjQ1IDEgMSAxaDVjLjU1IDAgMS0uNDUgMS0xdi05YzAtLjU1LS40NS0uOTktMS0uOTl6TTIzIDIwaC01di03aDV2N3pNMjAgMkgyQy44OSAyIDAgMi44OSAwIDR2MTJjMCAxLjEuODkgMiAyIDJoN3YySDd2Mmg4di0yaC0ydi0yaDJ2LTJIMlY0aDE4djVoMlY0YzAtMS4xMS0uOS0yLTItMnptLTguMDMgN0wxMSA2bC0uOTcgM0g3bDIuNDcgMS43Ni0uOTQgMi45MSAyLjQ3LTEuOCAyLjQ3IDEuOC0uOTQtMi45MUwxNSA5aC0zLjAzeiIgLz48L2c+CjxnIGlkPSJpbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguODktMS45OCAyTDMgMTljMCAxLjEuODggMiAxLjk5IDJIMTljMS4xIDAgMi0uOSAyLTJWNWMwLTEuMTEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEweiIgLz48L2c+CjxnIGlkPSJpbmRldGVybWluYXRlLWNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMEg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImluZm8iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiIgLz48L2c+CjxnIGlkPSJpbmZvLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiIgLz48L2c+CjxnIGlkPSJpbnB1dCI+PHBhdGggZD0iTTIxIDMuMDFIM2MtMS4xIDAtMiAuOS0yIDJWOWgyVjQuOTloMTh2MTQuMDNIM1YxNUgxdjQuMDFjMCAxLjEuOSAxLjk4IDIgMS45OGgxOGMxLjEgMCAyLS44OCAyLTEuOTh2LTE0YzAtMS4xMS0uOS0yLTItMnpNMTEgMTZsNC00LTQtNHYzSDF2MmgxMHYzeiIgLz48L2c+CjxnIGlkPSJpbnZlcnQtY29sb3JzIj48cGF0aCBkPSJNMTcuNjYgNy45M0wxMiAyLjI3IDYuMzQgNy45M2MtMy4xMiAzLjEyLTMuMTIgOC4xOSAwIDExLjMxQzcuOSAyMC44IDkuOTUgMjEuNTggMTIgMjEuNThjMi4wNSAwIDQuMS0uNzggNS42Ni0yLjM0IDMuMTItMy4xMiAzLjEyLTguMTkgMC0xMS4zMXpNMTIgMTkuNTljLTEuNiAwLTMuMTEtLjYyLTQuMjQtMS43NkM2LjYyIDE2LjY5IDYgMTUuMTkgNiAxMy41OXMuNjItMy4xMSAxLjc2LTQuMjRMMTIgNS4xdjE0LjQ5eiIgLz48L2c+CjxnIGlkPSJsYWJlbCI+PHBhdGggZD0iTTE3LjYzIDUuODRDMTcuMjcgNS4zMyAxNi42NyA1IDE2IDVMNSA1LjAxQzMuOSA1LjAxIDMgNS45IDMgN3YxMGMwIDEuMS45IDEuOTkgMiAxLjk5TDE2IDE5Yy42NyAwIDEuMjctLjMzIDEuNjMtLjg0TDIyIDEybC00LjM3LTYuMTZ6IiAvPjwvZz4KPGcgaWQ9ImxhYmVsLW91dGxpbmUiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2ek0xNiAxN0g1VjdoMTFsMy41NSA1TDE2IDE3eiIgLz48L2c+CjxnIGlkPSJsYW5ndWFnZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTYuOTMgNmgtMi45NWMtLjMyLTEuMjUtLjc4LTIuNDUtMS4zOC0zLjU2IDEuODQuNjMgMy4zNyAxLjkxIDQuMzMgMy41NnpNMTIgNC4wNGMuODMgMS4yIDEuNDggMi41MyAxLjkxIDMuOTZoLTMuODJjLjQzLTEuNDMgMS4wOC0yLjc2IDEuOTEtMy45NnpNNC4yNiAxNEM0LjEgMTMuMzYgNCAxMi42OSA0IDEycy4xLTEuMzYuMjYtMmgzLjM4Yy0uMDguNjYtLjE0IDEuMzItLjE0IDIgMCAuNjguMDYgMS4zNC4xNCAySDQuMjZ6bS44MiAyaDIuOTVjLjMyIDEuMjUuNzggMi40NSAxLjM4IDMuNTYtMS44NC0uNjMtMy4zNy0xLjktNC4zMy0zLjU2em0yLjk1LThINS4wOGMuOTYtMS42NiAyLjQ5LTIuOTMgNC4zMy0zLjU2QzguODEgNS41NSA4LjM1IDYuNzUgOC4wMyA4ek0xMiAxOS45NmMtLjgzLTEuMi0xLjQ4LTIuNTMtMS45MS0zLjk2aDMuODJjLS40MyAxLjQzLTEuMDggMi43Ni0xLjkxIDMuOTZ6TTE0LjM0IDE0SDkuNjZjLS4wOS0uNjYtLjE2LTEuMzItLjE2LTIgMC0uNjguMDctMS4zNS4xNi0yaDQuNjhjLjA5LjY1LjE2IDEuMzIuMTYgMiAwIC42OC0uMDcgMS4zNC0uMTYgMnptLjI1IDUuNTZjLjYtMS4xMSAxLjA2LTIuMzEgMS4zOC0zLjU2aDIuOTVjLS45NiAxLjY1LTIuNDkgMi45My00LjMzIDMuNTZ6TTE2LjM2IDE0Yy4wOC0uNjYuMTQtMS4zMi4xNC0yIDAtLjY4LS4wNi0xLjM0LS4xNC0yaDMuMzhjLjE2LjY0LjI2IDEuMzEuMjYgMnMtLjEgMS4zNi0uMjYgMmgtMy4zOHoiIC8+PC9nPgo8ZyBpZD0ibGFzdC1wYWdlIj48cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6IiAvPjwvZz4KPGcgaWQ9ImxhdW5jaCI+PHBhdGggZD0iTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIgLz48L2c+CjxnIGlkPSJsaWdodGJ1bGItb3V0bGluZSI+PHBhdGggZD0iTTkgMjFjMCAuNTUuNDUgMSAxIDFoNGMuNTUgMCAxLS40NSAxLTF2LTFIOXYxem0zLTE5QzguMTQgMiA1IDUuMTQgNSA5YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0IDAtMy44Ni0zLjE0LTctNy03em0yLjg1IDExLjFsLS44NS42VjE2aC00di0yLjNsLS44NS0uNkM3LjggMTIuMTYgNyAxMC42MyA3IDljMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWMwIDEuNjMtLjggMy4xNi0yLjE1IDQuMXoiIC8+PC9nPgo8ZyBpZD0ibGluZS1zdHlsZSI+PHBhdGggZD0iTTMgMTZoNXYtMkgzdjJ6bTYuNSAwaDV2LTJoLTV2MnptNi41IDBoNXYtMmgtNXYyek0zIDIwaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTMgMTJoOHYtMkgzdjJ6bTEwIDBoOHYtMmgtOHYyek0zIDR2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtd2VpZ2h0Ij48cGF0aCBkPSJNMyAxN2gxOHYtMkgzdjJ6bTAgM2gxOHYtMUgzdjF6bTAtN2gxOHYtM0gzdjN6bTAtOXY0aDE4VjRIM3oiIC8+PC9nPgo8ZyBpZD0ibGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJsaXN0Ij48cGF0aCBkPSJNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptNCA0aDE0di0ySDd2MnptMCA0aDE0di0ySDd2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJsb2NrIj48cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vcGVuIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2aDEuOWMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bTAgMTJINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vdXRsaW5lIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnpNOC45IDZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFzMy4xIDEuMzkgMy4xIDMuMXYySDguOVY2ek0xOCAyMEg2VjEwaDEydjEweiIgLz48L2c+CjxnIGlkPSJsb3ctcHJpb3JpdHkiPjxwYXRoIGQ9Ik0xNCA1aDh2MmgtOHptMCA1LjVoOHYyaC04em0wIDUuNWg4djJoLTh6TTIgMTEuNUMyIDE1LjA4IDQuOTIgMTggOC41IDE4SDl2MmwzLTMtMy0zdjJoLS41QzYuMDIgMTYgNCAxMy45OCA0IDExLjVTNi4wMiA3IDguNSA3SDEyVjVIOC41QzQuOTIgNSAyIDcuOTIgMiAxMS41eiIgLz48L2c+CjxnIGlkPSJsb3lhbHR5Ij48cGF0aCBkPSJNMjEuNDEgMTEuNThsLTktOUMxMi4wNSAyLjIyIDExLjU1IDIgMTEgMkg0Yy0xLjEgMC0yIC45LTIgMnY3YzAgLjU1LjIyIDEuMDUuNTkgMS40Mmw5IDljLjM2LjM2Ljg2LjU4IDEuNDEuNTguNTUgMCAxLjA1LS4yMiAxLjQxLS41OWw3LTdjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLS41NS0uMjMtMS4wNi0uNTktMS40MnpNNS41IDdDNC42NyA3IDQgNi4zMyA0IDUuNVM0LjY3IDQgNS41IDQgNyA0LjY3IDcgNS41IDYuMzMgNyA1LjUgN3ptMTEuNzcgOC4yN0wxMyAxOS41NGwtNC4yNy00LjI3QzguMjggMTQuODEgOCAxNC4xOSA4IDEzLjVjMC0xLjM4IDEuMTItMi41IDIuNS0yLjUuNjkgMCAxLjMyLjI4IDEuNzcuNzRsLjczLjcyLjczLS43M2MuNDUtLjQ1IDEuMDgtLjczIDEuNzctLjczIDEuMzggMCAyLjUgMS4xMiAyLjUgMi41IDAgLjY5LS4yOCAxLjMyLS43MyAxLjc3eiIgLz48L2c+CjxnIGlkPSJtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiIC8+PC9nPgo8ZyBpZD0ibWFya3VucmVhZC1tYWlsYm94Ij48cGF0aCBkPSJNMjAgNkgxMHY2SDhWNGg2VjBINnY2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibWVudSI+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6IiAvPjwvZz4KPGcgaWQ9Im1vcmUtaG9yaXoiPjxwYXRoIGQ9Ik02IDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMTIgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS02IDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJtb3JlLXZlcnQiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW90b3JjeWNsZSI+PHBhdGggZD0iTTE5LjQ0IDkuMDNMMTUuNDEgNUgxMXYyaDMuNTlsMiAySDVjLTIuOCAwLTUgMi4yLTUgNXMyLjIgNSA1IDVjMi40NiAwIDQuNDUtMS42OSA0LjktNGgxLjY1bDIuNzctMi43N2MtLjIxLjU0LS4zMiAxLjE0LS4zMiAxLjc3IDAgMi44IDIuMiA1IDUgNXM1LTIuMiA1LTVjMC0yLjY1LTEuOTctNC43Ny00LjU2LTQuOTd6TTcuODIgMTVDNy40IDE2LjE1IDYuMjggMTcgNSAxN2MtMS42MyAwLTMtMS4zNy0zLTNzMS4zNy0zIDMtM2MxLjI4IDAgMi40Ljg1IDIuODIgMkg1djJoMi44MnpNMTkgMTdjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZlLXRvLWluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC45LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEwem0tMy01aC0yVjdoLTR2M0g4bDQgNCA0LTR6IiAvPjwvZz4KPGcgaWQ9Im5leHQtd2VlayI+PHBhdGggZD0iTTIwIDdoLTRWNWMwLS41NS0uMjItMS4wNS0uNTktMS40MUMxNS4wNSAzLjIyIDE0LjU1IDMgMTQgM2gtNGMtMS4xIDAtMiAuOS0yIDJ2Mkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjljMC0xLjEtLjktMi0yLTJ6TTEwIDVoNHYyaC00VjV6bTEgMTMuNWwtMS0xIDMtMy0zLTMgMS0xIDQgNC00IDR6IiAvPjwvZz4KPGcgaWQ9Im5vdGUtYWRkIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE0aC0zdjNoLTJ2LTNIOHYtMmgzdi0zaDJ2M2gzdjJ6bS0zLTdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0ib2ZmbGluZS1waW4iPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNSAxNkg3di0yaDEwdjJ6bS02LjctNEw3IDEwLjdsMS40LTEuNCAxLjkgMS45IDUuMy01LjNMMTcgNy4zIDEwLjMgMTR6IiAvPjwvZz4KPGcgaWQ9Im9wYWNpdHkiPjxwYXRoIGQ9Ik0xNy42NiA4TDEyIDIuMzUgNi4zNCA4QzQuNzggOS41NiA0IDExLjY0IDQgMTMuNjRzLjc4IDQuMTEgMi4zNCA1LjY3IDMuNjEgMi4zNSA1LjY2IDIuMzUgNC4xLS43OSA1LjY2LTIuMzVTMjAgMTUuNjQgMjAgMTMuNjQgMTkuMjIgOS41NiAxNy42NiA4ek02IDE0Yy4wMS0yIC42Mi0zLjI3IDEuNzYtNC40TDEyIDUuMjdsNC4yNCA0LjM4QzE3LjM4IDEwLjc3IDE3Ljk5IDEyIDE4IDE0SDZ6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tYnJvd3NlciI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDR2LTJINVY4aDE0djEwaC00djJoNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptLTcgNmwtNCA0aDN2Nmgydi02aDNsLTQtNHoiIC8+PC9nPgo8ZyBpZD0ib3Blbi1pbi1uZXciPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ib3Blbi13aXRoIj48cGF0aCBkPSJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3oiIC8+PC9nPgo8ZyBpZD0icGFnZXZpZXciPjxwYXRoIGQ9Ik0xMS41IDlDMTAuMTIgOSA5IDEwLjEyIDkgMTEuNXMxLjEyIDIuNSAyLjUgMi41IDIuNS0xLjEyIDIuNS0yLjVTMTIuODggOSAxMS41IDl6TTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tMy4yMSAxNC4yMWwtMi45MS0yLjkxYy0uNjkuNDQtMS41MS43LTIuMzkuN0M5LjAxIDE2IDcgMTMuOTkgNyAxMS41UzkuMDEgNyAxMS41IDcgMTYgOS4wMSAxNiAxMS41YzAgLjg4LS4yNiAxLjY5LS43IDIuMzlsMi45MSAyLjktMS40MiAxLjQyeiIgLz48L2c+CjxnIGlkPSJwYW4tdG9vbCI+PHBhdGggZD0iTTIzIDUuNVYyMGMwIDIuMi0xLjggNC00IDRoLTcuM2MtMS4wOCAwLTIuMS0uNDMtMi44NS0xLjE5TDEgMTQuODNzMS4yNi0xLjIzIDEuMy0xLjI1Yy4yMi0uMTkuNDktLjI5Ljc5LS4yOS4yMiAwIC40Mi4wNi42LjE2LjA0LjAxIDQuMzEgMi40NiA0LjMxIDIuNDZWNGMwLS44My42Ny0xLjUgMS41LTEuNVMxMSAzLjE3IDExIDR2N2gxVjEuNWMwLS44My42Ny0xLjUgMS41LTEuNVMxNSAuNjcgMTUgMS41VjExaDFWMi41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41VjExaDFWNS41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41eiIgLz48L2c+CjxnIGlkPSJwYXltZW50Ij48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJwZXJtLWNhbWVyYS1taWMiPjxwYXRoIGQ9Ik0yMCA1aC0zLjE3TDE1IDNIOUw3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3di0yLjA5Yy0yLjgzLS40OC01LTIuOTQtNS01LjkxaDJjMCAyLjIxIDEuNzkgNCA0IDRzNC0xLjc5IDQtNGgyYzAgMi45Ny0yLjE3IDUuNDMtNSA1LjkxVjIxaDdjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTYgOGMwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJWOWMwLTEuMS45LTIgMi0yczIgLjkgMiAydjR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tY29udGFjdC1jYWxlbmRhciI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDNjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTFjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjF6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGF0YS1zZXR0aW5nIj48cGF0aCBkPSJNMTguOTkgMTEuNWMuMzQgMCAuNjcuMDMgMSAuMDdMMjAgMCAwIDIwaDExLjU2Yy0uMDQtLjMzLS4wNy0uNjYtLjA3LTEgMC00LjE0IDMuMzYtNy41IDcuNS03LjV6bTMuNzEgNy45OWMuMDItLjE2LjA0LS4zMi4wNC0uNDkgMC0uMTctLjAxLS4zMy0uMDQtLjQ5bDEuMDYtLjgzYy4wOS0uMDguMTItLjIxLjA2LS4zMmwtMS0xLjczYy0uMDYtLjExLS4xOS0uMTUtLjMxLS4xMWwtMS4yNC41Yy0uMjYtLjItLjU0LS4zNy0uODUtLjQ5bC0uMTktMS4zMmMtLjAxLS4xMi0uMTItLjIxLS4yNC0uMjFoLTJjLS4xMiAwLS4yMy4wOS0uMjUuMjFsLS4xOSAxLjMyYy0uMy4xMy0uNTkuMjktLjg1LjQ5bC0xLjI0LS41Yy0uMTEtLjA0LS4yNCAwLS4zMS4xMWwtMSAxLjczYy0uMDYuMTEtLjA0LjI0LjA2LjMybDEuMDYuODNjLS4wMi4xNi0uMDMuMzItLjAzLjQ5IDAgLjE3LjAxLjMzLjAzLjQ5bC0xLjA2LjgzYy0uMDkuMDgtLjEyLjIxLS4wNi4zMmwxIDEuNzNjLjA2LjExLjE5LjE1LjMxLjExbDEuMjQtLjVjLjI2LjIuNTQuMzcuODUuNDlsLjE5IDEuMzJjLjAyLjEyLjEyLjIxLjI1LjIxaDJjLjEyIDAgLjIzLS4wOS4yNS0uMjFsLjE5LTEuMzJjLjMtLjEzLjU5LS4yOS44NC0uNDlsMS4yNS41Yy4xMS4wNC4yNCAwIC4zMS0uMTFsMS0xLjczYy4wNi0uMTEuMDMtLjI0LS4wNi0uMzJsLTEuMDctLjgzem0tMy43MSAxLjAxYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGVybS1kZXZpY2UtaW5mb3JtYXRpb24iPjxwYXRoIGQ9Ik0xMyA3aC0ydjJoMlY3em0wIDRoLTJ2Nmgydi02em00LTkuOTlMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiIC8+PC9nPgo8ZyBpZD0icGVybS1pZGVudGl0eSI+PHBhdGggZD0iTTEyIDUuOWMxLjE2IDAgMi4xLjk0IDIuMSAyLjFzLS45NCAyLjEtMi4xIDIuMVM5LjkgOS4xNiA5LjkgOHMuOTQtMi4xIDIuMS0yLjFtMCA5YzIuOTcgMCA2LjEgMS40NiA2LjEgMi4xdjEuMUg1LjlWMTdjMC0uNjQgMy4xMy0yLjEgNi4xLTIuMU0xMiA0QzkuNzkgNCA4IDUuNzkgOCA4czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDljLTIuNjcgMC04IDEuMzQtOCA0djNoMTZ2LTNjMC0yLjY2LTUuMzMtNC04LTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tbWVkaWEiPjxwYXRoIGQ9Ik0yIDZIMHY1aC4wMUwwIDIwYzAgMS4xLjkgMiAyIDJoMTh2LTJIMlY2em0yMC0yaC04bC0yLTJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnpNNyAxNWw0LjUtNiAzLjUgNC41MSAyLjUtMy4wMUwyMSAxNUg3eiIgLz48L2c+CjxnIGlkPSJwZXJtLXBob25lLW1zZyI+PHBhdGggZD0iTTIwIDE1LjVjLTEuMjUgMC0yLjQ1LS4yLTMuNTctLjU3LS4zNS0uMTEtLjc0LS4wMy0xLjAyLjI0bC0yLjIgMi4yYy0yLjgzLTEuNDQtNS4xNS0zLjc1LTYuNTktNi41OGwyLjItMi4yMWMuMjgtLjI3LjM2LS42Ni4yNS0xLjAxQzguNyA2LjQ1IDguNSA1LjI1IDguNSA0YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDEgMCA5LjM5IDcuNjEgMTcgMTcgMTcgLjU1IDAgMS0uNDUgMS0xdi0zLjVjMC0uNTUtLjQ1LTEtMS0xek0xMiAzdjEwbDMtM2g2VjNoLTl6IiAvPjwvZz4KPGcgaWQ9InBlcm0tc2Nhbi13aWZpIj48cGF0aCBkPSJNMTIgM0M2Ljk1IDMgMy4xNSA0Ljg1IDAgNy4yM0wxMiAyMiAyNCA3LjI1QzIwLjg1IDQuODcgMTcuMDUgMyAxMiAzem0xIDEzaC0ydi02aDJ2NnptLTItOFY2aDJ2MmgtMnoiIC8+PC9nPgo8ZyBpZD0icGV0cyI+PGNpcmNsZSBjeD0iNC41IiBjeT0iOS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iOSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE1IiBjeT0iNS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik0xNy4zNCAxNC44NmMtLjg3LTEuMDItMS42LTEuODktMi40OC0yLjkxLS40Ni0uNTQtMS4wNS0xLjA4LTEuNzUtMS4zMi0uMTEtLjA0LS4yMi0uMDctLjMzLS4wOS0uMjUtLjA0LS41Mi0uMDQtLjc4LS4wNHMtLjUzIDAtLjc5LjA1Yy0uMTEuMDItLjIyLjA1LS4zMy4wOS0uNy4yNC0xLjI4Ljc4LTEuNzUgMS4zMi0uODcgMS4wMi0xLjYgMS44OS0yLjQ4IDIuOTEtMS4zMSAxLjMxLTIuOTIgMi43Ni0yLjYyIDQuNzkuMjkgMS4wMiAxLjAyIDIuMDMgMi4zMyAyLjMyLjczLjE1IDMuMDYtLjQ0IDUuNTQtLjQ0aC4xOGMyLjQ4IDAgNC44MS41OCA1LjU0LjQ0IDEuMzEtLjI5IDIuMDQtMS4zMSAyLjMzLTIuMzIuMzEtMi4wNC0xLjMtMy40OS0yLjYxLTQuOHoiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlIj48cGF0aCBkPSJNMTkgN2gtOHY2aDhWN3ptMi00SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4VjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk4aDE4djE0LjAzeiIgLz48L2c+CjxnIGlkPSJwaWN0dXJlLWluLXBpY3R1cmUtYWx0Ij48cGF0aCBkPSJNMTkgMTFoLTh2Nmg4di02em00IDhWNC45OEMyMyAzLjg4IDIyLjEgMyAyMSAzSDNjLTEuMSAwLTIgLjg4LTIgMS45OFYxOWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yem0tMiAuMDJIM1Y0Ljk3aDE4djE0LjA1eiIgLz48L2c+CjxnIGlkPSJwbGF5LWZvci13b3JrIj48cGF0aCBkPSJNMTEgNXY1LjU5SDcuNWw0LjUgNC41IDQuNS00LjVIMTNWNWgtMnptLTUgOWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02aC0yYzAgMi4yMS0xLjc5IDQtNCA0cy00LTEuNzktNC00SDZ6IiAvPjwvZz4KPGcgaWQ9InBvbHltZXIiPjxwYXRoIGQ9Ik0xOSA0aC00TDcuMTEgMTYuNjMgNC41IDEyIDkgNEg1TC41IDEyIDUgMjBoNGw3Ljg5LTEyLjYzTDE5LjUgMTIgMTUgMjBoNGw0LjUtOHoiIC8+PC9nPgo8ZyBpZD0icG93ZXItc2V0dGluZ3MtbmV3Ij48cGF0aCBkPSJNMTMgM2gtMnYxMGgyVjN6bTQuODMgMi4xN2wtMS40MiAxLjQyQzE3Ljk5IDcuODYgMTkgOS44MSAxOSAxMmMwIDMuODctMy4xMyA3LTcgN3MtNy0zLjEzLTctN2MwLTIuMTkgMS4wMS00LjE0IDIuNTgtNS40Mkw2LjE3IDUuMTdDNC4yMyA2LjgyIDMgOS4yNiAzIDEyYzAgNC45NyA0LjAzIDkgOSA5czktNC4wMyA5LTljMC0yLjc0LTEuMjMtNS4xOC0zLjE3LTYuODN6IiAvPjwvZz4KPGcgaWQ9InByZWduYW50LXdvbWFuIj48cGF0aCBkPSJNOSA0YzAtMS4xMS44OS0yIDItMnMyIC44OSAyIDItLjg5IDItMiAyLTItLjg5LTItMnptNyA5Yy0uMDEtMS4zNC0uODMtMi41MS0yLTMgMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDN2N2gydjVoM3YtNWgzdi00eiIgLz48L2c+CjxnIGlkPSJwcmludCI+PHBhdGggZD0iTTE5IDhINWMtMS42NiAwLTMgMS4zNC0zIDN2Nmg0djRoMTJ2LTRoNHYtNmMwLTEuNjYtMS4zNC0zLTMtM3ptLTMgMTFIOHYtNWg4djV6bTMtN2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0tMS05SDZ2NGgxMlYzeiIgLz48L2c+CjxnIGlkPSJxdWVyeS1idWlsZGVyIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0uNS0xM0gxMXY2bDUuMjUgMy4xNS43NS0xLjIzLTQuNS0yLjY3eiIgLz48L2c+CjxnIGlkPSJxdWVzdGlvbi1hbnN3ZXIiPjxwYXRoIGQ9Ik0yMSA2aC0ydjlINnYyYzAgLjU1LjQ1IDEgMSAxaDExbDQgNFY3YzAtLjU1LS40NS0xLTEtMXptLTQgNlYzYzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTRsNC00aDEwYy41NSAwIDEtLjQ1IDEtMXoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLWNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZWNlaXB0Ij48cGF0aCBkPSJNMTggMTdINnYtMmgxMnYyem0wLTRINnYtMmgxMnYyem0wLTRINlY3aDEydjJ6TTMgMjJsMS41LTEuNUw2IDIybDEuNS0xLjVMOSAyMmwxLjUtMS41TDEyIDIybDEuNS0xLjVMMTUgMjJsMS41LTEuNUwxOCAyMmwxLjUtMS41TDIxIDIyVjJsLTEuNSAxLjVMMTggMmwtMS41IDEuNUwxNSAybC0xLjUgMS41TDEyIDJsLTEuNSAxLjVMOSAyIDcuNSAzLjUgNiAyIDQuNSAzLjUgMyAydjIweiIgLz48L2c+CjxnIGlkPSJyZWNvcmQtdm9pY2Utb3ZlciI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjQiIC8+PHBhdGggZD0iTTkgMTVjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6bTcuNzYtOS42NGwtMS42OCAxLjY5Yy44NCAxLjE4Ljg0IDIuNzEgMCAzLjg5bDEuNjggMS42OWMyLjAyLTIuMDIgMi4wMi01LjA3IDAtNy4yN3pNMjAuMDcgMmwtMS42MyAxLjYzYzIuNzcgMy4wMiAyLjc3IDcuNTYgMCAxMC43NEwyMC4wNyAxNmMzLjktMy44OSAzLjkxLTkuOTUgMC0xNHoiIC8+PC9nPgo8ZyBpZD0icmVkZWVtIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9InJlZG8iPjxwYXRoIGQ9Ik0xOC40IDEwLjZDMTYuNTUgOC45OSAxNC4xNSA4IDExLjUgOGMtNC42NSAwLTguNTggMy4wMy05Ljk2IDcuMjJMMy45IDE2YzEuMDUtMy4xOSA0LjA1LTUuNSA3LjYtNS41IDEuOTUgMCAzLjczLjcyIDUuMTIgMS44OEwxMyAxNmg5VjdsLTMuNiAzLjZ6IiAvPjwvZz4KPGcgaWQ9InJlZnJlc2giPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlIj48cGF0aCBkPSJNMTkgMTNINXYtMmgxNHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNSAxMUg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTcgMTF2MmgxMHYtMkg3em01LTlDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTIyLjczIDIyLjczTDIuNzcgMi43NyAyIDJsLS43My0uNzNMMCAyLjU0bDQuMzkgNC4zOSAyLjIxIDQuNjYtMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDcuNDZsMS4zOCAxLjM4Yy0uNS4zNi0uODMuOTUtLjgzIDEuNjIgMCAxLjEuODkgMiAxLjk5IDIgLjY3IDAgMS4yNi0uMzMgMS42Mi0uODRMMjEuNDYgMjRsMS4yNy0xLjI3ek03LjQyIDE1Yy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoMi4zNmwyIDJINy40MnptOC4xMy0yYy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg2LjU0bDkuMDEgOXpNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0icmVvcmRlciI+PHBhdGggZD0iTTMgMTVoMTh2LTJIM3Yyem0wIDRoMTh2LTJIM3Yyem0wLThoMThWOUgzdjJ6bTAtNnYyaDE4VjVIM3oiIC8+PC9nPgo8ZyBpZD0icmVwbHkiPjxwYXRoIGQ9Ik0xMCA5VjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcGx5LWFsbCI+PHBhdGggZD0iTTcgOFY1bC03IDcgNyA3di0zbC00LTQgNC00em02IDFWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiIC8+PC9nPgo8ZyBpZD0icmVwb3J0Ij48cGF0aCBkPSJNMTUuNzMgM0g4LjI3TDMgOC4yN3Y3LjQ2TDguMjcgMjFoNy40NkwyMSAxNS43M1Y4LjI3TDE1LjczIDN6TTEyIDE3LjNjLS43MiAwLTEuMy0uNTgtMS4zLTEuMyAwLS43Mi41OC0xLjMgMS4zLTEuMy43MiAwIDEuMy41OCAxLjMgMS4zIDAgLjcyLS41OCAxLjMtMS4zIDEuM3ptMS00LjNoLTJWN2gydjZ6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydC1wcm9ibGVtIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlIj48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlLXBhZ2UiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bS0yIDE2Yy0yLjA1IDAtMy44MS0xLjI0LTQuNTgtM2gxLjcxYy42My45IDEuNjggMS41IDIuODcgMS41IDEuOTMgMCAzLjUtMS41NyAzLjUtMy41UzEzLjkzIDkuNSAxMiA5LjVjLTEuMzUgMC0yLjUyLjc4LTMuMSAxLjlsMS42IDEuNmgtNFY5bDEuMyAxLjNDOC42OSA4LjkyIDEwLjIzIDggMTIgOGMyLjc2IDAgNSAyLjI0IDUgNXMtMi4yNCA1LTUgNXoiIC8+PC9nPgo8ZyBpZD0icm9vbSI+PHBhdGggZD0iTTEyIDJDOC4xMyAyIDUgNS4xMyA1IDljMCA1LjI1IDcgMTMgNyAxM3M3LTcuNzUgNy0xM2MwLTMuODctMy4xMy03LTctN3ptMCA5LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJyb3VuZGVkLWNvcm5lciI+PHBhdGggZD0iTTE5IDE5aDJ2MmgtMnYtMnptMC0yaDJ2LTJoLTJ2MnpNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem04IDE2aDJ2LTJoLTJ2MnptLTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bS04IDBoMnYtMkg3djJ6bS00IDBoMnYtMkgzdjJ6TTIxIDhjMC0yLjc2LTIuMjQtNS01LTVoLTV2Mmg1YzEuNjUgMCAzIDEuMzUgMyAzdjVoMlY4eiIgLz48L2c+CjxnIGlkPSJyb3dpbmciPjxwYXRoIGQ9Ik04LjUgMTQuNUw0IDE5bDEuNSAxLjVMOSAxN2gybC0yLjUtMi41ek0xNSAxYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAyMC4wMUwxOCAyNGwtMi45OS0zLjAxVjE5LjVsLTcuMS03LjA5Yy0uMzEuMDUtLjYxLjA3LS45MS4wN3YtMi4xNmMxLjY2LjAzIDMuNjEtLjg3IDQuNjctMi4wNGwxLjQtMS41NWMuMTktLjIxLjQzLS4zOC42OS0uNS4yOS0uMTQuNjItLjIzLjk2LS4yM2guMDNDMTUuOTkgNi4wMSAxNyA3LjAyIDE3IDguMjZ2NS43NWMwIC44NC0uMzUgMS42MS0uOTIgMi4xNmwtMy41OC0zLjU4di0yLjI3Yy0uNjMuNTItMS40MyAxLjAyLTIuMjkgMS4zOUwxNi41IDE4SDE4bDMgMy4wMXoiIC8+PC9nPgo8ZyBpZD0ic2F2ZSI+PHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIgLz48L2c+CjxnIGlkPSJzY2hlZHVsZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0ic2VhcmNoIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiIC8+PC9nPgo8ZyBpZD0ic2VsZWN0LWFsbCI+PHBhdGggZD0iTTMgNWgyVjNjLTEuMSAwLTIgLjktMiAyem0wIDhoMnYtMkgzdjJ6bTQgOGgydi0ySDd2MnpNMyA5aDJWN0gzdjJ6bTEwLTZoLTJ2MmgyVjN6bTYgMHYyaDJjMC0xLjEtLjktMi0yLTJ6TTUgMjF2LTJIM2MwIDEuMS45IDIgMiAyem0tMi00aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3ptMiAxOGgydi0yaC0ydjJ6bTgtOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyem0wLTEyaDJWN2gtMnYyem0wIDhoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnptMC0xNmgyVjNoLTJ2MnpNNyAxN2gxMFY3SDd2MTB6bTItOGg2djZIOVY5eiIgLz48L2c+CjxnIGlkPSJzZW5kIj48cGF0aCBkPSJNMi4wMSAyMUwyMyAxMiAyLjAxIDMgMiAxMGwxNSAyLTE1IDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzIj48cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYXBwbGljYXRpb25zIj48cGF0aCBkPSJNMTIgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem03LTdINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTEuNzUgOWMwIC4yMy0uMDIuNDYtLjA1LjY4bDEuNDggMS4xNmMuMTMuMTEuMTcuMy4wOC40NWwtMS40IDIuNDJjLS4wOS4xNS0uMjcuMjEtLjQzLjE1bC0xLjc0LS43Yy0uMzYuMjgtLjc2LjUxLTEuMTguNjlsLS4yNiAxLjg1Yy0uMDMuMTctLjE4LjMtLjM1LjNoLTIuOGMtLjE3IDAtLjMyLS4xMy0uMzUtLjI5bC0uMjYtMS44NWMtLjQzLS4xOC0uODItLjQxLTEuMTgtLjY5bC0xLjc0LjdjLS4xNi4wNi0uMzQgMC0uNDMtLjE1bC0xLjQtMi40MmMtLjA5LS4xNS0uMDUtLjM0LjA4LS40NWwxLjQ4LTEuMTZjLS4wMy0uMjMtLjA1LS40Ni0uMDUtLjY5IDAtLjIzLjAyLS40Ni4wNS0uNjhsLTEuNDgtMS4xNmMtLjEzLS4xMS0uMTctLjMtLjA4LS40NWwxLjQtMi40MmMuMDktLjE1LjI3LS4yMS40My0uMTVsMS43NC43Yy4zNi0uMjguNzYtLjUxIDEuMTgtLjY5bC4yNi0xLjg1Yy4wMy0uMTcuMTgtLjMuMzUtLjNoMi44Yy4xNyAwIC4zMi4xMy4zNS4yOWwuMjYgMS44NWMuNDMuMTguODIuNDEgMS4xOC42OWwxLjc0LS43Yy4xNi0uMDYuMzQgMCAuNDMuMTVsMS40IDIuNDJjLjA5LjE1LjA1LjM0LS4wOC40NWwtMS40OCAxLjE2Yy4wMy4yMy4wNS40Ni4wNS42OXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmFja3VwLXJlc3RvcmUiPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJsdWV0b290aCI+PHBhdGggZD0iTTExIDI0aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnptOCAwaDJ2LTJoLTJ2MnptMi43MS0xOC4yOUwxMiAwaC0xdjcuNTlMNi40MSAzIDUgNC40MSAxMC41OSAxMCA1IDE1LjU5IDYuNDEgMTcgMTEgMTIuNDFWMjBoMWw1LjcxLTUuNzEtNC4zLTQuMjkgNC4zLTQuMjl6TTEzIDMuODNsMS44OCAxLjg4TDEzIDcuNTlWMy44M3ptMS44OCAxMC40NkwxMyAxNi4xN3YtMy43NmwxLjg4IDEuODh6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJyaWdodG5lc3MiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6TTggMTZoMi41bDEuNSAxLjUgMS41LTEuNUgxNnYtMi41bDEuNS0xLjUtMS41LTEuNVY4aC0yLjVMMTIgNi41IDEwLjUgOEg4djIuNUw2LjUgMTIgOCAxMy41VjE2em00LTdjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDNWOXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtY2VsbCI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTE2IC4wMUw4IDBDNi45IDAgNiAuOSA2IDJ2MTZjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE2SDhWNGg4djEyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ldGhlcm5ldCI+PHBhdGggZD0iTTcuNzcgNi43Nkw2LjIzIDUuNDguODIgMTJsNS40MSA2LjUyIDEuNTQtMS4yOEwzLjQyIDEybDQuMzUtNS4yNHpNNyAxM2gydi0ySDd2MnptMTAtMmgtMnYyaDJ2LTJ6bS02IDJoMnYtMmgtMnYyem02Ljc3LTcuNTJsLTEuNTQgMS4yOEwyMC41OCAxMmwtNC4zNSA1LjI0IDEuNTQgMS4yOEwyMy4xOCAxMmwtNS40MS02LjUyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1hbnRlbm5hIj48cGF0aCBkPSJNMTIgNWMtMy44NyAwLTcgMy4xMy03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg3LTMuMTMtNy03LTd6bTEgOS4yOWMuODgtLjM5IDEuNS0xLjI2IDEuNS0yLjI5IDAtMS4zOC0xLjEyLTIuNS0yLjUtMi41UzkuNSAxMC42MiA5LjUgMTJjMCAxLjAyLjYyIDEuOSAxLjUgMi4yOXYzLjNMNy41OSAyMSA5IDIyLjQxbDMtMyAzIDNMMTYuNDEgMjEgMTMgMTcuNTl2LTMuM3pNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJoMmMwLTQuOTcgNC4wMy05IDktOXM5IDQuMDMgOSA5aDJjMC02LjA3LTQuOTMtMTEtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvbmVudCI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtY29tcG9zaXRlIj48cGF0aCBkPSJNNSAyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIMXY2aDZWNkg1VjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJIOXYyem0tOCAwYzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOEM2LjE2IDE4LjQgNyAxNy4zIDcgMTZ2LTJIMXYyek0yMSA2VjJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NGgtMnY2aDZWNmgtMnptLTgtNGMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDl2Nmg2VjZoLTJWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMmgtNnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1oZG1pIj48cGF0aCBkPSJNMTggN1Y0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjNINXY2bDMgNnYzaDh2LTNsMy02VjdoLTF6TTggNGg4djNoLTJWNWgtMXYyaC0yVjVoLTF2Mkg4VjR6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LXN2aWRlbyI+PHBhdGggZD0iTTggMTEuNWMwLS44My0uNjctMS41LTEuNS0xLjVTNSAxMC42NyA1IDExLjUgNS42NyAxMyA2LjUgMTMgOCAxMi4zMyA4IDExLjV6bTctNWMwLS44My0uNjctMS41LTEuNS0xLjVoLTNDOS42NyA1IDkgNS42NyA5IDYuNVM5LjY3IDggMTAuNSA4aDNjLjgzIDAgMS41LS42NyAxLjUtMS41ek04LjUgMTVjLS44MyAwLTEuNS42Ny0xLjUgMS41UzcuNjcgMTggOC41IDE4czEuNS0uNjcgMS41LTEuNVM5LjMzIDE1IDguNSAxNXpNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJzNC45MyAxMSAxMSAxMSAxMS00LjkzIDExLTExUzE4LjA3IDEgMTIgMXptMCAyMGMtNC45NiAwLTktNC4wNC05LTlzNC4wNC05IDktOSA5IDQuMDQgOSA5LTQuMDQgOS05IDl6bTUuNS0xMWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bS0yIDVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1vdmVyc2NhbiI+PHBhdGggZD0iTTEyLjAxIDUuNUwxMCA4aDRsLTEuOTktMi41ek0xOCAxMHY0bDIuNS0xLjk5TDE4IDEwek02IDEwbC0yLjUgMi4wMUw2IDE0di00em04IDZoLTRsMi4wMSAyLjVMMTQgMTZ6bTctMTNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcGhvbmUiPjxwYXRoIGQ9Ik0xMyA5aC0ydjJoMlY5em00IDBoLTJ2MmgyVjl6bTMgNi41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTkgOXYyaDJWOWgtMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcG93ZXIiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem0yLTIyaC0ydjEwaDJWMnptMy41NiAyLjQ0bC0xLjQ1IDEuNDVDMTYuODQgNi45NCAxOCA4LjgzIDE4IDExYzAgMy4zMS0yLjY5IDYtNiA2cy02LTIuNjktNi02YzAtMi4xNyAxLjE2LTQuMDYgMi44OC01LjEyTDcuNDQgNC40NEM1LjM2IDUuODggNCA4LjI4IDQgMTFjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOGMwLTIuNzItMS4zNi01LjEyLTMuNDQtNi41NnpNMTUgMjRoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1yZW1vdGUiPjxwYXRoIGQ9Ik0xNSA5SDljLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMVYxMGMwLS41NS0uNDUtMS0xLTF6bS0zIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek03LjA1IDYuMDVsMS40MSAxLjQxQzkuMzcgNi41NiAxMC42MiA2IDEyIDZzMi42My41NiAzLjU0IDEuNDZsMS40MS0xLjQxQzE1LjY4IDQuNzggMTMuOTMgNCAxMiA0cy0zLjY4Ljc4LTQuOTUgMi4wNXpNMTIgMEM4Ljk2IDAgNi4yMSAxLjIzIDQuMjIgMy4yMmwxLjQxIDEuNDFDNy4yNiAzLjAxIDkuNTEgMiAxMiAyczQuNzQgMS4wMSA2LjM2IDIuNjRsMS40MS0xLjQxQzE3Ljc5IDEuMjMgMTUuMDQgMCAxMiAweiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy12b2ljZSI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTUtMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNGMwLTEuNjYtMS4zNC0zLTMtM1M5IDIuMzQgOSA0djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xIDExaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNC0xNGgtMS43YzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxMyA2LjcgMTBINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMGgydi0zLjI4YzMuMjgtLjQ5IDYtMy4zMSA2LTYuNzJ6IiAvPjwvZz4KPGcgaWQ9InNob3AiPjxwYXRoIGQ9Ik0xNiA2VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDJ2MTNjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmgtNnptLTYtMmg0djJoLTRWNHpNOSAxOFY5bDcuNSA0TDkgMTh6IiAvPjwvZz4KPGcgaWQ9InNob3AtdHdvIj48cGF0aCBkPSJNMyA5SDF2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJIM1Y5em0xNS00VjNjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDV2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJWNWgtNXptLTYtMmg0djJoLTRWM3ptMCAxMlY4bDUuNSAzLTUuNSA0eiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1iYXNrZXQiPjxwYXRoIGQ9Ik0xNy4yMSA5bC00LjM4LTYuNTZjLS4xOS0uMjgtLjUxLS40Mi0uODMtLjQyLS4zMiAwLS42NC4xNC0uODMuNDNMNi43OSA5SDJjLS41NSAwLTEgLjQ1LTEgMSAwIC4wOS4wMS4xOC4wNC4yN2wyLjU0IDkuMjdjLjIzLjg0IDEgMS40NiAxLjkyIDEuNDZoMTNjLjkyIDAgMS42OS0uNjIgMS45My0xLjQ2bDIuNTQtOS4yN0wyMyAxMGMwLS41NS0uNDUtMS0xLTFoLTQuNzl6TTkgOWwzLTQuNEwxNSA5SDl6bTMgOGMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9InNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yek0xIDJ2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINS4yMWwtLjk0LTJIMXptMTYgMTZjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJzb3J0Ij48cGF0aCBkPSJNMyAxOGg2di0ySDN2MnpNMyA2djJoMThWNkgzem0wIDdoMTJ2LTJIM3YyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTggMTRINnYtMmgydjJ6bTAtM0g2VjloMnYyem0wLTNINlY2aDJ2MnptNyA2aC01di0yaDV2MnptMy0zaC04VjloOHYyem0wLTNoLThWNmg4djJ6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMtb2ZmIj48cGF0aCBkPSJNMTAuNTQgMTFsLS41NC0uNTRMNy41NCA4IDYgNi40NiAyLjM4IDIuODQgMS4yNyAxLjczIDAgM2wyLjAxIDIuMDFMMiAyMmw0LTRoOWw1LjczIDUuNzNMMjIgMjIuNDYgMTcuNTQgMThsLTctN3pNOCAxNEg2di0yaDJ2MnptLTItM1Y5bDIgMkg2em0xNC05SDQuMDhMMTAgNy45MlY2aDh2MmgtNy45MmwxIDFIMTh2MmgtNC45Mmw2Ljk5IDYuOTlDMjEuMTQgMTcuOTUgMjIgMTcuMDggMjIgMTZWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic3BlbGxjaGVjayI+PHBhdGggZD0iTTEyLjQ1IDE2aDIuMDlMOS40MyAzSDcuNTdMMi40NiAxNmgyLjA5bDEuMTItM2g1LjY0bDEuMTQgM3ptLTYuMDItNUw4LjUgNS40OCAxMC41NyAxMUg2LjQzem0xNS4xNi41OWwtOC4wOSA4LjA5TDkuODMgMTZsLTEuNDEgMS40MSA1LjA5IDUuMDlMMjMgMTNsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0ic3RhciI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJzdGFyLWJvcmRlciI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRsLTMuNzYgMi4yNyAxLTQuMjgtMy4zMi0yLjg4IDQuMzgtLjM4TDEyIDYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXItaGFsZiI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRWNi4xbDEuNzEgNC4wNCA0LjM4LjM4LTMuMzIgMi44OCAxIDQuMjhMMTIgMTUuNHoiIC8+PC9nPgo8ZyBpZD0ic3RhcnMiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem00LjI0IDE2TDEyIDE1LjQ1IDcuNzcgMThsMS4xMi00LjgxLTMuNzMtMy4yMyA0LjkyLS40MkwxMiA1bDEuOTIgNC41MyA0LjkyLjQyLTMuNzMgMy4yM0wxNi4yMyAxOHoiIC8+PC9nPgo8ZyBpZD0ic3RvcmUiPjxwYXRoIGQ9Ik0yMCA0SDR2MmgxNlY0em0xIDEwdi0ybC0xLTVINGwtMSA1djJoMXY2aDEwdi02aDR2Nmgydi02aDF6bS05IDRINnYtNGg2djR6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0Ij48cGF0aCBkPSJNMTEgOWwxLjQyIDEuNDJMOC44MyAxNEgxOFY0aDJ2MTJIOC44M2wzLjU5IDMuNThMMTEgMjFsLTYtNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1yaWdodCI+PHBhdGggZD0iTTE5IDE1bC02IDYtMS40Mi0xLjQyTDE1LjE3IDE2SDRWNGgydjEwaDkuMTdsLTMuNTktMy41OEwxMyA5bDYgNnoiIC8+PC9nPgo8ZyBpZD0ic3ViamVjdCI+PHBhdGggZD0iTTE0IDE3SDR2MmgxMHYtMnptNi04SDR2MmgxNlY5ek00IDE1aDE2di0ySDR2MnpNNCA1djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJzdXBlcnZpc29yLWFjY291bnQiPjxwYXRoIGQ9Ik0xNi41IDEyYzEuMzggMCAyLjQ5LTEuMTIgMi40OS0yLjVTMTcuODggNyAxNi41IDdDMTUuMTIgNyAxNCA4LjEyIDE0IDkuNXMxLjEyIDIuNSAyLjUgMi41ek05IDExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zUzEwLjY2IDUgOSA1QzcuMzQgNSA2IDYuMzQgNiA4czEuMzQgMyAzIDN6bTcuNSAzYy0xLjgzIDAtNS41LjkyLTUuNSAyLjc1VjE5aDExdi0yLjI1YzAtMS44My0zLjY3LTIuNzUtNS41LTIuNzV6TTkgMTNjLTIuMzMgMC03IDEuMTctNyAzLjVWMTloN3YtMi4yNWMwLS44NS4zMy0yLjM0IDIuMzctMy40N0MxMC41IDEzLjEgOS42NiAxMyA5IDEzeiIgLz48L2c+CjxnIGlkPSJzd2FwLWhvcml6Ij48cGF0aCBkPSJNNi45OSAxMUwzIDE1bDMuOTkgNHYtM0gxNHYtMkg2Ljk5di0zek0yMSA5bC0zLjk5LTR2M0gxMHYyaDcuMDF2M0wyMSA5eiIgLz48L2c+CjxnIGlkPSJzd2FwLXZlcnQiPjxwYXRoIGQ9Ik0xNiAxNy4wMVYxMGgtMnY3LjAxaC0zTDE1IDIxbDQtMy45OWgtM3pNOSAzTDUgNi45OWgzVjE0aDJWNi45OWgzTDkgM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0aWNhbC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek02LjUgOUwxMCA1LjUgMTMuNSA5SDExdjRIOVY5SDYuNXptMTEgNkwxNCAxOC41IDEwLjUgMTVIMTN2LTRoMnY0aDIuNXoiIC8+PC9nPgo8ZyBpZD0ic3lzdGVtLXVwZGF0ZS1hbHQiPjxwYXRoIGQ9Ik0xMiAxNi41bDQtNGgtM3YtOWgtMnY5SDhsNCA0em05LTEzaC02djEuOTloNnYxNC4wM0gzVjUuNDloNlYzLjVIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtMTRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InRhYiI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6IiAvPjwvZz4KPGcgaWQ9InRhYi11bnNlbGVjdGVkIj48cGF0aCBkPSJNMSA5aDJWN0gxdjJ6bTAgNGgydi0ySDF2MnptMC04aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTggMTZoMnYtMkg5djJ6bS04LTRoMnYtMkgxdjJ6bTIgNHYtMkgxYzAgMS4xLjkgMiAyIDJ6TTIxIDNoLTh2NmgxMFY1YzAtMS4xLS45LTItMi0yem0wIDE0aDJ2LTJoLTJ2MnpNOSA1aDJWM0g5djJ6TTUgMjFoMnYtMkg1djJ6TTUgNWgyVjNINXYyem0xNiAxNmMxLjEgMCAyLS45IDItMmgtMnYyem0wLThoMnYtMmgtMnYyem0tOCA4aDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idGV4dC1mb3JtYXQiPjxwYXRoIGQ9Ik01IDE3djJoMTR2LTJINXptNC41LTQuMmg1bC45IDIuMmgyLjFMMTIuNzUgNGgtMS41TDYuNSAxNWgyLjFsLjktMi4yek0xMiA1Ljk4TDEzLjg3IDExaC0zLjc0TDEyIDUuOTh6IiAvPjwvZz4KPGcgaWQ9InRoZWF0ZXJzIj48cGF0aCBkPSJNMTggM3YyaC0yVjNIOHYySDZWM0g0djE4aDJ2LTJoMnYyaDh2LTJoMnYyaDJWM2gtMnpNOCAxN0g2di0yaDJ2MnptMC00SDZ2LTJoMnYyem0wLTRINlY3aDJ2MnptMTAgOGgtMnYtMmgydjJ6bTAtNGgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0idGh1bWItZG93biI+PHBhdGggZD0iTTE1IDNINmMtLjgzIDAtMS41NC41LTEuODQgMS4yMmwtMy4wMiA3LjA1Yy0uMDkuMjMtLjE0LjQ3LS4xNC43M3YxLjkxbC4wMS4wMUwxIDE0YzAgMS4xLjkgMiAyIDJoNi4zMWwtLjk1IDQuNTctLjAzLjMyYzAgLjQxLjE3Ljc5LjQ0IDEuMDZMOS44MyAyM2w2LjU5LTYuNTljLjM2LS4zNi41OC0uODYuNTgtMS40MVY1YzAtMS4xLS45LTItMi0yem00IDB2MTJoNFYzaC00eiIgLz48L2c+CjxnIGlkPSJ0aHVtYi11cCI+PHBhdGggZD0iTTEgMjFoNFY5SDF2MTJ6bTIyLTExYzAtMS4xLS45LTItMi0yaC02LjMxbC45NS00LjU3LjAzLS4zMmMwLS40MS0uMTctLjc5LS40NC0xLjA2TDE0LjE3IDEgNy41OSA3LjU5QzcuMjIgNy45NSA3IDguNDUgNyA5djEwYzAgMS4xLjkgMiAyIDJoOWMuODMgMCAxLjU0LS41IDEuODQtMS4yMmwzLjAyLTcuMDVjLjA5LS4yMy4xNC0uNDcuMTQtLjczdi0xLjkxbC0uMDEtLjAxTDIzIDEweiIgLz48L2c+CjxnIGlkPSJ0aHVtYnMtdXAtZG93biI+PHBhdGggZD0iTTEyIDZjMC0uNTUtLjQ1LTEtMS0xSDUuODJsLjY2LTMuMTguMDItLjIzYzAtLjMxLS4xMy0uNTktLjMzLS44TDUuMzggMCAuNDQgNC45NEMuMTcgNS4yMSAwIDUuNTkgMCA2djYuNWMwIC44My42NyAxLjUgMS41IDEuNWg2Ljc1Yy42MiAwIDEuMTUtLjM4IDEuMzgtLjkxbDIuMjYtNS4yOWMuMDctLjE3LjExLS4zNi4xMS0uNTVWNnptMTAuNSA0aC02Ljc1Yy0uNjIgMC0xLjE1LjM4LTEuMzguOTFsLTIuMjYgNS4yOWMtLjA3LjE3LS4xMS4zNi0uMTEuNTVWMThjMCAuNTUuNDUgMSAxIDFoNS4xOGwtLjY2IDMuMTgtLjAyLjI0YzAgLjMxLjEzLjU5LjMzLjhsLjc5Ljc4IDQuOTQtNC45NGMuMjctLjI3LjQ0LS42NS40NC0xLjA2di02LjVjMC0uODMtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJ0aW1lbGluZSI+PHBhdGggZD0iTTIzIDhjMCAxLjEtLjkgMi0yIDItLjE4IDAtLjM1LS4wMi0uNTEtLjA3bC0zLjU2IDMuNTVjLjA1LjE2LjA3LjM0LjA3LjUyIDAgMS4xLS45IDItMiAycy0yLS45LTItMmMwLS4xOC4wMi0uMzYuMDctLjUybC0yLjU1LTIuNTVjLS4xNi4wNS0uMzQuMDctLjUyLjA3cy0uMzYtLjAyLS41Mi0uMDdsLTQuNTUgNC41NmMuMDUuMTYuMDcuMzMuMDcuNTEgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yIC45LTIgMi0yYy4xOCAwIC4zNS4wMi41MS4wN2w0LjU2LTQuNTVDOC4wMiA5LjM2IDggOS4xOCA4IDljMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIC4xOC0uMDIuMzYtLjA3LjUybDIuNTUgMi41NWMuMTYtLjA1LjM0LS4wNy41Mi0uMDdzLjM2LjAyLjUyLjA3bDMuNTUtMy41NkMxOS4wMiA4LjM1IDE5IDguMTggMTkgOGMwLTEuMS45LTIgMi0yczIgLjkgMiAyeiIgLz48L2c+CjxnIGlkPSJ0b2MiPjxwYXRoIGQ9Ik0zIDloMTRWN0gzdjJ6bTAgNGgxNHYtMkgzdjJ6bTAgNGgxNHYtMkgzdjJ6bTE2IDBoMnYtMmgtMnYyem0wLTEwdjJoMlY3aC0yem0wIDZoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJ0b2RheSI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOGgxNHYxMXpNNyAxMGg1djVIN3oiIC8+PC9nPgo8ZyBpZD0idG9sbCI+PHBhdGggZD0iTTE1IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDggOC0zLjU4IDgtOC0zLjU4LTgtOC04em0wIDE0Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnpNMyAxMmMwLTIuNjEgMS42Ny00LjgzIDQtNS42NVY0LjI2QzMuNTUgNS4xNSAxIDguMjcgMSAxMnMyLjU1IDYuODUgNiA3Ljc0di0yLjA5Yy0yLjMzLS44Mi00LTMuMDQtNC01LjY1eiIgLz48L2c+CjxnIGlkPSJ0b3VjaC1hcHAiPjxwYXRoIGQ9Ik05IDExLjI0VjcuNUM5IDYuMTIgMTAuMTIgNSAxMS41IDVTMTQgNi4xMiAxNCA3LjV2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzbC00LjU0LTIuMjZjLS4xNy0uMDctLjM1LS4xMS0uNTQtLjExSDEzdi02YzAtLjgzLS42Ny0xLjUtMS41LTEuNVMxMCA2LjY3IDEwIDcuNXYxMC43NGwtMy40My0uNzJjLS4wOC0uMDEtLjE1LS4wMy0uMjQtLjAzLS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiIC8+PC9nPgo8ZyBpZD0idHJhY2stY2hhbmdlcyI+PHBhdGggZD0iTTE5LjA3IDQuOTNsLTEuNDEgMS40MUMxOS4xIDcuNzkgMjAgOS43OSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHMtOC0zLjU4LTgtOGMwLTQuMDggMy4wNS03LjQ0IDctNy45M3YyLjAyQzguMTYgNi41NyA2IDkuMDMgNiAxMmMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMS42Ni0uNjctMy4xNi0xLjc2LTQuMjRsLTEuNDEgMS40MUMxNS41NSA5LjkgMTYgMTAuOSAxNiAxMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNGMwLTEuODYgMS4yOC0zLjQxIDMtMy44NnYyLjE0Yy0uNi4zNS0xIC45OC0xIDEuNzIgMCAxLjEuOSAyIDIgMnMyLS45IDItMmMwLS43NC0uNC0xLjM4LTEtMS43MlYyaC0xQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBjMC0yLjc2LTEuMTItNS4yNi0yLjkzLTcuMDd6IiAvPjwvZz4KPGcgaWQ9InRyYW5zbGF0ZSI+PHBhdGggZD0iTTEyLjg3IDE1LjA3bC0yLjU0LTIuNTEuMDMtLjAzYzEuNzQtMS45NCAyLjk4LTQuMTcgMy43MS02LjUzSDE3VjRoLTdWMkg4djJIMXYxLjk5aDExLjE3QzExLjUgNy45MiAxMC40NCA5Ljc1IDkgMTEuMzUgOC4wNyAxMC4zMiA3LjMgOS4xOSA2LjY5IDhoLTJjLjczIDEuNjMgMS43MyAzLjE3IDIuOTggNC41NmwtNS4wOSA1LjAyTDQgMTlsNS01IDMuMTEgMy4xMS43Ni0yLjA0ek0xOC41IDEwaC0yTDEyIDIyaDJsMS4xMi0zaDQuNzVMMjEgMjJoMmwtNC41LTEyem0tMi42MiA3bDEuNjItNC4zM0wxOS4xMiAxN2gtMy4yNHoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZG93biI+PHBhdGggZD0iTTE2IDE4bDIuMjktMi4yOS00Ljg4LTQuODgtNCA0TDIgNy40MSAzLjQxIDZsNiA2IDQtNCA2LjMgNi4yOUwyMiAxMnY2eiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy1mbGF0Ij48cGF0aCBkPSJNMjIgMTJsLTQtNHYzSDN2MmgxNXYzeiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy11cCI+PHBhdGggZD0iTTE2IDZsMi4yOSAyLjI5LTQuODggNC44OC00LTRMMiAxNi41OSAzLjQxIDE4bDYtNiA0IDQgNi4zLTYuMjlMMjIgMTJWNnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0dXJuZWQtaW4tbm90Ij48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJ1bmFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NSA1LjIybC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTUuNTVMMy40NiA1LjIyQzMuMTcgNS41NyAzIDYuMDEgMyA2LjVWMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNi41YzAtLjQ5LS4xNy0uOTMtLjQ1LTEuMjh6TTEyIDkuNWw1LjUgNS41SDE0djJoLTR2LTJINi41TDEyIDkuNXpNNS4xMiA1bC44Mi0xaDEybC45MyAxSDUuMTJ6IiAvPjwvZz4KPGcgaWQ9InVuZG8iPjxwYXRoIGQ9Ik0xMi41IDhjLTIuNjUgMC01LjA1Ljk5LTYuOSAyLjZMMiA3djloOWwtMy42Mi0zLjYyYzEuMzktMS4xNiAzLjE2LTEuODggNS4xMi0xLjg4IDMuNTQgMCA2LjU1IDIuMzEgNy42IDUuNWwyLjM3LS43OEMyMS4wOCAxMS4wMyAxNy4xNSA4IDEyLjUgOHoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLWxlc3MiPjxwYXRoIGQ9Ik03LjQxIDE4LjU5TDguODMgMjAgMTIgMTYuODMgMTUuMTcgMjBsMS40MS0xLjQxTDEyIDE0bC00LjU5IDQuNTl6bTkuMTgtMTMuMThMMTUuMTcgNCAxMiA3LjE3IDguODMgNCA3LjQxIDUuNDEgMTIgMTBsNC41OS00LjU5eiIgLz48L2c+CjxnIGlkPSJ1bmZvbGQtbW9yZSI+PHBhdGggZD0iTTEyIDUuODNMMTUuMTcgOWwxLjQxLTEuNDFMMTIgMyA3LjQxIDcuNTkgOC44MyA5IDEyIDUuODN6bTAgMTIuMzRMOC44MyAxNWwtMS40MSAxLjQxTDEyIDIxbDQuNTktNC41OUwxNS4xNyAxNSAxMiAxOC4xN3oiIC8+PC9nPgo8ZyBpZD0idXBkYXRlIj48cGF0aCBkPSJNMjEgMTAuMTJoLTYuNzhsMi43NC0yLjgyYy0yLjczLTIuNy03LjE1LTIuOC05Ljg4LS4xLTIuNzMgMi43MS0yLjczIDcuMDggMCA5Ljc5IDIuNzMgMi43MSA3LjE1IDIuNzEgOS44OCAwQzE4LjMyIDE1LjY1IDE5IDE0LjA4IDE5IDEyLjFoMmMwIDEuOTgtLjg4IDQuNTUtMi42NCA2LjI5LTMuNTEgMy40OC05LjIxIDMuNDgtMTIuNzIgMC0zLjUtMy40Ny0zLjUzLTkuMTEtLjAyLTEyLjU4IDMuNTEtMy40NyA5LjE0LTMuNDcgMTIuNjUgMEwyMSAzdjcuMTJ6TTEyLjUgOHY0LjI1bDMuNSAyLjA4LS43MiAxLjIxTDExIDEzVjhoMS41eiIgLz48L2c+CjxnIGlkPSJ2ZXJpZmllZC11c2VyIj48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bS0yIDE2bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9InZpZXctYWdlbmRhIj48cGF0aCBkPSJNMjAgMTNIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXptMC0xMEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InZpZXctYXJyYXkiPjxwYXRoIGQ9Ik00IDE4aDNWNUg0djEzek0xOCA1djEzaDNWNWgtM3pNOCAxOGg5VjVIOHYxM3oiIC8+PC9nPgo8ZyBpZD0idmlldy1jYXJvdXNlbCI+PHBhdGggZD0iTTcgMTloMTBWNEg3djE1em0tNS0yaDRWNkgydjExek0xOCA2djExaDRWNmgtNHoiIC8+PC9nPgo8ZyBpZD0idmlldy1jb2x1bW4iPjxwYXRoIGQ9Ik0xMCAxOGg1VjVoLTV2MTN6bS02IDBoNVY1SDR2MTN6TTE2IDV2MTNoNVY1aC01eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWRheSI+PHBhdGggZD0iTTIgMjFoMTl2LTNIMnYzek0yMCA4SDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY5YzAtLjU1LS40NS0xLTEtMXpNMiAzdjNoMTlWM0gyeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWhlYWRsaW5lIj48cGF0aCBkPSJNNCAxNWgxNnYtMkg0djJ6bTAgNGgxNnYtMkg0djJ6bTAtOGgxNlY5SDR2MnptMC02djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWxpc3QiPjxwYXRoIGQ9Ik00IDE0aDR2LTRINHY0em0wIDVoNHYtNEg0djR6TTQgOWg0VjVINHY0em01IDVoMTJ2LTRIOXY0em0wIDVoMTJ2LTRIOXY0ek05IDV2NGgxMlY1SDl6IiAvPjwvZz4KPGcgaWQ9InZpZXctbW9kdWxlIj48cGF0aCBkPSJNNCAxMWg1VjVINHY2em0wIDdoNXYtNkg0djZ6bTYgMGg1di02aC01djZ6bTYgMGg1di02aC01djZ6bS02LTdoNVY1aC01djZ6bTYtNnY2aDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1xdWlsdCI+PHBhdGggZD0iTTEwIDE4aDV2LTZoLTV2NnptLTYgMGg1VjVINHYxM3ptMTIgMGg1di02aC01djZ6TTEwIDV2NmgxMVY1SDEweiIgLz48L2c+CjxnIGlkPSJ2aWV3LXN0cmVhbSI+PHBhdGggZD0iTTQgMThoMTd2LTZINHY2ek00IDV2NmgxN1Y1SDR6IiAvPjwvZz4KPGcgaWQ9InZpZXctd2VlayI+PHBhdGggZD0iTTYgNUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bTE0IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXptLTcgMGgtM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5Ij48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5LW9mZiI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIgLz48L2c+CjxnIGlkPSJ3YXJuaW5nIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJ3YXRjaC1sYXRlciI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem00LjIgMTQuMkwxMSAxM1Y3aDEuNXY1LjJsNC41IDIuNy0uOCAxLjN6IiAvPjwvZz4KPGcgaWQ9IndlZWtlbmQiPjxwYXRoIGQ9Ik0yMSAxMGMtMS4xIDAtMiAuOS0yIDJ2M0g1di0zYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMnY1YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTVjMC0xLjEtLjktMi0yLTJ6bS0zLTVINmMtMS4xIDAtMiAuOS0yIDJ2Mi4xNWMxLjE2LjQxIDIgMS41MSAyIDIuODJWMTRoMTJ2LTIuMDNjMC0xLjMuODQtMi40IDItMi44MlY3YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ3b3JrIj48cGF0aCBkPSJNMjAgNmgtNFY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS02IDBoLTRWNGg0djJ6IiAvPjwvZz4KPGcgaWQ9InlvdXR1YmUtc2VhcmNoZWQtZm9yIj48cGF0aCBkPSJNMTcuMDEgMTRoLS44bC0uMjctLjI3Yy45OC0xLjE0IDEuNTctMi42MSAxLjU3LTQuMjMgMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAzLTYuNSA2LjVIMmwzLjg0IDQgNC4xNi00SDYuNTFDNi41MSA3IDguNTMgNSAxMS4wMSA1czQuNSAyLjAxIDQuNSA0LjVjMCAyLjQ4LTIuMDIgNC41LTQuNSA0LjUtLjY1IDAtMS4yNi0uMTQtMS44Mi0uMzhMNy43MSAxNS4xYy45Ny41NyAyLjA5LjkgMy4zLjkgMS42MSAwIDMuMDgtLjU5IDQuMjItMS41N2wuMjcuMjd2Ljc5bDUuMDEgNC45OUwyMiAxOWwtNC45OS01eiIgLz48L2c+CjxnIGlkPSJ6b29tLWluIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHptMi41LTRoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1vdXQiPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0ek03IDloNXYxSDd6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pY29uLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIiBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJydW4tY29sb3Itc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbXVsdGktY2hlY2tib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dCBpZD0ibmFtZXMtcmVnZXgiIG5vLWxhYmVsLWZsb2F0IGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIiB2YWx1ZT0iW1tyZWdleF1dIiBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSI+PC9wYXBlci1pbnB1dD4KICAgIDxkaXYgaWQ9Im91dGVyLWNvbnRhaW5lciIgY2xhc3M9InNjcm9sbGJhciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iIG9uLWRvbS1jaGFuZ2U9InN5bmNocm9uaXplQ29sb3JzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGVja2JveCB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iIG5hbWU9IltbaXRlbV1dIiBjaGVja2VkJD0iW1tfaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGlvblN0YXRlLiopXV0iIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIj48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBpc29sYXRvci1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiIGNsYXNzPSJpc29sYXRvciB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIG9uLXRhcD0iX2lzb2xhdGVOYW1lIiBuYW1lPSJbW2l0ZW1dXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5uYW1lLXJvdyB7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtd2JyLXN0cmluZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19wYXJ0c11dIiBhcz0icGFydCI+W1twYXJ0XV08d2JyPjwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcnVucy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbZGF0YUxvY2F0aW9uXV0iIC8+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgaWQ9InRvcC10ZXh0Ij4KICAgICAgPGgzIGlkPSJ0b29sdGlwLWhlbHAiIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+UnVuczwvaDM+CiAgICA8L2Rpdj4KICAgIDx0Zi1tdWx0aS1jaGVja2JveCBpZD0ibXVsdGlDaGVja2JveCIgbmFtZXM9IltbcnVuc11dIiBzZWxlY3Rpb24tc3RhdGU9Int7cnVuU2VsZWN0aW9uU3RhdGV9fSIgb3V0LXNlbGVjdGVkPSJ7e3NlbGVjdGVkUnVuc319IiByZWdleD0ie3tyZWdleElucHV0fX0iIGNvbG9yaW5nPSJbW2NvbG9yaW5nXV0iPjwvdGYtbXVsdGktY2hlY2tib3g+CiAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgaWQ9InRvZ2dsZS1hbGwiIG9uLXRhcD0iX3RvZ2dsZUFsbCI+CiAgICAgIFRvZ2dsZSBBbGwgUnVucwogICAgPC9wYXBlci1idXR0b24+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvY2F0aW9uXV0iPgogICAgICA8ZGl2IGlkPSJkYXRhLWxvY2F0aW9uIj4KICAgICAgICA8dGYtd2JyLXN0cmluZyB2YWx1ZT0iW1tfY2xpcHBlZERhdGFMb2NhdGlvbl1dIiAvPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItbGl0ZSI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwbG90dGFibGUtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotY2hhcnQtdG9vbHRpcCI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotcGFuLXpvb20tc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmhlbHAgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAxczsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDFzOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAzMCwgMzAsIDAuNik7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLmhlbHAgPiBzcGFuIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KCiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1saW5lLWNoYXJ0MiI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHZ6LWNoYXJ0LXRvb2x0aXAgaWQ9InRvb2x0aXAiIHBvc2l0aW9uPSJbW3Rvb2x0aXBQb3NpdGlvbl1dIiBjb250ZW50LWNvbXBvbmVudC1uYW1lPSJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiPjwvdnotY2hhcnQtdG9vbHRpcD4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idnotcGFuLXpvb20tc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IC5tYWluIHsKICAgICAgICBjdXJzb3I6IGNyb3NzaGFpcjsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhbmtleSkgI2NoYXJ0ZGl2IDpub3QoLmRyYWctem9vbWluZykgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogICAgICAgIGN1cnNvcjogZ3JhYjsKICAgICAgfQoKICAgICAgOmhvc3QoLm1vdXNlZG93bikgI2NoYXJ0ZGl2IC5wYW5uaW5nIC5tYWluIHsKICAgICAgICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgICAgICAgY3Vyc29yOiBncmFiYmluZzsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydC10b29sdGlwIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImNoYXJ0IiBkYXRhLWxvYWRpbmckPSJbW2RhdGFMb2FkaW5nXV0iIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcy1zY3JvbGxlZDpub3QoOmZpcnN0LWNoaWxkKSk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdCguY2FuLXNjcm9sbDpub3QoLnNjcm9sbGVkLXRvLWJvdHRvbSk6bm90KDpsYXN0LWNoaWxkKSk6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5zY3JvbGxhYmxlIHsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1zY3JvbGw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXNjcm9sbGFibGU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2Nyb2xsYWJsZSIgY2xhc3M9InNjcm9sbGFibGUiIG9uLXNjcm9sbD0idXBkYXRlU2Nyb2xsU3RhdGUiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW1hcmtkb3duLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im1hcmtkb3duIiBpbm5lci1oLXQtbS1sPSJbW2h0bWxdXSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgICAqIFJlZHVjZSB0b3Btb3N0IGFuZCBib3R0b21tb3N0IG1hcmdpbnMgZnJvbSAxNnB4IHRvIDAuM2VtIChyZW5kZXJzCiAgICAgICAqIGF0IGFib3V0IDQuOHB4KSB0byBrZWVwIHRoZSBsYXlvdXQgY29tcGFjdC4gVGhpcyBpbXByb3ZlcyB0aGUKICAgICAgICogYXBwZWFyYW5jZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgb2YgdGV4dDsgc3RhbmRhcmQgTWFya2Rvd24KICAgICAgICogcmVuZGVyZXJzIHdpbGwgc3RpbGwgaW5jbHVkZSBhIGA8cD5gIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEJ5IHRhcmdldGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwsIGV4dHJlbWFsIGVsZW1lbnRzLCB3ZSBwcmVzZXJ2ZSBhbnkKICAgICAgICogYWN0dWFsIHBhcmFncmFwaCBicmVha3MgYW5kIG9ubHkgY2hhbmdlIHRoZSBwYWRkaW5nIGFnYWluc3QgdGhlCiAgICAgICAqIGNvbXBvbmVudCBlZGdlcy4KICAgICAgICovCiAgICAgICNtYXJrZG93biA+IHA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDAuM2VtOwogICAgICB9CiAgICAgICNtYXJrZG93biA+IHA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4zZW07CiAgICAgIH0KCiAgICAgIC8qIFBsZWFzYW50IHN0eWxlcyBmb3IgTWFya2Rvd24gdGFibGVzLiAqLwogICAgICAjbWFya2Rvd24gdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCwKICAgICAgI21hcmtkb3duIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTNweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlMmU1OwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0ciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2M2Y2JkMTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGZpZ2NhcHRpb24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi8KICAgICAgLmhlYWRpbmctcm93IHsKICAgICAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgICAgLmhlYWRpbmctbGFiZWwgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqLwogICAgICAuaGVhZGluZy1yaWdodCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPgogICAgICAgICAgICAgIFtbX25hbWVMYWJlbF1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tydW5dXSI+CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InJ1biIgaWQ9ImhlYWRpbmctcnVuIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kb3dubG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InJ1biB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfcnVufX0iPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkNTVjwvYT48YSBkb3dubG9hZD0iW1tfanNvbk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19qc29uVXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkpTT048L2E+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMCAwLjJlbTsKICAgICAgfQogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19nZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUpXV0iIGRhdGEtc2VyaWVzPSJbW19nZXREYXRhU2VyaWVzKGRhdGFUb0xvYWQuKildXSIgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIgZ2V0LWRhdGEtbG9hZC1uYW1lPSJbW19nZXREYXRhTG9hZE5hbWVdXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbZ2V0RGF0YUxvYWRVcmxdXSIgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2xvYWREYXRhQ2FsbGJhY2tdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHRhZy1tZXRhZGF0YT0iW1t0YWdNZXRhZGF0YV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249ImF1dG8iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiIGljb249ImZpbGUtZG93bmxvYWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgIDxhIGlkPSJzdmdMaW5rIiBkb3dubG9hZD0iW1t0YWddXS5zdmciPgogICAgICAgICAgICAgICAgRG93bmxvYWQgQ3VycmVudCBDaGFydCBhcyBTVkcKICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLW1lbnUtYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8dGYtZG93bmxvYWRlciBydW5zPSJbW19ydW5zRnJvbURhdGEoZGF0YVRvTG9hZCldXSIgdGFnPSJbW3RhZ11dIiB1cmwtZm49IltbX2Rvd25sb2FkVXJsRm5dXSI+PC90Zi1kb3dubG9hZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CgogICAgICAjYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBhIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1tZW51LWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICBwYXBlci1pdGVtIGEgewogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcHJvZ3Jlc3MiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLyogdGhlIHN0cmlwZSBmb3IgdGhlIGluZGV0ZXJtaW5hdGUgYW5pbWF0aW9uKi8KICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWhlaWdodCwgNHB4KTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07CgogICAgICAgIC8qIER1cmF0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwoKICAgICAgICAvKiBUaW1pbmcgZnVuY3Rpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKCiAgICAgICAgLyogRGVsYXkgKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tMTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktNTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKCiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0icHJvZ3Jlc3NDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJzZWNvbmRhcnlQcm9ncmVzcyIgaGlkZGVuJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zbGlkZXIiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtMzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQ6IHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsIDJweCk7CiAgICAgIH0KCiAgICAgIC8qIGZvY3VzIHNob3dzIHRoZSByaXBwbGUgKi8KICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaG91Z2ggOmhvc3QtY29udGV4dCBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLCBzb21lIHBhZ2VzCiAgICAgICAqIHN0aWxsIHJlbHkgb24gcGFwZXItc2xpZGVyIGJlaW5nIGZsaXBwZWQgd2hlbiBkaXI9InJ0bCIgaXMgc2V0IG9uIGJvZHkuIEZvciBmdWxsCiAgICAgICAqIGNvbXBhdGFiaWxpdHksIGRpcj0icnRsIiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IG9uIHBhcGVyLXNsaWRlci4KICAgICAgICovCiAgICAgIDpkaXIocnRsKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBydWxlIGFib3ZlIGJlY2F1c2UgOmhvc3QtY29udGV4dCBtYXkKICAgICAgICogbm90IGJlIHJlY29nbml6ZWQuCiAgICAgICAqLwogICAgICA6aG9zdChbZGlyPSJydGwiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IE5lZWRlZCB0byBvdmVycmlkZSB0aGUgOmhvc3QtY29udGV4dCBydWxlICh3aGVyZSBzdXBwb3J0ZWQpCiAgICAgICAqIHRvIHN1cHBvcnQgTFRSIHNsaWRlcnMgaW4gUlRMIHBhZ2VzLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0ibHRyIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIG1hcmdpbi1yaWdodDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lcjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lci5lZGl0YWJsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucmluZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucmluZy5leHBhbmQuZHJhZ2dpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kOm5vdCgucGluKSA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDhweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJCYXIgewogICAgICAgIHBhZGRpbmc6IDE1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYmFyLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1jb250YWluZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VycyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogY2FsYygxNHB4ICsgdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwycHgpLzIpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAtMXB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQogICAgICAuc2xpZGVyLW1hcmtlcnM6OmFmdGVyLAogICAgICAuc2xpZGVyLW1hcmtlcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKC0xNXB4IC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICB3aWR0aDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgfQoKICAgICAgLnRyYW5zaXRpbmcgPiAuc2xpZGVyLWtub2IgewogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbmFwcyA+IC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CgogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICB9CgogICAgICAuZXhwYW5kOm5vdCgucGluKSA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICB9CgogICAgICAucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBtYXJnaW4tbGVmdDogLTEzcHg7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJSA1MCUgNTAlIDA7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlLAogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucGluLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICB9CgogICAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogYXR0cih2YWx1ZSk7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1mb250LWNvbG9yLCAjZmZmKTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICB9CgogICAgICAvKiBwYXBlci1pbnB1dCAqLwogICAgICAuc2xpZGVyLWlucHV0IHsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQtY29udGFpbmVyLWlucHV0OwogICAgICAgIH07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwogICAgICAjc2xpZGVyQ29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmRpc2FibGVkID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNsaWRlckNvbnRhaW5lciIgY2xhc3MkPSJbW19nZXRDbGFzc05hbWVzKGRpc2FibGVkLCBwaW4sIHNuYXBzLCBpbW1lZGlhdGVWYWx1ZSwgbWluLCBleHBhbmQsIGRyYWdnaW5nLCB0cmFuc2l0aW5nLCBlZGl0YWJsZSldXSI+CiAgICAgIDxkaXYgY2xhc3M9ImJhci1jb250YWluZXIiPgogICAgICAgIDxwYXBlci1wcm9ncmVzcyBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaWQ9InNsaWRlckJhciIgYXJpYS1oaWRkZW49InRydWUiIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBzdGVwPSJbW3N0ZXBdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgc2Vjb25kYXJ5LXByb2dyZXNzPSJbW3NlY29uZGFyeVByb2dyZXNzXV0iIG9uLWRvd249Il9iYXJkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9iYXJ0cmFjayIgb24tdGFwPSJfYmFyY2xpY2siPgogICAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3NuYXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXJzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWFya2Vyc11dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlciI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPGRpdiBpZD0ic2xpZGVyS25vYiIgY2xhc3M9InNsaWRlci1rbm9iIiBvbi1kb3duPSJfa25vYmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX29uVHJhY2siIG9uLXRyYW5zaXRpb25lbmQ9Il9rbm9iVHJhbnNpdGlvbkVuZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXIta25vYi1pbm5lciIgdmFsdWUkPSJbW2ltbWVkaWF0ZVZhbHVlXV0iPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlZGl0YWJsZV1dIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIGNsYXNzPSJzbGlkZXItaW5wdXQiIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBvbi1jaGFuZ2U9Il9jaGFuZ2VWYWx1ZSIgb24ta2V5ZG93bj0iX2lucHV0S2V5RG93biIgbm8tbGFiZWwtZmxvYXQ+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNtb290aGluZy1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPGgzIGNsYXNzPSJ0aXRsZSI+U21vb3RoaW5nPC9oMz4KICAgIDxkaXYgY2xhc3M9InNtb290aGluZy1ibG9jayI+CiAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcn19IiBtYXg9IltbbWF4XV0iIG1pbj0iW1ttaW5dXSIgcGluIHN0ZXA9Iltbc3RlcF1dIiB0eXBlPSJudW1iZXIiIHZhbHVlPSJ7e3dlaWdodH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgbGFiZWw9IndlaWdodCIgbm8tbGFiZWwtZmxvYXQgdmFsdWU9Int7X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dH19IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnNtb290aGluZy1ibG9jayB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJzaG93LWRvd25sb2FkLWxpbmtzIiBjaGVja2VkPSJ7e19zaG93RG93bmxvYWRMaW5rc319Ij5TaG93IGRhdGEgZG93bmxvYWQgbGlua3M8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9Imlnbm9yZS15LW91dGxpZXIiIGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXY+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMC45OTkiPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4LXR5cGUtc2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgQXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHNjYWxhciBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBzY2FsYXIgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtc2NhbGFyLWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiBkYXRhLXRvLWxvYWQ9IltbaXRlbS5zZXJpZXNdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBtdWx0aS1leHBlcmltZW50cz0iW1tfZ2V0TXVsdGlFeHBlcmltZW50cyhkYXRhU2VsZWN0aW9uKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKGNhdGVnb3J5LCBfcnVuVG9UYWdJbmZvLCBpdGVtKV1dIiB0YWc9IltbaXRlbS50YWddXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1tfdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW194VHlwZV1dIj48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuY2VudGVyIHsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAxOXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGZpbGwtYXJlYT0iW1tfZmlsbEFyZWFdXSIgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iIGxvYWQta2V5PSJbW190YWdGaWx0ZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJkYXRhU2VyaWVzTmFtZSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+Q1NWPC9hPgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkpTT048L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWlzc2luZ1RhZ3MubGVuZ3RoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuIiBjbGFzcz0idG9nZ2xlLWNvbGxhcHNpYmxlLWJ1dHRvbiI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4gTWlzc2luZyBUYWdzCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWlzc2luZ1RhZ3NdXSIgYXM9Im1pc3NpbmdFbnRyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgUnVuICJbW21pc3NpbmdFbnRyeS5ydW5dXSIgbGFja3MgZGF0YSBmb3IgdGFncwogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWlzc2luZ0VudHJ5LnRhZ3NdXSIgYXM9InRhZyI+CiAgICAgICAgICAgICAgICAgIDxsaT5bW3RhZ11dPC9saT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnRmlsdGVySW52YWxpZF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoaXMgcmVndWxhciBleHByZXNpb24gaXMgaW52YWxpZDo8YnI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImludmFsaWQtcmVnZXgiPltbX3RhZ0ZpbHRlcl1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGVwc01pc21hdGNoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhlIHN0ZXBzIGZvciB2YWx1ZSwgbG93ZXIsIGFuZCB1cHBlciB0YWdzIGRvIG5vdCBtYXRjaDoKICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudmFsdWVdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC52YWx1ZVN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0Lmxvd2VyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gubG93ZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC51cHBlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnVwcGVyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0ic2VyaWVzTmFtZSIgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IiBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5lcnJvci1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQoKICAgICAgLmVycm9yLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIGF1dG8gNXB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbnZhbGlkLXJlZ2V4IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmVycm9yLWNvbnRlbnQgdWwgewogICAgICAgIG1hcmdpbjogMXB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE5cHg7CiAgICAgIH0KCiAgICAgIC50YWctbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLXRpdGxlLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZU1hdGNoZXNJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIiBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNhdGVnb3JpZXMtY29udGFpbmVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5UaGUgY3VzdG9tIHNjYWxhcnMgZGFzaGJvYXJkIGlzIGluYWN0aXZlLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICAKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkIGltcG9ydCBzdW1tYXJ5CmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5jdXN0b21fc2NhbGFyIGltcG9ydCBsYXlvdXRfcGIyCi4uLgojIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZm9ybWVkIGF0IGV2ZXJ5IHN0ZXAsIHNvIHRoZSBhY3Rpb24gaXMgbm90CiMgdGFrZW4gY2FyZSBvZiBieSBhbiBvcCBpbiB0aGUgZ3JhcGguIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsYXlvdXQgb25jZQojIChpbnN0ZWFkIG9mIHBlciBzdGVwKS4KbGF5b3V0X3N1bW1hcnkgPSBzdW1tYXJ5X2xpYi5jdXN0b21fc2NhbGFyX3BiKGxheW91dF9wYjIuTGF5b3V0KAogIGNhdGVnb3J5PVsKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcidsb3NzLionXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2JheicsCiAgICAgICAgICAgICAgbWFyZ2luPWxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgc2VyaWVzPVsKICAgICAgICAgICAgICAgICAgbGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQuU2VyaWVzKAogICAgICAgICAgICAgICAgICAgIHZhbHVlPSdsb3NzL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgbG93ZXI9J2Jhel9sb3dlci9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIHVwcGVyPSdiYXpfdXBwZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JyksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICkpLAogICAgICBdKSwKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSd0cmlnIGZ1bmN0aW9ucycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3dhdmUgdHJpZyBmdW5jdGlvbnMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL2Nvc2luZScsIHIndHJpZ0Z1bmN0aW9ucy9zaW5lJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICAjIFRoZSByYW5nZSBvZiB0YW5nZW50IGlzIGRpZmZlcmVudC4gTGV0J3MgZ2l2ZSBpdCBpdHMgb3duIGNoYXJ0LgogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0ndGFuJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy90YW5nZW50J10sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0sCiAgICAgICMgVGhpcyBjYXRlZ29yeSB3ZSBjYXJlIGxlc3MgYWJvdXQuIExldCdzIG1ha2UgaXQgaW5pdGlhbGx5IGNsb3NlZC4KICAgICAgY2xvc2VkPVRydWUpLAogIF0pKQp3cml0ZXIuYWRkX3N1bW1hcnkobGF5b3V0X3N1bW1hcnkpCjwvcHJlPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGFzPSJjaGFydCIgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgZGlzYWJsZS1wYWdpbmF0aW9uIGluaXRpYWwtb3BlbmVkPSJbW2NhdGVnb3J5Lm1ldGFkYXRhLm9wZW5lZF1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubXVsdGlsaW5lXV0iPgogICAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tYXJnaW5dXSI+CiAgICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSI+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAKICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj5bW190b0xvY2FsZVN0cmluZyhfc3RlcFZhbHVlKV1dPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgZGF0ZXRpbWUiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc0ltYWdlTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CgogICAgCiAgICA8YSBpZD0ibWFpbi1pbWFnZS1jb250YWluZXIiIHJvbGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iVG9nZ2xlIGFjdHVhbCBzaXplIiBhcmlhLWV4cGFuZGVkJD0iW1tfZ2V0QXJpYUV4cGFuZGVkKGFjdHVhbFNpemUpXV0iIG9uLXRhcD0iX2hhbmRsZVRhcCI+PC9hPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAvKiogTWFrZSBidXR0b24gYSBkaXYuICovCiAgICAgIGJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IEdldCByaWQgb2YgZG90dGVkIGxpbmUgaW5zaWRlIGJ1dHRvbi4gKi8KICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IFNpbXVsYXRlIENocm9tZSdzIG91dGVyIGdsb3cgb24gYnV0dG9uIHdoZW4gZm9jdXNlZC4gKi8KICAgICAgYnV0dG9uOi1tb3otZm9jdXNyaW5nIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IDJweCBIaWdobGlnaHQ7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDAgMTVweCA0MHB4IDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLyoqIFdoZW4gYWN0dWFsIHNpemUgc2hvd24gaXMgb24sIHVzZSB0aGUgYWN0dWFsIGltYWdlIHdpZHRoLiAqLwogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1zcGlubmVyLWxpdGUgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKgogICAgICAgICAqIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUKICAgICAgICAgKiBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zCiAgICAgICAgICogd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwgYW5kCiAgICAgICAgICogYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZgogICAgICAgICAqIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgICAgICAgKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMjRweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfYWN0dWFsU2l6ZX19Ij5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5CcmlnaHRuZXNzIGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iMiIgc25hcHMgcGluIHN0ZXA9IjAuMDEiIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgb24tdGFwPSJfcmVzZXRCcmlnaHRuZXNzIiBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkNvbnRyYXN0IGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iNTAwIiBzbmFwcyBwaW4gc3RlcD0iMSIgdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0Q29udHJhc3QiIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIGlkPSJydW5zLXNlbGVjdG9yIiBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGltYWdlIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIiBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSI+PC90Zi1pbWFnZS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItc2xpZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0OwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1hdWRpby1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiB0b3RhbC1zYW1wbGVzPSJbW2l0ZW0udG90YWxTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIAogICAgCiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIAogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1taW5pbWFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIgaWQ9Im1pbmltYXBEcm9wU2hhZG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTUwJSIgaGVpZ2h0PSIxNTAlIj4KICAgICAgICAgIDxmZW9mZnNldCByZXN1bHQ9Im9mZk91dCIgaW49IlNvdXJjZUdyYXBoaWMiIGR4PSIxIiBkeT0iMSI+PC9mZW9mZnNldD4KICAgICAgICAgIDxmZWNvbG9ybWF0cml4IHJlc3VsdD0ibWF0cml4T3V0IiBpbj0ib2ZmT3V0IiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC41IDAiPjwvZmVjb2xvcm1hdHJpeD4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciByZXN1bHQ9ImJsdXJPdXQiIGluPSJtYXRyaXhPdXQiIHN0ZGRldmlhdGlvbj0iMiI+PC9mZWdhdXNzaWFuYmx1cj4KICAgICAgICAgIDxmZWJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZWJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgCiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrIG5vLWNhbmNlbC1vbi1lc2Mta2V5IG9wZW5lZD0ie3tfb3Blbn19Ij4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0N1c3RvbU1lc3NhZ2VdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvU2Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+dGYuU2Vzc2lvbjwvYT46CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlLXNuaXBwZXQiPmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5weXRob24gaW1wb3J0IGRlYnVnIGFzIHRmX2RlYnVnCgpzZXNzID0gdGYuU2Vzc2lvbigpCnNlc3MgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24oc2VzcywgIltbX2hvc3RdXTpbW19wb3J0XV0iKQpzZXNzLnJ1bihteV9mZXRjaGVzKQogICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2VzdGltYXRvcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPkVzdGltYXRvcjwvYT4KICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL3RyYWluL01vbml0b3JlZFNlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPk1vbml0b3JlZFNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKaG9vayA9IHRmX2RlYnVnLlRlbnNvckJvYXJkRGVidWdIb29rKCJbW19ob3N0XV06W1tfcG9ydF1dIikKbXlfZXN0aW1hdG9yLmZpdCh4PXhfZGF0YSwgeT15X2RhdGEsIHN0ZXBzPTEwMDAsIG1vbml0b3JzPVtob29rXSkKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+S2VyYXMgTW9kZWw8L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwppbXBvcnQga2VyYXMKCmtlcmFzLmJhY2tlbmQuc2V0X3Nlc3Npb24oCiAgICB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24odGYuU2Vzc2lvbigpLCAiW1tfaG9zdF1dOltbX3BvcnRdXSIpKQojIERlZmluZSB5b3VyIGtlcmFzIG1vZGVsLCBjYWxsZWQgIm1vZGVsIi4KbW9kZWwuZml0KC4uLikKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICA6aG9zdChbX2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIDpob3N0LAogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIH0KCiAgICAgIC5jb2RlLWV4YW1wbGUgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLmNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItcmVzaXplciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iYmFycyI+CiAgICAgIDxkaXYgY2xhc3M9ImJhcnMtcm90YXRvciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImJhcnMtdGV4dCI+fCB8PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdChbX3Jlc2l6ZXItaWRlbnRpZmllcl0pIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSB7CiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplOwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbX2lzLXZlcnRpY2FsXSkgewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICByaWdodDogLTE1cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLmJhcnMgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIC8qKiBUaGlzIGJsb2NrIHByZXZlbnRzIHRoZSBiYXJzIHJvdGF0b3IgZnJvbSBoYXZpbmcgYSBoZWlnaHQgdGhhdCBpcwogICAgICAgICAgdGhlIGVudGlyZSB2aWV3cG9ydCwgdGh1cyBvY2NsdWRpbmcgaXQgYW5kIGdpdmluZyBpdCBhbiB1bmRlc2lyZWQgY3Vyc29yCiAgICAgICAgICB2YWx1ZS4gKi8KICAgICAgLmJhcnMtcm90YXRvciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaXMtaG9yaXpvbnRhbF0pIC5iYXJzLXJvdGF0b3IgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmJhcnMtdGV4dCB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMTUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8dGg+RmVlZHM8L3RoPgogICAgICAgICAgPHRoPkZldGNoZXM8L3RoPgogICAgICAgICAgPHRoPlRhcmdldHM8L3RoPgogICAgICAgICAgPHRoPiMoRGV2aWNlcyk8L3RoPgogICAgICAgICAgPHRoPkNvdW50PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDx2ei1saW5lLWNoYXJ0MiB4LWNvbXBvbmVudHMtY3JlYXRpb24tbWV0aG9kPSJbW19saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHktdmFsdWUtYWNjZXNzb3I9IltbX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnNdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWRdXSI+PC92ei1saW5lLWNoYXJ0Mj4KICAgIDxzdHlsZT4KICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9InRlbnNvci1uYW1lIiBvbi10YXA9InRlbnNvck5hbWVDYWxsYmFjayI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRlbnNvci1uYW1lLXRleHQiPltbdGVuc29yTmFtZV1dPC9zcGFuPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ2xvc2UiIG9uLXRhcD0iY2xvc2VCdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZvcndhcmQiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNvbnRpbnVlIHRvIiBvbi10YXA9ImNvbnRpbnVlVG9CdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0idGVuc29yLXZhbHVlLXZhbHVlLXRyIj4KICAgICAgICA8dGQ+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0idGVuc29yLXdpZGdldCI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9ImRlYnVnLW9wIj48L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlNsaWNpbmciIGlkPSJzbGljaW5nIiB2YWx1ZT0ie3tzbGljaW5nfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlRpbWUgSW5kaWNlcyIgaWQ9InRpbWUtaW5kaWNlcyIgdmFsdWU9Int7dGltZUluZGljZXN9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0idGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtYnV0dG9ucyIgb24tY2xpY2s9Il90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrIj5GdWxsIEhpc3Rvcnk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPC9kaXY+PC90ZW1wbGF0ZT48L3RkPjx0ZCBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSIgbGFiZWw9IlNjYWxhciBWYWx1ZSIgaWQ9InZhbHVlLXNjYWxhciIgdmFsdWU9IltbX2RhdGFTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlTGluZUNoYXJ0XV0iPgogICAgICAgICAgICAgICAgICA8dGYtZGVidWdnZXItbGluZS1jaGFydCBkYXRhPSJbW19saW5lQ2hhcnREYXRhXV0iPjwvdGYtZGVidWdnZXItbGluZS1jaGFydD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVJbWFnZV1dIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0idmFsdWUtaW1hZ2UiIGhlaWdodD0iMjUwcHgiIHdpZHRoPSIyNTBweCIgc3JjJD0iW1tfZGF0YUltYWdlU3JjXV0iPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAKICAgICAgICAgIAogICAgICAgIAogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0iZW5hYmxlQWxsU3RlcHNNb2RlVG9nZ2xlIiBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSI+CiAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgPGgyPgogICAgICAgIFN0ZXAgb2YgSGVhbHRoIFBpbGxzOgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IiBtaW49IjAiIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOjppbnB1dH19Ij4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIFtbX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlXV0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBpZD0iaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWF4U3RlcEluZGV4XV0iPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItcHJldmlldyIgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+CiAgICAgICAgICBBbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuCiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIAogICAgICAKICAgIAogIAogIAoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tbGlzdCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWF4LWRldmljZS1waXhlbC1yYXRpbzogMSkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIEBhcHBseSAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtncmlkXSkpICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxhcnJheS1zZWxlY3RvciBpZD0ic2VsZWN0b3IiIGl0ZW1zPSJ7e2l0ZW1zfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSXRlbXN9fSIgc2VsZWN0ZWQtaXRlbT0ie3tzZWxlY3RlZEl0ZW19fSI+PC9hcnJheS1zZWxlY3Rvcj4KCiAgICA8L3RlbXBsYXRlPjwvZG9tLW1vZHVsZT48ZGl2IGlkPSJpdGVtcyI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgoKICA8L3RlbXBsYXRlPgo8L3BhcGVyLW1hdGVyaWFsPjwvdGVtcGxhdGU+PC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tYm9keSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxzdmcgaGVpZ2h0PSIwIiB3aWR0aD0iMCIgaWQ9InN2Z0RlZnMiPgogICAgICA8ZGVmcz4KICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJzdW1tYXJ5LWljb24iIGZpbGw9IiM4NDg0ODQiIGhlaWdodD0iMTIiIHZpZXdib3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEyIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxMCAxMCI+CiAgICAgICAgPGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjMiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnIHdpZHRoJD0iW1toZWlnaHRdXSIgaGVpZ2h0JD0iW1toZWlnaHRdXSIgdmlld2JveD0iMCAwIDI0IDI0IiBmaWxsPSIjODQ4NDg0Ij4KICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgOCI+CiAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIgeD0iOCIgeT0iNCIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMzcgMTYiPgogICAgICAgIDxyZWN0IHg9IjEiIHk9IjEiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIgc3Ryb2tlLXdpZHRoPSIycHgiIGhlaWdodD0iMTQiIHdpZHRoPSIzNSIgcng9IjUiIHJ5PSI1IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU0VSSUVTJyldXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNiAxNSI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMiIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyF2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNCAxMCI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IiB4PSIwIiB5PSIxIiAvPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24gaWQ9Imljb24iIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iIGhlaWdodD0iW1toZWlnaHRdXSIgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIj48L3RmLWdyYXBoLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcgY2xhc3M9Im9wLWNvbXBhdCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDI1MCAyNSI+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0IGhlaWdodD0iMjUiIHdpZHRoPSIyNTAiIHJ4PSI1IiByeT0iNSIgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IiBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyI+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLmF0dHItcmlnaHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xMaW5lIHsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUtZ3JvdXAgewogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZSB7CiAgICAgICAgbWFyZ2luOiA1cHggNnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbyBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZmxhdC1ncmFwaD0iW1tncmFwaF1dIiBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSI+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSI+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6Omhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAvZGVlcC8gLmNsb3NlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxlZnQ6IDE1cHg7CiAgICAgICAgYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nIHsKICAgICAgICBjdXJzb3I6IHByb2dyZXNzOwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nLmVycm9yIHsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDVweDsKICAgICAgICB0b3A6IDVweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzODBweDsKICAgICAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgI21haW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc05vdENvbXBsZXRlKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRhaW5lckNsYXNzKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgICAgPHRmLWdyYXBoIGlkPSJncmFwaCIgZ3JhcGgtaGllcmFyY2h5PSJ7e2dyYXBoSGllcmFyY2h5fX0iIGJhc2ljLWdyYXBoPSJbW2dyYXBoXV0iIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iIHJlbmRlci1oaWVyYXJjaHk9Int7cmVuZGVySGllcmFyY2h5fX0iIGRldmljZXMtZm9yLXN0YXRzPSJbW2RldmljZXNGb3JTdGF0c11dIiBzdGF0cz0iW1tzdGF0c11dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBoaWdobGlnaHRlZC1ub2RlPSJ7e19oaWdobGlnaHRlZE5vZGV9fSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7Y29sb3JCeVBhcmFtc319IiBwcm9ncmVzcz0ie3twcm9ncmVzc319IiBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iIGVkZ2Utd2lkdGgtZnVuY3Rpb249IltbZWRnZVdpZHRoRnVuY3Rpb25dXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgaGFuZGxlLW5vZGUtc2VsZWN0ZWQ9IltbaGFuZGxlTm9kZVNlbGVjdGVkXV0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImluZm8iPgogICAgICAgIDx0Zi1ncmFwaC1pbmZvIGlkPSJncmFwaC1pbmZvIiB0aXRsZT0ic2VsZWN0ZWQiIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBncmFwaD0iW1tncmFwaF1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1ub2RlLWluY2x1ZGU9Int7X3NlbGVjdGVkTm9kZUluY2x1ZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tkZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IiBjb21wYXQtbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIgb24tbm9kZS10b2dnbGUtaW5jbHVzaW9uPSJfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCIgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplLCAxNnB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlIGluIGBhdHRhY2hlZGAuICovCiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZTogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplLCAtMXB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3JhZGlvQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOwogICAgICB9CgogICAgICAjaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgI2lua1tjaGVja2VkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8sICNvblJhZGlvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjI4czsKICAgICAgfQoKICAgICAgI29uUmFkaW8gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsIHsKICAgICAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBtYXJnaW4tbGVmdDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLWNoZWNrZWQ7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsOmRpcihydGwpIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgfQoKICAgICAgI3JhZGlvTGFiZWxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNyYWRpb0xhYmVsIHsKICAgICAgICAvKiBzbGlnaHRseSBkYXJrZXIgdGhhbiB0aGUgYnV0dG9uLCBzbyB0aGF0IGl0J3MgcmVhZGFibGUgKi8KICAgICAgICBvcGFjaXR5OiAwLjY1OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InJhZGlvQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ib2ZmUmFkaW8iPjwvZGl2PgogICAgICA8ZGl2IGlkPSJvblJhZGlvIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InJhZGlvTGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWdyb3VwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgei1pbmRleDogMTAwMjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC1iYWNrZ3JvdW5kLCAjNjE2MTYxKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC10ZXh0LWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVVcCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZURvd24gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZUluT3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZU91dE9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bkluIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25PdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmZhZGUtaW4tYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVJbk9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuZmFkZS1vdXQtYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlT3V0T3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtdXAtYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZVVwOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVEb3duOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bkluOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uLW91dCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duT3V0OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5jYW5jZWwtYW5pbWF0aW9uIHsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0zMHMgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogVGhhbmtzIElFIDEwLiAqLwoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW5vZGUtc2VhcmNoIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJzZWFyY2gtY29udGFpbmVyIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJydW5zLXJlZ2V4IiBsYWJlbD0iU2VhcmNoIG5vZGVzLiBSZWdleGVzIHN1cHBvcnRlZC4iIHZhbHVlPSJ7e19yYXdSZWdleElucHV0fX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1jb250cm9scyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA4cHggMCA4cHggMTBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jb2xvci1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDlweCAwIDAgMTNweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICB9CgogICAgICB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyB7CiAgICAgICAgcGFkZGluZzogMCAyMHB4IDIwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6ICM1NTU7CiAgICAgICAgcGFkZGluZzogMTVweCAyMHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIHN2Zy5pY29uLAogICAgICB0Zi1ncmFwaC1pY29uIHsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblZhbHVlcyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblN0YXJ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAuZG9tYWluRW5kIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgLmNvbG9yQm94IHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLmltYWdlLWljb24gewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLmhlbHAtaWNvbiB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuZ3JheSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIG1hcmdpbjogOHB4IDVweCA4cHggMDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CgogICAgICAuYnV0dG9uLXRleHQgewogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgLnVwbG9hZC1idXR0b24gewogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuYnV0dG9uLWljb24gewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIHdpZHRoOiAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciB7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgc3Bhbi5jb3VudGVyIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5ydW5zIHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAvKiogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyB0aGF0IHN1cHByZXNzIHBvaW50ZXIgZXZlbnRzIGZvciBkaXNhYmxlZCBidXR0b25zLiBPdGhlcndpc2UsIHRoZSAqLwogICAgICAvKiAgdG9vbHRpcHMgZG8gbm90IGFwcGVhci4gKi8KICAgICAgcGFwZXItcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBoZWxwOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgcGFwZXItdG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICB9CgogICAgICAvKiogT3RoZXJ3aXNlLCBwb2x5bWVyIFVJIGNvbnRyb2xzIGFwcGVhciBhdG9wIG5vZGUgc2VhcmNoLiAqLwogICAgICB0Zi1ncmFwaC1ub2RlLXNlYXJjaCB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDx0Zi1ncmFwaC1ub2RlLXNlYXJjaCBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIj48L3RmLWdyYXBoLW5vZGUtc2VhcmNoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi10YXA9Il9maXQiIGFsdD0iRml0IHRvIHNjcmVlbiI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImFzcGVjdC1yYXRpbyIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+Rml0IHRvIFNjcmVlbjwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tY2xpY2s9ImRvd25sb2FkIiBhbHQ9IkRvd25sb2FkIFBORyI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImZpbGUtZG93bmxvYWQiIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkRvd25sb2FkIFBORzwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8YSBocmVmPSIjIiBpZD0iZ3JhcGhkb3dubG9hZCIgY2xhc3M9InRpdGxlIiBkb3dubG9hZD0iZ3JhcGgucG5nIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBydW5zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICBSdW4gPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW2RhdGFzZXRzLmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFJ1bkluZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIGhvcml6b250YWwtYWxpZ249ImxlZnQiIG5vaW5rIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFnSW5kZXh9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+VXBsb2FkPC9kaXY+CiAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idXBsb2FkLWJ1dHRvbiIgb24tY2xpY2s9Il9nZXRGaWxlIiB0aXRsZT0iVXBsb2FkIGEgZ3JhcGggcGJ0eHQgZmlsZSB0byB2aWV3IHRoZSBncmFwaCI+CiAgICAgICAgICAgIENob29zZSBGaWxlCiAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGRlbi1pbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZSIgbmFtZT0iZmlsZSIgb24tY2hhbmdlPSJfdXBkYXRlRmlsZUlucHV0IiBhY2NlcHQ9Ii5wYnR4dCI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRHcmFwaFR5cGV9fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ib3BfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+R3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY29uY2VwdHVhbF9ncmFwaCIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkNvbmNlcHR1YWwgR3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0icHJvZmlsZSIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Qcm9maWxlPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3t0cmFjZUlucHV0c319IiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgY2xhc3M9InRpdGxlIj5TaG93IGhlYWx0aCBwaWxsczwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5Db2xvcjwvZGl2PgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJzdHJ1Y3R1cmUiPlN0cnVjdHVyZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGV2aWNlIj5EZXZpY2U8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIG5hbWU9InhsYV9jbHVzdGVyIiBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIj4KICAgICAgICAgICAgWExBIENsdXN0ZXIKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBYTEEgY2x1c3RlciBpcyBvbmx5IGVuYWJsZWQgaWYgYXQgbGVhc3QgMSBvcCBzcGVjaWZpZXMKICAgICAgICAgICAgYW4gWExBIGNsdXN0ZXIuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgbmFtZT0iY29tcHV0ZV90aW1lIiBkaXNhYmxlZD0iW1shc3RhdHNdXSI+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBjb21wdXRlIHRpbWUgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im1lbW9yeS1yYWRpby1idXR0b24iIG5hbWU9Im1lbW9yeSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBNZW1vcnkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9Im1lbW9yeS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iIG5hbWU9Im9wX2NvbXBhdGliaWxpdHkiPgogICAgICAgICAgICBUUFUgQ29tcGF0aWJpbGl0eQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IHdoZXRoZXIgYW4gb3BlcmF0aW9uIGlzIGNvbXBhdGlibGUgZm9yIHRoZSBUUFUgZGV2aWNlLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgPHNwYW4gY2xhc3M9InNwYWNlciI+PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzR3JhZGllbnRDb2xvcmluZyhzdGF0cywgY29sb3JCeSldXSI+CiAgICAgICAgICA8c3ZnIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIHN0eWxlPSJtYXJnaW46IDAgNXB4IiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgIDxsaW5lYXJncmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIj4KICAgICAgICAgICAgICAgIDxzdG9wIGNsYXNzPSJzdGFydCIgb2Zmc2V0PSIwJSIgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5zdGFydENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0iZW5kIiBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuZW5kQ29sb3JdXSIgLz4KICAgICAgICAgICAgICA8L2xpbmVhcmdyYWRpZW50PgogICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMzUiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIiBzdHJva2U9ImJsYWNrIiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5WYWx1ZXMgY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblN0YXJ0Ij5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWluVmFsdWVdXTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5FbmQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5tYXhWYWx1ZV1dPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxiciBzdHlsZT0iY2xlYXI6IGJvdGgiPgogICAgICAgICAgPGRpdj5EZXZpY2VzIGluY2x1ZGVkIGluIHN0YXRzOjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGV2aWNlTGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VzXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3cgZGV2aWNlcy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICA8c3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlJD0iW1tpdGVtLmRldmljZV1dIiBjaGVja2VkJD0iW1tpdGVtLnVzZWRdXSIgb24tY2xpY2s9Il9kZXZpY2VDaGVja2JveENsaWNrZWQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPltbaXRlbS5zdWZmaXhdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpdGVtLmlnbm9yZWRNc2ddXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwIiBjbGFzcz0iaGVscC1pY29uIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCIgYW5pbWF0aW9uLWRlbGF5PSIwIj5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3N0cnVjdHVyZScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+CiAgICAgICAgICAgICAgICBjb2xvcnMKICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+c2FtZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZWVlIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmlxdWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ2RldmljZScpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZVBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IltbaXRlbS5jb2xvcl1dIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS5kZXZpY2VdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBkZXZpY2U8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAneGxhX2NsdXN0ZXInKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI3VuZmlsbGVkLXJlY3QiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOltbaXRlbS5jb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0ueGxhX2NsdXN0ZXJdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNncmV5LXJlY3QiIHg9IjAiIHk9IjAiIC8+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBYTEEgY2x1c3Rlcjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiMwZjlkNTgiIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPlZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNkYjQ0MzciIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPkludmFsaWQgT3A8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0YXRzTm90TnVsbChzdGF0cyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmFkZWQ+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bnVzZWQgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZUxlZ2VuZE9wZW4iIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLWJ1dHRvbiI+CiAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLXRleHQiPgogICAgICAgIFtbX2dldFRvZ2dsZVRleHQoX2xlZ2VuZE9wZW5lZCldXQogICAgICA8L3NwYW4+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbGVnZW5kT3BlbmVkXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0idGl0bGUiPkdyYXBoPC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBub2Rlcy4gTmFtZXNwYWNlIGlzIGhpZXJhcmNoaWNhbCBhbmQKICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgcGVyZm9ybXMgYW4gb3BlcmF0aW9uLiBUaGVzZSBub2RlcyBjYW5ub3QgZXhwYW5kLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iU0VSSUVTIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBVbmNvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiIgdmVydGljYWw+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG9mIG51bWJlcmVkIG5vZGVzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiI+CiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzg0ODQ4NCIgY3g9IjEwIiBjeT0iMTAiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IG91dHB1dHMgYSBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCIgZmlsbD0iI2JiYiIgbWFya2Vyd2lkdGg9IjEwIiBtYXJrZXJoZWlnaHQ9IjEwIiByZWZ4PSI5IiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgPHBhdGggbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB1bmxlc3MgYXJyb3doZWFkcyBzcGVjaWZ5IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLCAyIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY3kgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNGRkI3NEQiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjcmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQpIiBzdHJva2U9IiNGRkI3NEQiIGQ9Ik0yIDkgbCAyOSAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoYXQgdGhlIG91dGdvaW5nIG9wZXJhdGlvbiBub2RlIGNhbiBtdXRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFzZXRzU3RhdGUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCAnRU1QVFknKV1dIj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1NDBweDsgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOyI+CiAgICAgICAgPGgzPk5vIGdyYXBoIGRlZmluaXRpb24gZmlsZXMgd2VyZSBmb3VuZC48L2gzPgogICAgICAgIDxwPgogICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgIDxjb2RlPnRmLnN1bW1hcnkuRmlsZVdyaXRlcjwvY29kZT4KICAgICAgICAgIGFuZCBwYXNzIHRoZSBncmFwaCBlaXRoZXIgdmlhIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgY2FsbGluZyBpdHMKICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9ncmFwaF92aXoiPmdyYXBoIHZpc3VhbGl6ZXIgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ1BSRVNFTlQnKV1dIj4KICAgICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzIGlkPSJjb250cm9scyIgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiIGRldmljZXMtZm9yLXN0YXRzPSJ7e19kZXZpY2VzRm9yU3RhdHN9fSIgY29sb3ItYnktcGFyYW1zPSJbW19jb2xvckJ5UGFyYW1zXV0iIHN0YXRzPSJbW19zdGF0c11dIiBjb2xvci1ieT0ie3tfY29sb3JCeX19IiBkYXRhc2V0cz0iW1tfZGF0YXNldHNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iIHNlbGVjdGlvbj0ie3tfc2VsZWN0aW9ufX0iIHNlbGVjdGVkLWZpbGU9Int7X3NlbGVjdGVkRmlsZX19IiBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIgaGVhbHRoLXBpbGxzLWZlYXR1cmUtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBoZWFsdGgtcGlsbHMtdG9nZ2xlZC1vbj0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBvbi1maXQtdGFwPSJfZml0IiB0cmFjZS1pbnB1dHM9Int7X3RyYWNlSW5wdXRzfX0iPjwvdGYtZ3JhcGgtY29udHJvbHM+CiAgICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgICAgPHRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIgaWQ9ImxvYWRlciIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHNlbGVjdGlvbj0iW1tfc2VsZWN0aW9uXV0iIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIiBvdXQtZ3JhcGgtaGllcmFyY2h5PSJ7e19ncmFwaEhpZXJhcmNoeX19IiBvdXQtZ3JhcGg9Int7X2dyYXBofX0iIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIgcHJvZ3Jlc3M9Int7X3Byb2dyZXNzfX0iIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIiBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSI+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgICAgPHRmLWdyYXBoLWJvYXJkIGlkPSJncmFwaGJvYXJkIiBkZXZpY2VzLWZvci1zdGF0cz0iW1tfZGV2aWNlc0ZvclN0YXRzXV0iIGNvbG9yLWJ5PSJbW19jb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0ie3tfY29sb3JCeVBhcmFtc319IiBncmFwaC1oaWVyYXJjaHk9IltbX2dyYXBoSGllcmFyY2h5XV0iIGdyYXBoPSJbW19ncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgcHJvZ3Jlc3M9IltbX3Byb2dyZXNzXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbX2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tfZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW19ub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IiBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1tfaGVhbHRoUGlsbFN0ZXBJbmRleF1dIiByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIHN0YXRzPSJbW19zdGF0c11dIiB0cmFjZS1pbnB1dHM9IltbX3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGgtYm9hcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1kaXN0cmlidXRpb24tY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICAKICAgIDx2ei1kaXN0cmlidXRpb24tY2hhcnQgaWQ9ImNoYXJ0IiB4LXR5cGU9IltbeFR5cGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSI+PC92ei1kaXN0cmlidXRpb24tY2hhcnQ+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0idG9vbHRpcCI+PHNwYW4+PC9zcGFuPjwvZGl2PgogICAgPHN2ZyBpZD0ic3ZnIj4KICAgICAgPGc+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeCI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5IHNsaWNlIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InN0YWdlIj4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJiYWNrZ3JvdW5kIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGNsYXNzPSJ4LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9Inktc2xpY2UtYXhpcy1ob3ZlciI+PC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBmb250LWZhbWlseTogcm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktYXhpcy1ob3ZlciByZWN0LAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICB9CgogICAgICAuYXhpcyB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuYXhpcyBwYXRoLmRvbWFpbiB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgfQoKICAgICAgLmF4aXMgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMjsKICAgICAgfQoKICAgICAgLnNtYWxsIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmZpcnN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmxhc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgaWQ9ImNoYXJ0IiB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIiBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIj48L3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib2Zmc2V0Ij5vZmZzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHJ1bj0iW1tydW5dXSIgdGFnPSJbW3RhZ11dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGlkPSJzdGVwcy1jb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgc2Nyb2xsYmFyIiBzdHlsZT0iYm9yZGVyLWNvbG9yOiBbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAzcHggM3B4IDNweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OyAvKiB0byBjb3JyZWN0IGZvciBib3JkZXIgKi8KICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtY29udGFpbmVyOm5vdCg6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGV4dC1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgdGV4dCBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBydW49IltbaXRlbS5ydW5dXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLXRleHQtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSI+PC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW195VmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSIgZGVmYXVsdC14LXJhbmdlPSJbW19kZWZhdWx0WFJhbmdlXV0iIGRlZmF1bHQteS1yYW5nZT0iW1tfZGVmYXVsdFlSYW5nZV1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgZGF0YS1zZXJpZXM9IltbcnVuc11dIiBsb2FkLWtleT0iW1t0YWddXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbX2RhdGFVcmxdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIj48L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CgogICAgPGRpdiBpZD0iYnV0dG9ucy1yb3ciPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IlJlc2V0IGF4ZXMgdG8gWzAsIDFdLiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN0ZXAtbGVnZW5kIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTdGVwQXZhaWxhYmxlXV0iIGFzPSJydW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItYm94IiBzdHlsZT0iYmFja2dyb3VuZDogW1tfY29tcHV0ZVJ1bkNvbG9yKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgW1tydW5dXSBpcyBhdAogICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtbGFiZWwtdGV4dCI+CiAgICAgICAgICAgIHN0ZXAgW1tfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKF9ydW5Ub1ByQ3VydmVFbnRyeSwgcnVuKV1dIDwvc3Bhbj48YnI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0id2FsbC10aW1lLWxhYmVsLXRleHQiPgogICAgICAgICAgICAoW1tfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSkKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgICNzdGVwLWxlZ2VuZCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY29sb3ItYm94IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQogICAgICAuc3RlcC1sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAud2FsbC10aW1lLWxhYmVsLXRleHQgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLWNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLXRleHQiPgogICAgICAgICAgICBbW3J1bl1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIFtbX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgsCiAgICAgICAgICBydW4sIHRpbWVEaXNwbGF5VHlwZSldXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1zbGlkZXIgZGF0YS1ydW4kPSJbW3J1bl1dIiBzdGVwPSIxIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSJbW19jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIHJ1bildXSIgdmFsdWU9IltbX2dldFN0ZXAoX3J1blRvU3RlcEluZGV4LCBydW4pXV0iIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIj48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lLXR5cGUtc2VsZWN0b3IiIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIiBzZWxlY3RlZC1pZD0ie3tfdGltZURpc3BsYXlUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICA8dGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IgcnVucz0iW1tfcmVsZXZhbnRTZWxlY3RlZFJ1bnNdXSIgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IiBydW4tdG8tYXZhaWxhYmxlLXRpbWUtZW50cmllcz0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIiB0aW1lLWRpc3BsYXktdHlwZT0iW1tfdGltZURpc3BsYXlUeXBlXV0iPjwvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcHJlY2lzaW9u4oCTcmVjYWxsIGN1cnZlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtcHItY3VydmUtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bnM9IltbaXRlbS5ydW5zXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVucywgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVuLXRvLXN0ZXAtY2FwPSJbW19ydW5Ub1N0ZXBdXSI+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIAogICAgICA8dGV4dGFyZWEgaWQ9ImNvbW1hbmRUZXh0YXJlYSIgcmVhZG9ubHkgcm93cz0iMSIgb24tYmx1cj0iX3JlbW92ZUNvcGllZE1lc3NhZ2UiPgpbW19pbnN0YWxsQ29tbWFuZF1dPC90ZXh0YXJlYT4KICAgICAgPGRpdiBpZD0iY29weUNvbnRhaW5lciI+CiAgICAgICAgPHNwYW4gaWQ9ImNvcGllZE1lc3NhZ2UiPjwvc3Bhbj4KICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBvbi10YXA9Il9jb3B5SW5zdGFsbENvbW1hbmQiPkNvcHkgdG8gY2xpcGJvYXJkPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICAubWVzc2FnZSB7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgIH0KICAgICAgI2NvbW1hbmRUZXh0YXJlYSB7CiAgICAgICAgbWFyZ2luLXRvcDogMWV4OwogICAgICAgIHBhZGRpbmc6IDFleCAxZW07CiAgICAgICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjY29weUNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAjY29waWVkTWVzc2FnZSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcGx1Z2luLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBtb2RhbCBvcGVuZWQ9Int7X29wZW59fSIgd2l0aC1iYWNrZHJvcD0iW1tfdXNlTmF0aXZlQmFja2Ryb3BdXSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8c3R5bGU+CiAgICAgIC8qKiBXZSByZWx5IG9uIGEgc2VwYXJhdGUgYF9oaWRkZW5gIHByb3BlcnR5IGluc3RlYWQgb2YgZGlyZWN0bHkgbWFraW5nIHVzZQogICAgICAgICAgb2YgdGhlIGBfb3BlbmAgYXR0cmlidXRlIGJlY2F1c2UgdGhpcyBDU1Mgc3BlY2lmaWNhdGlvbiBtYXkgc3RyYW5nZWx5CiAgICAgICAgICBhZmZlY3Qgb3RoZXIgZWxlbWVudHMgdGhyb3VnaG91dCBUZW5zb3JCb2FyZC4gU2VlICM4OTkuICovCiAgICAgICNkYXNoYm9hcmQtYmFja2Ryb3AgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLXZpZGVvIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8aW1nIGlkPSJ2aWRlbyIgc3JjJD0iW1tfaW1hZ2VVUkxdXSI+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIGltZyB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaXRlbXNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taW5mbyIgc3R5bGUkPSJoZWlnaHQ6IFtbaXRlbS5oZWlnaHRdXXB4Ij4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+W1tpdGVtLm5hbWVdXTwvbGk+CiAgICAgICAgICA8bGk+c2hhcGU6IFtbaXRlbS5zaGFwZV1dPC9saT4KICAgICAgICAgIDxsaT5yYW5nZTogWyBbW2l0ZW0ubWluXV0sIFtbaXRlbS5tYXhdXSBdPC9saT4KICAgICAgICAgIDxsaT5tZWFuOiBbW2l0ZW0ubWVhbl1dPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1pbmZvIHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQogICAgICAuc2VjdGlvbi1pbmZvIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJjb250cm9scy1kaXNhYmxlZC1tZXNzYWdlIj4KICAgICAgICAgICAgICBDb250cm9scyBkaXNhYmxlZDogZGlyZWN0b3J5IGlzIG5vdCB3cml0ZWFibGUuCiAgICAgICAgICAgIAogICAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgICAgQmVob2xkZXIgcmVxdWlyZXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBsb2cgZGlyZWN0b3J5IGluIG9yZGVyIHRvCiAgICAgICAgICAgICAgY29tbXVuaWNhdGUgdmlzdWFsaXphdGlvbiBjaGFuZ2VzIHRvIHRoZSA8Y29kZT5CZWhvbGRlcjwvY29kZT4KICAgICAgICAgICAgICBpbnN0YW5jZSBpbiB5b3VyIG1vZGVsLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5WYWx1ZXM8L2gzPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2YWx1ZXNTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3ZhbHVlc319Ij4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cmFpbmFibGVfdmFyaWFibGVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT50Zi50cmFpbmFibGVfdmFyaWFibGVzKCk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1hcnJheXMiIG5hbWU9ImFycmF5cyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoYXJyYXlzPVtOUF9BUlJBWVNdKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWZyYW1lcyIgbmFtZT0iZnJhbWVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShmcmFtZT1OUF9BUlJBWSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93QWxsfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj5TaG93IGFsbCBkYXRhIDxpPihjYW4gYmUgcmVzb3VyY2UgaW50ZW5zaXZlKTwvaT48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5Nb2RlPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJtb2RlU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19tb2RlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VycmVudCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZXMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InZhcmlhbmNlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICB2YXJpYW5jZSBvdmVyIHRyYWluIHN0ZXBzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFyaWFuY2VTZWxlY3RlZChfbW9kZSldXSI+CiAgICAgICAgICAgICAgPGg0PlZhcmlhbmNlIHRpbWVzdGVwczoge3tfd2luZG93U2l6ZX19PC9oND4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJ3aW5kb3dTbGlkZXIiIHZhbHVlPSJ7e193aW5kb3dTaXplfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIyIiBtYXg9IjIwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5JbWFnZSBzY2FsaW5nPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJzY2FsaW5nU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19zY2FsaW5nfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1sYXllciIgbmFtZT0ibGF5ZXIiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbGF5ZXIiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgbG93ZXN0IHZhbHVlIGluIHRoYXQgc2VjdGlvbiwgd2hpdGUgaXMgdGhhdCBsYXJnZXN0CiAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24uCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbmV0d29yayIgbmFtZT0ibmV0d29yayIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgYWxsIHNlY3Rpb25zCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbmV0d29yayIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMsIHdoaXRlIGlzIHRoZQogICAgICAgICAgICAgICAgbGFyZ2VzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwiPkNvbG9ybWFwOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2NvbG9ybWFwfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bWFnbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmluZmVybm88L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnBsYXNtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+dmlyaWRpczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Z3JheXNjYWxlPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlVwZGF0ZXMgcGVyIHNlY29uZDoge3tfRlBTfX08L2gzPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iRlBTU2xpZGVyIiB2YWx1ZT0ie3tfRlBTfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIwIiBtYXg9IjMwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJyZWNvcmRfYnV0dG9uIiBvbi10YXA9Il90b2dnbGVSZWNvcmQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICBbW19yZWNvcmRUZXh0XV0KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc19hY3RpdmVdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gQmVob2xkZXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KCiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3VyIHNjcmlwdCBpc24ndCBydW5uaW5nLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBhcmVuJ3QgY2FsbGluZyA8Y29kZT5iZWhvbGRlci51cGRhdGUoKTwvY29kZT4uPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIHVzZSBCZWhvbGRlciwgaW1wb3J0IGFuZCBpbnN0YW50aWF0ZSB0aGUKICAgICAgICAgICAgICA8Y29kZT5CZWhvbGRlcjwvY29kZT4gY2xhc3MsIGFuZCBjYWxsIGl0cwogICAgICAgICAgICAgIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kIHdpdGggYSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBhcmd1bWVudAogICAgICAgICAgICAgIGFmdGVyIGV2ZXJ5IHRyYWluIHN0ZXA6CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVyCmJlaG9sZGVyID0gQmVob2xkZXIoTE9HX0RJUkVDVE9SWSkKCiMgaW5zaWRlIHRyYWluIGxvb3AKYmVob2xkZXIudXBkYXRlKAogIHNlc3Npb249c2VzcywKICBhcnJheXM9bGlzdF9vZl9ucF9hcnJheXMsICAjIG9wdGlvbmFsIGFyZ3VtZW50CiAgZnJhbWU9dHdvX2RpbWVuc2lvbmFsX25wX2FycmF5LCAgIyBvcHRpb25hbCBhcmd1bWVudAopPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHVzaW5nIDxjb2RlPnRmLnRyYWluLk1vbml0b3JlZFNlc3Npb248L2NvZGU+LCB5b3UgY2FuIHVzZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVySG9vazwvY29kZT46CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVySG9vawpiZWhvbGRlcl9ob29rID0gQmVob2xkZXJIb29rKExPR19ESVJFQ1RPUlkpCndpdGggTW9uaXRvcmVkU2Vzc2lvbiguLi4sIGhvb2tzPVtiZWhvbGRlcl9ob29rXSkgYXMgc2VzczoKICBzZXNzLnJ1bih0cmFpbl9vcCk8L3ByZT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBldmVyeXRoaW5nIGlzIHNldCB1cCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL3RlbnNvcmJvYXJkL3BsdWdpbnMvYmVob2xkZXIvUkVBRE1FLm1kIj50aGUgUkVBRE1FPC9hPgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBOb3RlOiBCZWhvbGRlciBjdXJyZW50bHkgb25seSB3b3JrcyB3ZWxsIG9uIGxvY2FsIGZpbGUgc3lzdGVtcy4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDx0Zi1iZWhvbGRlci12aWRlbyBpZD0idmlkZW8iIGZwcz0iW1tfRlBTXV0iPjwvdGYtYmVob2xkZXItdmlkZW8+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHRmLWJlaG9sZGVyLWluZm8gaWQ9ImluZm8iIGZwcz0iW1tfRlBTXV0iPiA8L3RmLWJlaG9sZGVyLWluZm8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogNXB4OwoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1yYWRpby1jb250YWluZXI6IHsKICAgICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcHJlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2QzMmYyZjsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24uaXMtcmVjb3JkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZDMyZjJmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbi5iZWhvbGRlci1kYXNoYm9hcmQ6bGFzdC1jaGlsZCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgfQoKICAgICAgcC5kaXNjbGFpbWVyIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIHAuY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICNjMDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1xdWVyeS1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gaHlwZXJwYXJhbWV0ZXJzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5IeXBlcnBhcmFtZXRlcnM8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ocGFyYW1zfX0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IiBjbGFzcz0iaHBhcmFtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICBbW19wcmV0dHlQcmludChpdGVtLnZhbHVlKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIucmVnZXhwXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBtZXRyaWNzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NZXRyaWNzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfbWV0cmljc319IiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iIGNsYXNzPSJtZXRyaWMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlN0YXR1czwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICBbW3N0YXR1cy5kaXNwbGF5TmFtZV1dCiAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0ic29ydGluZy1wYWdpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaHBhcmFtc11dIiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iRGlyZWN0aW9uIiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+QXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9InBhZ2luZy1kb3dubG9hZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gcGFnaW5nIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYWdpbmc8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgTnVtYmVyIG9mIG1hdGNoaW5nIHNlc3Npb24gZ3JvdXBzOgogICAgICAgICAgICAgICAgW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUGFnZSAjIiB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD0ic3VmZml4IiBjbGFzcz0icGFnZS1zdWZmaXgiPgogICAgICAgICAgICAgICAgICAgIC8gW1tfcGFnZUNvdW50U3RyXV0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2Utc2l6ZS1pbnB1dCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCAjIG9mIHNlc3Npb24gZ3JvdXBzIHBlciBwYWdlOiIgdmFsdWU9Int7X3BhZ2VTaXplSW5wdXQudmFsdWV9fSIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05XSIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tfcGFnZVNpemVJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICA8YSBpZD0iY3N2TGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuY3N2IiBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5DU1Y8L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJqc29uTGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuanNvbiIgaHJlZj0iW1tfanNvblVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iPkpTT048L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJsYXRleExpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIgaHJlZj0iW1tfbGF0ZXhVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5MYVRlWDwvYT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAucGFuZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweCA1cHggMTBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgI2h5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiA3MCU7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuaHlwZXJwYXJhbWV0ZXJzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAjc29ydGluZy1wYWdpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IDMwJTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3BhZ2luZy1kb3dubG9hZCB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuc29ydGluZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRvd25sb2FkIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3gsCiAgICAgIC5tZXRyaWMtY2hlY2tib3gsCiAgICAgIC5ocGFyYW0tY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5kaXNjcmV0ZS12YWx1ZS1jaGVja2JveCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICAgIH0KICAgICAgLmhwYXJhbSwKICAgICAgLm1ldHJpYyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmlubGluZS1lbGVtZW50IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgICAucGFnZS1udW1iZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgIH0KICAgICAgLnBhZ2Utc2l6ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDYwJTsKICAgICAgfQogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgICAucGFnZS1zdWZmaXggewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tcGFnZXMiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbGlua10pIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KC5pcm9uLXNlbGVjdGVkKSkgPiAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDAuODsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdGFiLWluaywgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50ID4gOjpzbG90dGVkKGEpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItdGFicyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiIC8+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWJzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKCiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiczsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTsKICAgICAgfQoKICAgICAgI3RhYnNDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC1tb3otZmxleC1iYXNpczogYXV0bzsKICAgICAgICAtbXMtZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGVudDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQ6bm90KC5zY3JvbGxhYmxlKSwKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgLyogSUUgLSBwcmV2ZW50IHRhYnMgZnJvbSBjb21wcmVzc2luZyB3aGVuIHRoZXkgc2hvdWxkIHNjcm9sbC4gKi8KICAgICAgICAtbXMtZmxleDogMSAwIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDAgYXV0bzsKICAgICAgICBmbGV4OiAxIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLm5vdC12aXNpYmxlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvciwgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmFsaWduLWJvdHRvbSB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5leHBhbmQgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMTVzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmNvbnRyYWN0IHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgPiA6OnNsb3R0ZWQoOm5vdCgjc2VsZWN0aW9uQmFyKSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLWxlZnQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9sZWZ0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25MZWZ0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICAgIDxkaXYgaWQ9InRhYnNDb250YWluZXIiIG9uLXRyYWNrPSJfc2Nyb2xsIiBvbi1kb3duPSJfZG93biI+CiAgICAgIDxkaXYgaWQ9InRhYnNDb250ZW50IiBjbGFzcyQ9IltbX2NvbXB1dGVUYWJzQ29udGVudENsYXNzKHNjcm9sbGFibGUsIGZpdENvbnRhaW5lcildXSI+CiAgICAgICAgPGRpdiBpZD0ic2VsZWN0aW9uQmFyIiBjbGFzcyQ9IltbX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzcyhub0JhciwgYWxpZ25Cb3R0b20pXV0iIG9uLXRyYW5zaXRpb25lbmQ9Il9vbkJhclRyYW5zaXRpb25FbmQiPjwvZGl2PgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLXJpZ2h0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfcmlnaHRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vblJpZ2h0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIGAudG9vbGJhci10b29sc2AgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKG1pZGRsZUp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJtaWRkbGUiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImJvdHRvbUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICAKICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNvbG9yIGJ5IiBpZD0iY29sb3JCeURyb3BEb3duTWVudSIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e29wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4fX0iIGlkPSJjb2xvckJ5TGlzdEJveCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIiBhcz0iY29sdW1uIiBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGlzYWJsZWQ9IltbIV9pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KCiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+CiAgICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJzY2FsZS1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7Y29sdW1uLnNjYWxlfX0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibG9nU2NhbGVCdXR0b25fW1tjb2x1bW4ubmFtZV1dIiBuYW1lPSJMT0ciIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSI+CiAgICAgICAgICAgICAgICAgICAgTG9nYXJpdGhtaWMKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iUVVBTlRJTEUiPgogICAgICAgICAgICAgICAgICAgIFF1YW50aWxlCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5jb2x1bW4gewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLmNvbHVtbi10aXRsZSB7CiAgICAgICAgLyogRml0IGV2ZXJ5IHRpdGxlIGluIG9uZSBsaW5lIHNvIHRoZSByYWRpbyBib3hlcyBhbGlnbiB2ZXJ0aWNhbGx5LiAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgLmNvbHVtbnMtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgLnNjYWxlLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W2FjdGl2ZV0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1hY3RpdmUtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0YWJsZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICB6LWluZGV4OiAtMjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbaW9zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHsKICAgICAgICAvKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiDigJhub25l4oCZIGZvciB0aGUgdHJhbnNmb3JtIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGJvdGggYSBzdGFja2luZyBjb250ZXh0IGFuZAogICAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtYm9keSNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuY2VsbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxcHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTFlbTsKICAgICAgfQoKICAgICAgLmNlbGxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jb2x1bW5zXV0iIGFzPSJjb2x1bW4iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXItY2VsbCBjbGFzcz0iY2VsbCIgY29sdW1uPSJbW2NvbHVtbl1dIj4mbmJzcDs8L3ZhYWRpbi1ncmlkLXNpemVyLWNlbGw+CiAgICA8L3RlbXBsYXRlPgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIEFuaW0gKi8KICAgICAgQGtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgdmFhZGluLWdyaWQtc3Bpbi0zNjAgewogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDNBOUY0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtbG9hZGluZy1zcGlubmVyKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xvYWRpbmddKSAjc3Bpbm5lciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNpdGVtcyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImFsbG93ZWQiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAwLjk1OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2lvc11bY29sdW1uLXJlc2l6aW5nXSkgI291dGVyc2Nyb2xsZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNmaXhlZHNpemVyLAogICAgICAjb3V0ZXJzaXplciB7CiAgICAgICAgYm9yZGVyLXRvcDogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAjdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjdGFibGVbb3ZlcmZsb3ctaGlkZGVuXSwKICAgICAgI291dGVyc2Nyb2xsZXJbb3ZlcmZsb3ctaGlkZGVuXSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtc2l6ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpemVyd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IC0xMDA7CiAgICAgIH0KCiAgICAgICNyZW9yZGVyZ2hvc3QgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4pLAogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uLWdyb3VwKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogRGVmYXVsdCBib3JkZXJzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93Om5vdChbbGFzdHJvd10pIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIFtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVzaXplIGhhbmRsZSAqLwoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8qIENlbGxzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1oZWFkZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb290ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgW29kZF0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1vZGQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbC1sYXN0LWZyb3plbik7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlOm5vdChbc2Nyb2xsaW5nXSkgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93OmhvdmVyIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1ob3Zlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbC52YWFkaW4tZ3JpZC1jZWxsW2xhc3Rjb2x1bW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXNlbGVjdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHZhYWRpbi1ncmlkLXRhYmxlIGlkPSJzY3JvbGxlciIgbG9hZGluZyQ9IltbX2xvYWRpbmddXSIgYmluZC1kYXRhPSJbW19iaW5kRGF0YV1dIiBzaXplPSJbW3NpemVdXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSIgcm93LWRldGFpbHMtdGVtcGxhdGU9IltbX3Jvd0RldGFpbHNUZW1wbGF0ZV1dIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIGlkPSJoZWFkZXIiIHNsb3Q9ImhlYWRlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IGlkPSJpdGVtcyIgc2xvdD0iaXRlbXMiPjwvdmFhZGluLWdyaWQtdGFibGUtYm9keT4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciBpZD0iZm9vdGVyIiBzbG90PSJmb290ZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyPgoKICAgICAgCiAgICAgIDxzbG90IG5hbWU9ImZvb3RlckZvY3VzVHJhcCI+PC9zbG90PgoKICAgICAgCiAgICAgIAogICAgICA8c2xvdD48L3Nsb3Q+CgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCBpZD0iZm9vdGVyRm9jdXNUcmFwIiBzbG90PSJmb290ZXJGb2N1c1RyYXAiIG9uLWZvY3VzLWdhaW5lZD0iX29uRm9vdGVyRm9jdXMiIG9uLWZvY3VzLWxvc3Q9Il9vbkZvY3Vzb3V0Ij4KICAgICAgPC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwPgogICAgPC92YWFkaW4tZ3JpZC10YWJsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tZ3JpZCBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+VHJpYWwgSUQ8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPltbaXRlbS5uYW1lXV08L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VuYWJsZVNob3dNZXRyaWNzXV0iPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iNWVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tleHBhbmRlZH19Ij4KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIiBhcz0iaHBhcmFtSW5mbyIgaW5kZXgtYXM9ImhwYXJhbUluZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cEhQYXJhbShpdGVtLCBocGFyYW1JbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIgYXM9Im1ldHJpY0luZm8iIGluZGV4LWFzPSJtZXRyaWNJbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpY0luZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBNZXRyaWMoaXRlbSwgbWV0cmljSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGNsYXNzPSJyb3ctZGV0YWlscyI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tpdGVtXV0iIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIAogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9IltbX3NpbmdsZXRvblNlc3Npb25Hcm91cHMoc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iPgogICAgICA8ZGl2PgogICAgICAgIENsaWNrIG9yIGhvdmVyIG92ZXIgYSBzZXNzaW9uIGdyb3VwIHRvIGRpc3BsYXkgaXRzIHZhbHVlcyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLW1haW4iPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lIGlkPSJxdWVyeS1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249Int7X2NvbmZpZ3VyYXRpb259fSIgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSBpZD0ic2Vzc2lvbnMtcGFuZSIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICA8L2Rpdj4KICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDx0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciBpZD0idHJhY2tlciIgdHJhY2tpbmctaWQ9IltbdHJhY2tpbmdJZF1dIiBuYW1lPSJ0Zl9ocGFyYW1zIj4KICAgIDwvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXI+CgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tZXNoLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBjb2xvcj0iW1tfcnVuQ29sb3JdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWhlYWRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzKG9mU2FtcGxlcyldXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX2dldFNhbXBsZVRleHQoc2FtcGxlKV1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcChfc3RlcHMpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+W1t0b0xvY2FsZVN0cmluZ18oX3N0ZXBWYWx1ZSldXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNNZXNoTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcyldXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iIG1heC1tYXJrZXJzPSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFweDsKICAgICAgfQogICAgICAudGYtbWVzaC1sb2FkZXItaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwNXB4OwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9Im1lc2gtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgIDxoMyBjbGFzcz0idGl0bGUiPlBvaW50IG9mIHZpZXc8L2gzPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRWaWV3fX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImFsbC1yYWRpby1idXR0b24iIG5hbWU9ImFsbCI+CiAgICAgICAgICAgICAgICBEaXNwbGF5IGFsbCBwb2ludHMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iYWxsLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgWm9vbSBhbmQgY2VudGVyIGNhbWVyYSB0byBkaXNwbGF5IGFsbCBwb2ludHMgYXQgb25jZS4gTm90ZSwgdGhhdAogICAgICAgICAgICAgICAgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlIHZpc2libGUuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InVzZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ1c2VyIj4KICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ic2hhcmUtcmFkaW8tYnV0dG9uIiBuYW1lPSJzaGFyZSI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ic2hhcmUtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQgYW1vbmcgYWxsIGNhbWVyYXMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHBvaW50IGNsb3VkIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcG9pbnQgY2xvdWQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbWVzaC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBzZWxlY3RlZC12aWV3PSJbW19zZWxlY3RlZFZpZXddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1jb250YWluZXIiIG9uLWNhbWVyYS1wb3NpdGlvbi1jaGFuZ2U9Il9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCI+CiAgICAgICAgICAgICAgICA8L3RmLW1lc2gtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gaDMudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgdGYtcnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCBoMy50aXRsZSB7CiAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAudmlldy1jb250cm9sIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLyogTGF5b3V0IG11c3QgYmUgaG9yaXpvbnRhbCwgaS5lLiBpdGVtcyBhcnJhbmdlZCBpbiBhIHJvdy4gSWYgaXRlbXMgY2Fubm90IGZpdCBpbiBhIHJvdywKICAgICAgICogdGhleSBzaG91bGQgYmUgbW92ZWQgdG8gbmV4dCBsaW5lLiBBbGwgaXRlbXMgbXVzdCBiZSBzcXVhcmUgYXQgYWxsIHRpbWVzLiBNaW5pbXVtIHNpemUgb2YKICAgICAgICogdGhlIGl0ZW0gaXMgNDgwcHguIFRoaXMgbWVhbnMgdGhhdCBtYXhpbXVtIHNpemUgb2YgdGhlIGl0ZW0gbXVzdCBiZSA0ODBweCArIDQ3OXB4ID0gOTU5cHguCiAgICAgICAqICovCiAgICAgIC5ob3Jpem9udGFsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIHRmLW1lc2gtbG9hZGVyIHsKICAgICAgICB3aWR0aDogNDgwcHg7CiAgICAgICAgZmxleC1iYXNpczogNDgwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0ic2V0dGluZ3MiPgogICAgICA8aDI+U2V0dGluZ3M8L2gyPgogICAgICA8cGFwZXItY2hlY2tib3ggaWQ9ImF1dG8tcmVsb2FkLWNoZWNrYm94IiBjaGVja2VkPSJ7e2F1dG9SZWxvYWRFbmFibGVkfX0iPgogICAgICAgIFJlbG9hZCBkYXRhIGV2ZXJ5IDxzcGFuPltbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dPC9zcGFuPnMuCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnaW5hdGlvbkxpbWl0SW5wdXQiIGxhYmVsPSJQYWdpbmF0aW9uIGxpbWl0IiBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBtaW49IjEiIHN0ZXA9IjEiIG9uLWNoYW5nZT0iX3BhZ2luYXRpb25MaW1pdENoYW5nZWQiIG9uLXZhbHVlLWNoYW5nZWQ9Il9wYWdpbmF0aW9uTGltaXRWYWxpZGF0ZSI+PC9wYXBlci1pbnB1dD4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgaWQ9InRvb2xiYXIiIHNsb3Q9ImhlYWRlciIgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgPGRpdiBpZD0idG9vbGJhci1jb250ZW50IiBzbG90PSJ0b3AiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxhIGhyZWY9IltbX2hvbWVQYXRoXV0iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvYT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWRdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLW1lc3NhZ2UiPgogICAgICAgICAgICAgIExvYWRpbmcgYWN0aXZlIGRhc2hib2FyZHPigKYKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgPHBhcGVyLXRhYnMgbm9pbmsgc2Nyb2xsYWJsZSBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkQWN0aXZlKGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMsIGRhc2hib2FyZERhdHVtKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRhYiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIHRpdGxlPSJbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXSI+CiAgICAgICAgICAgICAgICAgICAgW1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChfZGFzaGJvYXJkRGF0YSwgZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcyldXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IklOQUNUSVZFIiBuby1sYWJlbC1mbG9hdCBub2luayBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEycHgiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9ImluYWN0aXZlLWRhc2hib2FyZHMtbWVudSIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkRGFzaGJvYXJkfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJkYXRhLWRhc2hib2FyZCI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkSW5hY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iIHJlc3RhbXA+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iPltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9Imdsb2JhbC1hY3Rpb25zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaW5qZWN0ZWQtaGVhZGVyLWl0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpZD0icmVsb2FkLWJ1dHRvbiIgY2xhc3MkPSJbW19nZXREYXRhUmVmcmVzaGluZ0NsYXNzKF9yZWZyZXNoaW5nKV1dIiBkaXNhYmxlZCQ9IltbX2lzUmVsb2FkRGlzYWJsZWRdXSIgaWNvbj0icmVmcmVzaCIgb24tdGFwPSJyZWxvYWQiIHRpdGxlJD0iTGFzdCB1cGRhdGVkOiBbW19sYXN0UmVsb2FkVGltZVNob3J0XV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJvcGVuU2V0dGluZ3MiIGlkPSJzZXR0aW5ncy1idXR0b24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YWJpbmRleD0iLTEiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci10b29sYmFyPgoKICAgICAgPGRpdiBpZD0iY29udGVudC1wYW5lIiBjbGFzcz0iZml0Ij4KICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1vdmVydmlldyI+PC9zbG90PgogICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5GYWlsZWQgdG8gbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBkYXNoYm9hcmRzLjwvaDM+CiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgVGVuc29yQm9hcmQgYmFja2VuZCBpcyBubyBsb25nZXIgcnVubmluZy4KICAgICAgICAgICAgICAgIFBlcmhhcHMgdGhpcyBwYWdlIGlzIGNhY2hlZD8KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgdGhhdCB5b3XigJl2ZSBmaXhlZCB0aGUgcHJvYmxlbSwgY2xpY2sgdGhlIHJlbG9hZAogICAgICAgICAgICAgICAgYnV0dG9uIGluIHRoZSB0b3AtcmlnaHQuCiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYXV0b1JlbG9hZEVuYWJsZWRdXSI+CiAgICAgICAgICAgICAgICAgIFdl4oCZbGwgdHJ5IHRvIHJlbG9hZCBldmVyeQogICAgICAgICAgICAgICAgICBbW2F1dG9SZWxvYWRJbnRlcnZhbFNlY3NdXSZuYnNwO3NlY29uZHMgYXMgd2VsbC4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgCgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGk+TGFzdCByZWxvYWQ6IFtbX2xhc3RSZWxvYWRUaW1lXV08L2k+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2NhdGlvbl1dIj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT48cD4KICAgICAgICAgICAgICAgICAgICA8aT5Mb2cgZGlyZWN0b3J5OgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zaG93Tm9EYXNoYm9hcmRzTWVzc2FnZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+Tm8gZGFzaGJvYXJkcyBhcmUgYWN0aXZlIGZvciB0aGUgY3VycmVudCBkYXRhIHNldC48L2gzPgogICAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkRhdGEgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgIFRoZXJl4oCZcyBubyBkYXNoYm9hcmQgYnkgdGhlIG5hbWUgb2YKICAgICAgICAgICAgICAgIOKAnDx0dD5bW19zZWxlY3RlZERhc2hib2FyZF1dPC90dD4u4oCdCiAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNMb2FkZWRdXSI+CiAgICAgICAgICAgICAgICA8cD5Zb3UgY2FuIHNlbGVjdCBhIGRhc2hib2FyZCBmcm9tIHRoZSBsaXN0IGFib3ZlLgoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpZD0iZGFzaGJvYXJkcy10ZW1wbGF0ZSIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIiBvbi1kb20tY2hhbmdlPSJfb25UZW1wbGF0ZUNoYW5nZWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtY29udGFpbmVyIiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIGRhdGEtc2VsZWN0ZWQkPSJbW19zZWxlY3RlZFN0YXR1cyhfc2VsZWN0ZWREYXNoYm9hcmQsIGRhc2hib2FyZERhdHVtLnBsdWdpbildXSI+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDApOwogICAgICB9CgogICAgICAjdG9vbGJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgICAgICAvKiBJbmNyZWFzZSBjbGlja2FibGUgYXJlYSBmb3IgY2FzZSB3aGVyZSB0aXRsZSBpcyBhbiBhbmNob3IuICovCiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZGlzcGxheTogdmFyKC0tdGItdG9vbGJhci10aXRsZS1kaXNwbGF5LCBibG9jayk7CiAgICAgIH0KCiAgICAgIGEudG9vbGJhci10aXRsZSB7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgY29sb3IuICovCiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgdGV4dC1kZWNvcmF0aW9uLiAqLwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItbWVzc2FnZSB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICBwYXBlci10YWJzIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLXRhYnMtY29udGVudDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pY29uOiB7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSBwYXBlci1pdGVtIHsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAjaW5hY3RpdmUtZGFzaGJvYXJkcy1tZW51IHsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLS1wYXBlci1saXN0Ym94LWNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgI3Rvb2xiYXItY29udGVudCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgI2NvbnRlbnQtcGFuZSB7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250ZW50IHsKICAgICAgICBmbGV4OiAxIDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLyogSGlkZSB1bnNlbGVjdGVkIGRhc2hib2FyZHMuIFdlIHN0aWxsIGRpc3BsYXkgdGhlbSB3aXRoaW4gYSBjb250YWluZXIKICAgICAgICAgb2YgaGVpZ2h0IDAgc2luY2UgUGxvdHRhYmxlIHByb2R1Y2VzIGRlZ2VuZXJhdGUgY2hhcnRzIHdoZW4gY2hhcnRzIGFyZQogICAgICAgICByZWxvYWRlZCB3aGlsZSBub3QgZGlzcGxheWVkLiAqLwogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lcjpub3QoW2RhdGEtc2VsZWN0ZWRdKSB7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAvKiogV2UgZnVydGhlciBtYWtlIGNvbnRhaW5lcnMgaW52aXNpYmxlLiBTb21lIGVsZW1lbnRzIG1heSBhbmNob3IgdG8KICAgICAgICAgICAgdGhlIHZpZXdwb3J0IGluc3RlYWQgb2YgdGhlIGNvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBzZXR0aW5nIHRoZSBtYXgKICAgICAgICAgICAgaGVpZ2h0IGhlcmUgdG8gMCB3aWxsIG5vdCBoaWRlIHRoZW0uICovCiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciBpZnJhbWUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC53YXJuaW5nLW1lc3NhZ2UgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICBbZGlzYWJsZWRdIHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjcmVsb2FkLWJ1dHRvbi5yZWZyZXNoaW5nIHsKICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCiAgPGJvZHk+CiAgICA8dGYtdGVuc29yYm9hcmQgdXNlLWhhc2ggYnJhbmQ9IlRlbnNvckJvYXJkIj48L3RmLXRlbnNvcmJvYXJkPgogIAoKPHNjcmlwdCBzcmM9ImluZGV4LmpzIj48L3NjcmlwdD4=", "headers": [ [ "content-type", "text/html; charset=utf-8" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/environment": { "data": "eyJkYXRhX2xvY2F0aW9uIjogImxvZy8iLCAid2luZG93X3RpdGxlIjogIiJ9", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/experiments": { "data": "W10=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_accuracy&run=train": { "data": "W1sxNTg5NzI1MDA1LjQ5MzI4NCwgMCwgMC42NjUxODQ1NTc0Mzc4OTY3XSwgWzE1ODk3MjUwMDkuOTE3MTU0LCAxLCAwLjgwNTM1ODk0NjMyMzM5NDhdLCBbMTU4OTcyNTAxNC4yMTM1NDUsIDIsIDAuODM2NDI0MjkxMTMzODgwNl0sIFsxNTg5NzI1MDE4LjY4NjYwNywgMywgMC44NTgzMDQ1NjAxODQ0Nzg4XSwgWzE1ODk3MjUwMjMuMDU2NTAyLCA0LCAwLjg3NTQ0NjA4MTE2MTQ5OV0sIFsxNTg5NzI1MDI3LjUyMzYzNiwgNSwgMC44ODY2MjAyODMxMjY4MzFdXQ==", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_accuracy&run=validation": { "data": "W1sxNTg5NzI1MDA1LjUwMDMwOCwgMCwgMC43OTY0NDM2NDExODU3NjA1XSwgWzE1ODk3MjUwMDkuOTE4MzczLCAxLCAwLjgzMjk0MzM3OTg3ODk5NzhdLCBbMTU4OTcyNTAxNC4yMTQ2MDUsIDIsIDAuODQyNTM2MjcwNjE4NDM4N10sIFsxNTg5NzI1MDE4LjY4Nzg5NCwgMywgMC44NTA0OTEzNDQ5Mjg3NDE1XSwgWzE1ODk3MjUwMjMuMDU3OCwgNCwgMC44NTMyOTkwMjE3MjA4ODYyXSwgWzE1ODk3MjUwMjcuNTI0NzYzLCA1LCAwLjg2MTAyMDE0NzgwMDQ0NTZdXQ==", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_loss&run=train": { "data": "W1sxNTg5NzI1MDA1LjQ5MjkzMiwgMCwgMC42MDAyNzIyMzgyNTQ1NDcxXSwgWzE1ODk3MjUwMDkuOTE2ODUsIDEsIDAuNDM5NTk2ODkxNDAzMTk4MjRdLCBbMTU4OTcyNTAxNC4yMTMxODEsIDIsIDAuMzgwMTU0ODQ4MDk4NzU0OV0sIFsxNTg5NzI1MDE4LjY4NjEzNCwgMywgMC4zMzQzODc2MDA0MjE5MDU1XSwgWzE1ODk3MjUwMjMuMDU2MDQsIDQsIDAuMzAzMTk3MzgzODgwNjE1MjNdLCBbMTU4OTcyNTAyNy41MjMyNzksIDUsIDAuMjc0MDM2NjQ1ODg5MjgyMl1d", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_loss&run=validation": { "data": "W1sxNTg5NzI1MDA1LjUwMDA0MywgMCwgMC40NTYwMTIzOTgwMDQ1MzE4Nl0sIFsxNTg5NzI1MDA5LjkxODEyLCAxLCAwLjM3MTg1MjY2NjEzOTYwMjY2XSwgWzE1ODk3MjUwMTQuMjE0MzQyLCAyLCAwLjM1MDA2Nzc5NDMyMjk2NzUzXSwgWzE1ODk3MjUwMTguNjg3NTg5LCAzLCAwLjMzNzUwMTg1MzcwNDQ1MjVdLCBbMTU4OTcyNTAyMy4wNTc0NjQsIDQsIDAuMzI3NjEyMzcwMjUyNjA5MjVdLCBbMTU4OTcyNTAyNy41MjQ0OTEsIDUsIDAuMzIyMzc2NDAwMjMyMzE1MDZdXQ==", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/tags": { "data": "eyJ0cmFpbiI6IHsiZXBvY2hfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAiZXBvY2hfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoX2FjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaF9hY2N1cmFjeSIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoX2xyIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaF9sciIsICJkZXNjcmlwdGlvbiI6ICIifX0sICJ2YWxpZGF0aW9uIjogeyJlcG9jaF9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaF9sb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiZXBvY2hfYWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogImVwb2NoX2FjY3VyYWN5IiwgImRlc2NyaXB0aW9uIjogIiJ9fX0=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugins_listing": { "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGVidWdnZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImdyYXBocyI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJncmFwaHMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWdyYXBoLWRhc2hib2FyZCJ9fSwgImRpc3RyaWJ1dGlvbnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImRpc3RyaWJ1dGlvbnMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQifX0sICJoaXN0b2dyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlX3JlZGlyZWN0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUHJvZmlsZSIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQifX0sICJiZWhvbGRlciI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiB0cnVlLCAidGFiX25hbWUiOiAiYmVob2xkZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWJlaG9sZGVyLWRhc2hib2FyZCJ9fSwgImhwYXJhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJocGFyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ocGFyYW1zLWRhc2hib2FyZCJ9fSwgIm1lc2giOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJtZXNoIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJtZXNoLWRhc2hib2FyZCJ9fSwgInByb2plY3RvciI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAicHJvamVjdG9yIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vcHJvamVjdG9yL2luZGV4LmpzIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZGV4LmpzIn19fQ==", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/runs": { "data": "WyJ0cmFpbiIsICJ2YWxpZGF0aW9uIl0=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { "data": "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", "headers": [ [ "content-type", "font/woff2" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { "data": "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", "headers": [ [ "content-type", "font/woff2" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/index.js": { "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7Ci8vIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTLUlTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgovKioKICogQGZpbGVvdmVydmlldyBCb290c3RyYXAgZm9yIHRoZSBHb29nbGUgSlMgTGlicmFyeSAoQ2xvc3VyZSkuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSBiYXNlLmpzIHdpbGwgYXR0ZW1wdCB0byBsb2FkIENsb3N1cmUncyBkZXBzIGZpbGUsIHVubGVzcwogKiB0aGUgZ2xvYmFsIDxjb2RlPkNMT1NVUkVfTk9fREVQUzwvY29kZT4gaXMgc2V0IHRvIHRydWUuICBUaGlzIGFsbG93cyBwcm9qZWN0cwogKiB0byBpbmNsdWRlIHRoZWlyIG93biBkZXBzIGZpbGUocykgZnJvbSBkaWZmZXJlbnQgbG9jYXRpb25zLgogKgogKiBBdm9pZCBpbmNsdWRpbmcgYmFzZS5qcyBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBzdHJpY3RseSBkaXNjb3VyYWdlZCBhbmQgbm90CiAqIHN1cHBvcnRlZC4gZ29vZy5yZXF1aXJlKC4uLikgd29uJ3Qgd29yayBwcm9wZXJseSBpbiB0aGF0IGNhc2UuCiAqCiAqIEBwcm92aWRlR29vZwogKi8KCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gT3ZlcnJpZGRlbiB0byB0cnVlIGJ5IHRoZSBjb21waWxlci4KICovCnZhciBDT01QSUxFRCA9IGZhbHNlOwoKCi8qKgogKiBCYXNlIG5hbWVzcGFjZSBmb3IgdGhlIENsb3N1cmUgbGlicmFyeS4gIENoZWNrcyB0byBzZWUgZ29vZyBpcyBhbHJlYWR5CiAqIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYmVmb3JlIGFzc2lnbmluZyB0byBwcmV2ZW50IGNsb2JiZXJpbmcgaWYKICogYmFzZS5qcyBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuCiAqCiAqIEBjb25zdAogKi8KdmFyIGdvb2cgPSBnb29nIHx8IHt9OwoKLyoqCiAqIFJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4KICogaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsLW9iamVjdAogKgogKiBNb3JlIGluZm8gb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBoZXJlOgogKiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFOQWVXNFdrN0k3RlYwWTJ0Y1VGdlFkR01jODlrMnZkZ1NYSW53OF9udkNJL2VkaXQKICoKICogQGNvbnN0CiAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gc2VsZiB3b24ndCBiZSByZWZlcmVuY2VkIHVubGVzcyBgdGhpc2AgaXMgZmFsc3kuCiAqIEB0eXBlIHshR2xvYmFsfQogKi8KZ29vZy5nbG9iYWwgPQogICAgLy8gQ2hlY2sgYHRoaXNgIGZpcnN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIC8vIFZhbGlkIHVubGVzcyBydW5uaW5nIGFzIGFuIEVTIG1vZHVsZSBvciBpbiBhIGZ1bmN0aW9uIHdyYXBwZXIgY2FsbGVkCiAgICAvLyAgIHdpdGhvdXQgc2V0dGluZyBgdGhpc2AgcHJvcGVybHkuCiAgICAvLyBOb3RlIHRoYXQgYmFzZS5qcyBjYW4ndCB1c2VmdWxseSBiZSBpbXBvcnRlZCBhcyBhbiBFUyBtb2R1bGUsIGJ1dCBpdCBtYXkKICAgIC8vIGJlIGNvbXBpbGVkIGludG8gYnVuZGxlcyB0aGF0IGFyZSBsb2FkYWJsZSBhcyBFUyBtb2R1bGVzLgogICAgdGhpcyB8fAogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9zZWxmCiAgICAvLyBGb3IgaW4tcGFnZSBicm93c2VyIGVudmlyb25tZW50cyBhbmQgd29ya2Vycy4KICAgIHNlbGY7CgoKLyoqCiAqIEEgaG9vayBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmaW5lIHZhbHVlcyBpbiB1bmNvbXBpbGVkIG1vZGUuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSwgYENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTYCBtYXkgYmUgZGVmaW5lZCBiZWZvcmUKICogbG9hZGluZyBiYXNlLmpzLiAgSWYgYSBrZXkgaXMgZGVmaW5lZCBpbiBgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVNgLAogKiBgZ29vZy5kZWZpbmVgIHdpbGwgdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcwogKiBhbGxvd3MgZmxhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4gd2l0aG91dCBjb21waWxhdGlvbiAodGhpcyBpcyBub3JtYWxseQogKiBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgY29tcGlsZXIncyAiZGVmaW5lIiBmbGFnKS4KICoKICogRXhhbXBsZToKICogPHByZT4KICogICB2YXIgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVMgPSB7J2dvb2cuREVCVUcnOiBmYWxzZX07CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmluZSB2YWx1ZXMgaW4gdW5jb21waWxlZCBvciBjb21waWxlZCBtb2RlLAogKiBsaWtlIENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTIGJ1dCBlZmZlY3RpdmUgaW4gY29tcGlsZWQgY29kZS4gIEluCiAqIHVuY29tcGlsZWQgY29kZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0YWtlcyBwcmVjZWRlbmNlLgogKgogKiBBbHNvIHVubGlrZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0aGUgdmFsdWVzIG11c3QgYmUgbnVtYmVyLCBib29sZWFuIG9yCiAqIHN0cmluZyBsaXRlcmFscyBvciB0aGUgY29tcGlsZXIgd2lsbCBlbWl0IGFuIGVycm9yLgogKgogKiBXaGlsZSBhbnkgQGRlZmluZSB2YWx1ZSBtYXkgYmUgc2V0LCBvbmx5IHRob3NlIHNldCB3aXRoIGdvb2cuZGVmaW5lIHdpbGwgYmUKICogZWZmZWN0aXZlIGZvciB1bmNvbXBpbGVkIGNvZGUuCiAqCiAqIEV4YW1wbGU6CiAqIDxwcmU+CiAqICAgdmFyIENMT1NVUkVfREVGSU5FUyA9IHsnZ29vZy5ERUJVRyc6IGZhbHNlfSA7CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90IHVuZGVmaW5lZC4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkLgogKiBAZGVwcmVjYXRlZCBVc2UgYHZhbCAhPT0gdW5kZWZpbmVkYCBpbnN0ZWFkLgogKi8KZ29vZy5pc0RlZiA9IGZ1bmN0aW9uKHZhbCkgewogIC8vIHZvaWQgMCBhbHdheXMgZXZhbHVhdGVzIHRvIHVuZGVmaW5lZCBhbmQgaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gZGVwZW5kIG9uCiAgLy8gdGhlIGRlZmluaXRpb24gb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lZCAndW5kZWZpbmVkJy4KICByZXR1cm4gdmFsICE9PSB2b2lkIDA7Cn07CgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBzdHJpbmcuCiAqIEBkZXByZWNhdGVkIFVzZSBgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydgIGluc3RlYWQuCiAqLwpnb29nLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ3N0cmluZyc7Cn07CgoKLyoqCiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGEgYm9vbGVhbi4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBib29sZWFuLgogKiBAZGVwcmVjYXRlZCBVc2UgYHR5cGVvZiB2YWwgPT09ICdib29sZWFuJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNCb29sZWFuID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ2Jvb2xlYW4nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG51bWJlci4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhIG51bWJlci4KICogQGRlcHJlY2F0ZWQgVXNlIGB0eXBlb2YgdmFsID09PSAnbnVtYmVyJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNOdW1iZXIgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdHlwZW9mIHZhbCA9PSAnbnVtYmVyJzsKfTsKCgovKioKICogQnVpbGRzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgcGF0aCwgZW5zdXJpbmcgdGhhdAogKiBuYW1lcyB0aGF0IGFscmVhZHkgZXhpc3QgYXJlIG5vdCBvdmVyd3JpdHRlbi4gRm9yIGV4YW1wbGU6CiAqICJhLmIuYyIgLT4gYSA9IHt9O2EuYj17fTthLmIuYz17fTsKICogVXNlZCBieSBnb29nLnByb3ZpZGUgYW5kIGdvb2cuZXhwb3J0U3ltYm9sLgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCB0aGlzIGZpbGUgZGVmaW5lcy4KICogQHBhcmFtIHsqPX0gb3B0X29iamVjdCB0aGUgb2JqZWN0IHRvIGV4cG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBgZ29vZy5nbG9iYWxgLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5leHBvcnRQYXRoXyA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmplY3QsIG9wdF9vYmplY3RUb0V4cG9ydFRvKSB7CiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpOwogIHZhciBjdXIgPSBvcHRfb2JqZWN0VG9FeHBvcnRUbyB8fCBnb29nLmdsb2JhbDsKCiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZXhoaWJpdHMgc3RyYW5nZSBiZWhhdmlvciB3aGVuIHRocm93aW5nIGVycm9ycyBmcm9tCiAgLy8gbWV0aG9kcyBleHRlcm5lZCBpbiB0aGlzIG1hbm5lci4gIFNlZSB0aGUgdGVzdEV4cG9ydFN5bWJvbEV4Y2VwdGlvbnMgaW4KICAvLyBiYXNlX3Rlc3QuaHRtbCBmb3IgYW4gZXhhbXBsZS4KICBpZiAoIShwYXJ0c1swXSBpbiBjdXIpICYmIHR5cGVvZiBjdXIuZXhlY1NjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgY3VyLmV4ZWNTY3JpcHQoJ3ZhciAnICsgcGFydHNbMF0pOwogIH0KCiAgZm9yICh2YXIgcGFydDsgcGFydHMubGVuZ3RoICYmIChwYXJ0ID0gcGFydHMuc2hpZnQoKSk7KSB7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCAmJiBvcHRfb2JqZWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgLy8gbGFzdCBwYXJ0IGFuZCB3ZSBoYXZlIGFuIG9iamVjdDsgdXNlIGl0CiAgICAgIGN1cltwYXJ0XSA9IG9wdF9vYmplY3Q7CiAgICB9IGVsc2UgaWYgKGN1cltwYXJ0XSAmJiBjdXJbcGFydF0gIT09IE9iamVjdC5wcm90b3R5cGVbcGFydF0pIHsKICAgICAgY3VyID0gY3VyW3BhcnRdOwogICAgfSBlbHNlIHsKICAgICAgY3VyID0gY3VyW3BhcnRdID0ge307CiAgICB9CiAgfQp9OwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZWQgdmFsdWUuIEluIHVuY29tcGlsZWQgbW9kZSwgdGhlIHZhbHVlIGlzIHJldHJpZXZlZCBmcm9tCiAqIENMT1NVUkVfREVGSU5FUyBvciBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyBpZiB0aGUgb2JqZWN0IGlzIGRlZmluZWQgYW5kCiAqIGhhcyB0aGUgcHJvcGVydHkgc3BlY2lmaWVkLCBhbmQgb3RoZXJ3aXNlIHVzZWQgdGhlIGRlZmluZWQgZGVmYXVsdFZhbHVlLgogKiBXaGVuIGNvbXBpbGVkIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb21waWxlciBvcHRpb25zIG9yIHRoZQogKiB2YWx1ZSBzZXQgaW4gdGhlIENMT1NVUkVfREVGSU5FUyBvYmplY3QuIFJldHVybnMgdGhlIGRlZmluZWQgdmFsdWUgc28gdGhhdCBpdAogKiBjYW4gYmUgdXNlZCBzYWZlbHkgaW4gbW9kdWxlcy4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB0eXBlIE1VU1QgYmUgZWl0aGVyCiAqIGJvb2xlYW4sIG51bWJlciwgb3Igc3RyaW5nLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIHRvIHByb3ZpZGUuCiAqIEBwYXJhbSB7VH0gZGVmYXVsdFZhbHVlCiAqIEByZXR1cm4ge1R9IFRoZSBkZWZpbmVkIHZhbHVlLgogKiBAdGVtcGxhdGUgVAogKi8KZ29vZy5kZWZpbmUgPSBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpIHsKICB2YXIgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgdmFyIHVuY29tcGlsZWREZWZpbmVzID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVM7CiAgICB2YXIgZGVmaW5lcyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKICAgIGlmICh1bmNvbXBpbGVkRGVmaW5lcyAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLyAodW5jb21waWxlZERlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodW5jb21waWxlZERlZmluZXMsIG5hbWUpKSB7CiAgICAgIHZhbHVlID0gdW5jb21waWxlZERlZmluZXNbbmFtZV07CiAgICB9IGVsc2UgaWYgKAogICAgICAgIGRlZmluZXMgJiYKICAgICAgICAvLyBBbnRpIERPTS1jbG9iYmVyaW5nIHJ1bnRpbWUgY2hlY2sgKGIvMzc3MzY1NzYpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8gKGRlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmaW5lcywgbmFtZSkpIHsKICAgICAgdmFsdWUgPSBkZWZpbmVzW25hbWVdOwogICAgfQogIH0KICByZXR1cm4gdmFsdWU7Cn07CgoKLyoqCiAqIEBkZWZpbmUge251bWJlcn0gSW50ZWdlciB5ZWFyIGluZGljYXRpbmcgdGhlIHNldCBvZiBicm93c2VyIGZlYXR1cmVzIHRoYXQgYXJlCiAqIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudC4gIFRoaXMgaXMgZGVmaW5lZCB0byBpbmNsdWRlIGV4YWN0bHkgZmVhdHVyZXMgdGhhdAogKiB3b3JrIGNvcnJlY3RseSBvbiBhbGwgIm1vZGVybiIgYnJvd3NlcnMgdGhhdCBhcmUgc3RhYmxlIG9uIEphbnVhcnkgMSBvZiB0aGUKICogc3BlY2lmaWVkIHllYXIuICBGb3IgZXhhbXBsZSwKICogYGBganMKICogaWYgKGdvb2cuRkVBVFVSRVNFVF9ZRUFSID49IDIwMTkpIHsKICogICAvLyB1c2UgQVBJcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gYWxsIG1ham9yIHN0YWJsZSBicm93c2VycyBKYW4gMSwgMjAxOQogKiB9IGVsc2UgewogKiAgIC8vIHBvbHlmaWxsIGZvciBvbGRlciBicm93c2VycwogKiB9CiAqIGBgYAogKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHRoZSBwcmltYXJ5IGRlZmluZSBmb3IgcmVtb3ZpbmcKICogdW5uZWNlc3NhcnkgYnJvd3NlciBjb21wYXRpYmlsaXR5IGNvZGUgKHN1Y2ggYXMgcG9ueWZpbGxzIGFuZCB3b3JrYXJvdW5kcyksCiAqIGFuZCBzaG91bGQgaW5mb3JtIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBtb3N0IG90aGVyIGRlZmluZXM6CiAqIGBgYGpzCiAqIGNvbnN0IEFTU1VNRV9OQVRJVkVfUFJPTUlTRSA9CiAqICAgICBnb29nLmRlZmluZSgnQVNTVU1FX05BVElWRV9QUk9NSVNFJywgZ29vZy5GRUFUVVJFU0VUX1lFQVIgPj0gMjAxNik7CiAqIGBgYAogKgogKiBUaGUgZGVmYXVsdCBhc3N1bXB0aW9uIGlzIHRoYXQgSUU5IGlzIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIGJyb3dzZXIsIHdoaWNoIHdhcwogKiBmaXJzdCBhdmFpbGFibGUgSmFuIDEsIDIwMTIuCiAqCiAqIFRPRE8odXNlcik6IFJlZmVyZW5jZSBtb3JlIHRob3JvdWdoIGRvY3VtZW50YXRpb24gd2hlbiBpdCdzIGF2YWlsYWJsZS4KICovCmdvb2cuRkVBVFVSRVNFVF9ZRUFSID0gZ29vZy5kZWZpbmUoJ2dvb2cuRkVBVFVSRVNFVF9ZRUFSJywgMjAxMik7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IERFQlVHIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBkZWJ1Z2dpbmcgY29kZQogKiB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gYSBwcm9kdWN0aW9uLiBJdCBjYW4gYmUgZWFzaWx5IHN0cmlwcGVkCiAqIGJ5IHNwZWNpZnlpbmcgLS1kZWZpbmUgZ29vZy5ERUJVRz1mYWxzZSB0byB0aGUgQ2xvc3VyZSBDb21waWxlciBha2EKICogSlNDb21waWxlci4gRm9yIGV4YW1wbGUsIG1vc3QgdG9TdHJpbmcoKSBtZXRob2RzIHNob3VsZCBiZSBkZWNsYXJlZCBpbnNpZGUgYW4KICogImlmIChnb29nLkRFQlVHKSIgY29uZGl0aW9uYWwgYmVjYXVzZSB0aGV5IGFyZSBnZW5lcmFsbHkgdXNlZCBmb3IgZGVidWdnaW5nCiAqIHB1cnBvc2VzIGFuZCBpdCBpcyBkaWZmaWN1bHQgZm9yIHRoZSBKU0NvbXBpbGVyIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lCiAqIHdoZXRoZXIgdGhleSBhcmUgdXNlZC4KICovCmdvb2cuREVCVUcgPSBnb29nLmRlZmluZSgnZ29vZy5ERUJVRycsIHRydWUpOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IExPQ0FMRSBkZWZpbmVzIHRoZSBsb2NhbGUgYmVpbmcgdXNlZCBmb3IgY29tcGlsYXRpb24uIEl0IGlzCiAqIHVzZWQgdG8gc2VsZWN0IGxvY2FsZSBzcGVjaWZpYyBkYXRhIHRvIGJlIGNvbXBpbGVkIGluIGpzIGJpbmFyeS4gQlVJTEQgcnVsZQogKiBjYW4gc3BlY2lmeSB0aGlzIHZhbHVlIGJ5ICItLWRlZmluZSBnb29nLkxPQ0FMRT08bG9jYWxlX25hbWU+IiBhcyBhIGNvbXBpbGVyCiAqIG9wdGlvbi4KICoKICogVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgbG9jYWxlIGNvZGUgZm9ybWF0IGlzIGltcG9ydGFudC4gWW91IHNob3VsZCB1c2UKICogdGhlIGNhbm9uaWNhbCBVbmljb2RlIGZvcm1hdCB3aXRoIGh5cGhlbiBhcyBhIGRlbGltaXRlci4gTGFuZ3VhZ2UgbXVzdCBiZQogKiBsb3dlcmNhc2UsIExhbmd1YWdlIFNjcmlwdCAtIENhcGl0YWxpemVkLCBSZWdpb24gLSBVUFBFUkNBU0UuCiAqIFRoZXJlIGFyZSBmZXcgZXhhbXBsZXM6IHB0LUJSLCBlbiwgZW4tVVMsIHNyLUxhdGluLUJPLCB6aC1IYW5zLUNOLgogKgogKiBTZWUgbW9yZSBpbmZvIGFib3V0IGxvY2FsZSBjb2RlcyBoZXJlOgogKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS8jVW5pY29kZV9MYW5ndWFnZV9hbmRfTG9jYWxlX0lkZW50aWZpZXJzCiAqCiAqIEZvciBsYW5ndWFnZSBjb2RlcyB5b3Ugc2hvdWxkIHVzZSB2YWx1ZXMgZGVmaW5lZCBieSBJU08gNjkzLTEuIFNlZSBpdCBoZXJlCiAqIGh0dHA6Ly93d3cudzMub3JnL1dBSS9FUi9JRy9lcnQvaXNvNjM5Lmh0bS4gVGhlcmUgaXMgb25seSBvbmUgZXhjZXB0aW9uIGZyb20KICogdGhpcyBydWxlOiB0aGUgSGVicmV3IGxhbmd1YWdlLiBGb3IgbGVnYWN5IHJlYXNvbnMgdGhlIG9sZCBjb2RlIChpdykgc2hvdWxkCiAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IGNvZGUgKGhlKS4KICoKICovCmdvb2cuTE9DQUxFID0gZ29vZy5kZWZpbmUoJ2dvb2cuTE9DQUxFJywgJ2VuJyk7ICAvLyBkZWZhdWx0IHRvIGVuCgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBjb2RlIGlzIHJ1bm5pbmcgb24gdHJ1c3RlZCBzaXRlcy4KICoKICogT24gdW50cnVzdGVkIHNpdGVzLCBzZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMgY2FuIGJlIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiBieQogKiBleHRlcm5hbCBsaWJyYXJpZXMgbGlrZSBQcm90b3R5cGUsIERhdGVqcywgYW5kIEpRdWVyeSBhbmQgc2V0dGluZyB0aGlzIGZsYWcKICogdG8gZmFsc2UgZm9yY2VzIGNsb3N1cmUgdG8gdXNlIGl0cyBvd24gaW1wbGVtZW50YXRpb25zIHdoZW4gcG9zc2libGUuCiAqCiAqIElmIHlvdXIgSmF2YVNjcmlwdCBjYW4gYmUgbG9hZGVkIGJ5IGEgdGhpcmQgcGFydHkgc2l0ZSBhbmQgeW91IGFyZSB3YXJ5IGFib3V0CiAqIHJlbHlpbmcgb24gbm9uLXN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywgc3BlY2lmeQogKiAiLS1kZWZpbmUgZ29vZy5UUlVTVEVEX1NJVEU9ZmFsc2UiIHRvIHRoZSBjb21waWxlci4KICovCmdvb2cuVFJVU1RFRF9TSVRFID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJVU1RFRF9TSVRFJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgYSBwcm9qZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUuCiAqCiAqIFRoaXMgZGVmaW5lIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBjb21wYXRpYmxlIHdpdGgKICogcnVubmluZyBpbiBFY21hU2NyaXB0IFN0cmljdCBtb2RlIG9yIHdhcm4gYWJvdXQgdW5hdmFpbGFibGUgZnVuY3Rpb25hbGl0eS4KICogQHNlZSBodHRwczovL2dvby5nbC9QdWRRNHkKICoKICovCmdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSA9IGdvb2cuZGVmaW5lKCdnb29nLlNUUklDVF9NT0RFX0NPTVBBVElCTEUnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgY29kZSB0aGF0IGNhbGxzIHtAbGluayBnb29nLnNldFRlc3RPbmx5fSBzaG91bGQKICogICAgIGJlIGRpc2FsbG93ZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAqLwpnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFJywgQ09NUElMRUQgJiYgIWdvb2cuREVCVUcpOwoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSBhIENocm9tZSBhcHAgQ1NQLWNvbXBsaWFudCBtZXRob2QgZm9yCiAqICAgICBsb2FkaW5nIHNjcmlwdHMgdmlhIGdvb2cucmVxdWlyZS4gQHNlZSBhcHBlbmRTY3JpcHRTcmNOb2RlXy4KICovCmdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfQ0hST01FX0FQUF9TQUZFX1NDUklQVF9MT0FESU5HJywgZmFsc2UpOwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZXNwYWNlIGluIENsb3N1cmUuCiAqCiAqIEEgbmFtZXNwYWNlIG1heSBvbmx5IGJlIGRlZmluZWQgb25jZSBpbiBhIGNvZGViYXNlLiBJdCBtYXkgYmUgZGVmaW5lZCB1c2luZwogKiBnb29nLnByb3ZpZGUoKSBvciBnb29nLm1vZHVsZSgpLgogKgogKiBUaGUgcHJlc2VuY2Ugb2Ygb25lIG9yIG1vcmUgZ29vZy5wcm92aWRlKCkgY2FsbHMgaW4gYSBmaWxlIGluZGljYXRlcwogKiB0aGF0IHRoZSBmaWxlIGRlZmluZXMgdGhlIGdpdmVuIG9iamVjdHMvbmFtZXNwYWNlcy4KICogUHJvdmlkZWQgc3ltYm9scyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4KICoKICogSW4gYWRkaXRpb24sIGdvb2cucHJvdmlkZSgpIGNyZWF0ZXMgdGhlIG9iamVjdCBzdHVicyBmb3IgYSBuYW1lc3BhY2UKICogKGZvciBleGFtcGxlLCBnb29nLnByb3ZpZGUoImdvb2cuZm9vLmJhciIpIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QKICogZ29vZy5mb28uYmFyIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QpLgogKgogKiBCdWlsZCB0b29scyBhbHNvIHNjYW4gZm9yIHByb3ZpZGUvcmVxdWlyZS9tb2R1bGUgc3RhdGVtZW50cwogKiB0byBkaXNjZXJuIGRlcGVuZGVuY2llcywgYnVpbGQgZGVwZW5kZW5jeSBmaWxlcyAoc2VlIGRlcHMuanMpLCBldGMuCiAqCiAqIEBzZWUgZ29vZy5yZXF1aXJlCiAqIEBzZWUgZ29vZy5tb2R1bGUKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZXNwYWNlIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICovCmdvb2cucHJvdmlkZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBpZiAoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cucHJvdmlkZSBjYW5ub3QgYmUgdXNlZCB3aXRoaW4gYSBtb2R1bGUuJyk7CiAgfQogIGlmICghQ09NUElMRUQpIHsKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzYW1lIG5hbWVzcGFjZSBpc24ndCBwcm92aWRlZCB0d2ljZS4KICAgIC8vIEEgZ29vZy5tb2R1bGUvZ29vZy5wcm92aWRlIG1hcHMgYSBnb29nLnJlcXVpcmUgdG8gYSBzcGVjaWZpYyBmaWxlCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWVzcGFjZSAiJyArIG5hbWUgKyAnIiBhbHJlYWR5IGRlY2xhcmVkLicpOwogICAgfQogIH0KCiAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmogVGhlIG9iamVjdCB0byBlbWJlZCBpbiB0aGUgbmFtZXNwYWNlLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfID0gZnVuY3Rpb24obmFtZSwgb3B0X29iaikgewogIGlmICghQ09NUElMRUQpIHsKICAgIGRlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV07CgogICAgdmFyIG5hbWVzcGFjZSA9IG5hbWU7CiAgICB3aGlsZSAoKG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHJpbmcoMCwgbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcuJykpKSkgewogICAgICBpZiAoZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZXNwYWNlKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lc3BhY2VdID0gdHJ1ZTsKICAgIH0KICB9CgogIGdvb2cuZXhwb3J0UGF0aF8obmFtZSwgb3B0X29iaik7Cn07CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0gez9XaW5kb3c9fSBvcHRfd2luZG93IFRoZSB3aW5kb3cgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBub25jZS4KICogICAgIERlZmF1bHRzIHRvIGdsb2JhbCBjb250ZXh0LgogKiBAcmV0dXJuIHtzdHJpbmd9IENTUCBub25jZSBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbm9uY2UgaXMgcHJlc2VudC4KICovCmdvb2cuZ2V0U2NyaXB0Tm9uY2UgPSBmdW5jdGlvbihvcHRfd2luZG93KSB7CiAgaWYgKG9wdF93aW5kb3cgJiYgb3B0X3dpbmRvdyAhPSBnb29nLmdsb2JhbCkgewogICAgcmV0dXJuIGdvb2cuZ2V0U2NyaXB0Tm9uY2VfKG9wdF93aW5kb3cuZG9jdW1lbnQpOwogIH0KICBpZiAoZ29vZy5jc3BOb25jZV8gPT09IG51bGwpIHsKICAgIGdvb2cuY3NwTm9uY2VfID0gZ29vZy5nZXRTY3JpcHROb25jZV8oZ29vZy5nbG9iYWwuZG9jdW1lbnQpOwogIH0KICByZXR1cm4gZ29vZy5jc3BOb25jZV87Cn07CgoKLyoqCiAqIEFjY29yZGluZyB0byB0aGUgQ1NQMyBzcGVjIGEgbm9uY2UgbXVzdCBiZSBhIHZhbGlkIGJhc2U2NCBzdHJpbmcuCiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDMvI2dyYW1tYXJkZWYtYmFzZTY0LXZhbHVlCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5OT05DRV9QQVRURVJOXyA9IC9eW1x3Ky9fLV0rWz1dezAsMn0kLzsKCgovKioKICogQHByaXZhdGUgez9zdHJpbmd9CiAqLwpnb29nLmNzcE5vbmNlXyA9IG51bGw7CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jCiAqIEByZXR1cm4ge3N0cmluZ30gQ1NQIG5vbmNlIG9yIGVtcHR5IHN0cmluZyBpZiBubyBub25jZSBpcyBwcmVzZW50LgogKiBAcHJpdmF0ZQogKi8KZ29vZy5nZXRTY3JpcHROb25jZV8gPSBmdW5jdGlvbihkb2MpIHsKICB2YXIgc2NyaXB0ID0gZG9jLnF1ZXJ5U2VsZWN0b3IgJiYgZG9jLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtub25jZV0nKTsKICBpZiAoc2NyaXB0KSB7CiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBub25jZSBmcm9tIHRoZSBJREwgcHJvcGVydHkgZmlyc3QsIGJlY2F1c2UgYnJvd3NlcnMgdGhhdAogICAgLy8gaW1wbGVtZW50IGFkZGl0aW9uYWwgbm9uY2UgcHJvdGVjdGlvbiBmZWF0dXJlcyAoY3VycmVudGx5IG9ubHkgQ2hyb21lKSB0bwogICAgLy8gcHJldmVudCBub25jZSBzdGVhbGluZyB2aWEgQ1NTIGRvIG5vdCBleHBvc2UgdGhlIG5vbmNlIHZpYSBhdHRyaWJ1dGVzLgogICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OQogICAgdmFyIG5vbmNlID0gc2NyaXB0Wydub25jZSddIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ25vbmNlJyk7CiAgICBpZiAobm9uY2UgJiYgZ29vZy5OT05DRV9QQVRURVJOXy50ZXN0KG5vbmNlKSkgewogICAgICByZXR1cm4gbm9uY2U7CiAgICB9CiAgfQogIHJldHVybiAnJzsKfTsKCgovKioKICogTW9kdWxlIGlkZW50aWZpZXIgdmFsaWRhdGlvbiByZWdleHAuCiAqIE5vdGU6IFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hlY2ssIGl0IGlzIHZlcnkgcG9zc2libGUgdG8gYmUgbW9yZSBsZW5pZW50LAogKiAgIHRoZSBwcmltYXJ5IGV4Y2x1c2lvbiBoZXJlIGlzICIvIiBhbmQgIlwiIGFuZCBhIGxlYWRpbmcgIi4iLCB0aGVzZQogKiAgIHJlc3RyaWN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gbGVhdmUgdGhlIGRvb3Igb3BlbiBmb3IgdXNpbmcgZ29vZy5yZXF1aXJlCiAqICAgd2l0aCByZWxhdGl2ZSBmaWxlIHBhdGhzIHJhdGhlciB0aGFuIG1vZHVsZSBpZGVudGlmaWVycy4KICogQHByaXZhdGUKICovCmdvb2cuVkFMSURfTU9EVUxFX1JFXyA9IC9eW2EtekEtWl8kXVthLXpBLVowLTkuXyRdKiQvOwoKCi8qKgogKiBEZWZpbmVzIGEgbW9kdWxlIGluIENsb3N1cmUuCiAqCiAqIE1hcmtzIHRoYXQgdGhpcyBmaWxlIG11c3QgYmUgbG9hZGVkIGFzIGEgbW9kdWxlIGFuZCBjbGFpbXMgdGhlIG5hbWVzcGFjZS4KICoKICogQSBuYW1lc3BhY2UgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIGEgY29kZWJhc2UuIEl0IG1heSBiZSBkZWZpbmVkIHVzaW5nCiAqIGdvb2cucHJvdmlkZSgpIG9yIGdvb2cubW9kdWxlKCkuCiAqCiAqIGdvb2cubW9kdWxlKCkgaGFzIHRocmVlIHJlcXVpcmVtZW50czoKICogLSBnb29nLm1vZHVsZSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgZmlsZSBhcyBnb29nLnByb3ZpZGUuCiAqIC0gZ29vZy5tb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmaWxlLgogKiAtIG9ubHkgb25lIGdvb2cubW9kdWxlIGlzIGFsbG93ZWQgcGVyIGZpbGUuCiAqCiAqIFdoZW4gYSBnb29nLm1vZHVsZSBhbm5vdGF0ZWQgZmlsZSBpcyBsb2FkZWQsIGl0IGlzIGVuY2xvc2VkIGluCiAqIGEgc3RyaWN0IGZ1bmN0aW9uIGNsb3N1cmUuIFRoaXMgbWVhbnMgdGhhdDoKICogLSBhbnkgdmFyaWFibGVzIGRlY2xhcmVkIGluIGEgZ29vZy5tb2R1bGUgZmlsZSBhcmUgcHJpdmF0ZSB0byB0aGUgZmlsZQogKiAobm90IGdsb2JhbCksIHRob3VnaCB0aGUgY29tcGlsZXIgaXMgZXhwZWN0ZWQgdG8gaW5saW5lIHRoZSBtb2R1bGUuCiAqIC0gVGhlIGNvZGUgbXVzdCBvYmV5IGFsbCB0aGUgcnVsZXMgb2YgInN0cmljdCIgSmF2YVNjcmlwdC4KICogLSB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyAidXNlIHN0cmljdCIKICoKICogTk9URTogdW5saWtlIGdvb2cucHJvdmlkZSwgZ29vZy5tb2R1bGUgZG9lcyBub3QgZGVjbGFyZSBhbnkgc3ltYm9scyBieQogKiBpdHNlbGYuIElmIGRlY2xhcmVkIHN5bWJvbHMgYXJlIGRlc2lyZWQsIHVzZQogKiBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKCkuCiAqCiAqCiAqIFNlZSB0aGUgcHVibGljIGdvb2cubW9kdWxlIHByb3Bvc2FsOiBodHRwOi8vZ29vLmdsL1ZhMWhpbgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLCBpcyBleHBlY3RlZCBidXQgbm90IHJlcXVpcmVkLgogKiBAcmV0dXJuIHt2b2lkfQogKi8KZ29vZy5tb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSB8fAogICAgICBuYW1lLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pID09IC0xKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGlkZW50aWZpZXInKTsKICB9CiAgaWYgKCFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ01vZHVsZSAnICsgbmFtZSArICcgaGFzIGJlZW4gbG9hZGVkIGluY29ycmVjdGx5LiBOb3RlLCAnICsKICAgICAgICAnbW9kdWxlcyBjYW5ub3QgYmUgbG9hZGVkIGFzIG5vcm1hbCBzY3JpcHRzLiBUaGV5IHJlcXVpcmUgc29tZSBraW5kIG9mICcgKwogICAgICAgICdwcmUtcHJvY2Vzc2luZyBzdGVwLiBZb3VcJ3JlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBhIG1vZHVsZSB2aWEgYSAnICsKICAgICAgICAnc2NyaXB0IHRhZyBvciBhcyBhIHBhcnQgb2YgYSBjb25jYXRlbmF0ZWQgYnVuZGxlIHdpdGhvdXQgcmV3cml0aW5nIHRoZSAnICsKICAgICAgICAnbW9kdWxlLiBGb3IgbW9yZSBpbmZvIHNlZTogJyArCiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L3dpa2kvZ29vZy5tb2R1bGU6LWFuLUVTNi1tb2R1bGUtbGlrZS1hbHRlcm5hdGl2ZS10by1nb29nLnByb3ZpZGUuJyk7CiAgfQogIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cubW9kdWxlIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBtb2R1bGUuJyk7CiAgfQoKICAvLyBTdG9yZSB0aGUgbW9kdWxlIG5hbWUgZm9yIHRoZSBsb2FkZXIuCiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSA9IG5hbWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNhbWUgbmFtZXNwYWNlIGlzbid0IHByb3ZpZGVkIHR3aWNlLgogICAgLy8gQSBnb29nLm1vZHVsZS9nb29nLnByb3ZpZGUgbWFwcyBhIGdvb2cucmVxdWlyZSB0byBhIHNwZWNpZmljIGZpbGUKICAgIGlmIChnb29nLmlzUHJvdmlkZWRfKG5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZXNwYWNlICInICsgbmFtZSArICciIGFscmVhZHkgZGVjbGFyZWQuJyk7CiAgICB9CiAgICBkZWxldGUgZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdOwogIH0KfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1vZHVsZSBpZGVudGlmaWVyLgogKiBAcmV0dXJuIHs/fSBUaGUgbW9kdWxlIGV4cG9ydHMgZm9yIGFuIGFscmVhZHkgbG9hZGVkIG1vZHVsZSBvciBudWxsLgogKgogKiBOb3RlOiBUaGlzIGlzIG5vdCBhbiBhbHRlcm5hdGl2ZSB0byBnb29nLnJlcXVpcmUsIGl0IGRvZXMgbm90CiAqIGluZGljYXRlIGEgaGFyZCBkZXBlbmRlbmN5LCBpbnN0ZWFkIGl0IGlzIHVzZWQgdG8gaW5kaWNhdGUKICogYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvciB0byBhY2Nlc3MgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUKICogdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbW9kdWxlIGlkZW50aWZpZXIuCiAqIEByZXR1cm4gez99IFRoZSBtb2R1bGUgZXhwb3J0cyBmb3IgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIG9yIG51bGwuCiAqIEBwcml2YXRlCiAqLwpnb29nLm1vZHVsZS5nZXRJbnRlcm5hbF8gPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKCFDT01QSUxFRCkgewogICAgaWYgKG5hbWUgaW4gZ29vZy5sb2FkZWRNb2R1bGVzXykgewogICAgICByZXR1cm4gZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lXS5leHBvcnRzOwogICAgfSBlbHNlIGlmICghZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdKSB7CiAgICAgIHZhciBucyA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpOwogICAgICByZXR1cm4gbnMgIT0gbnVsbCA/IG5zIDogbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn07CgoKLyoqCiAqIFR5cGVzIG9mIG1vZHVsZXMgdGhlIGRlYnVnIGxvYWRlciBjYW4gbG9hZC4KICogQGVudW0ge3N0cmluZ30KICovCmdvb2cuTW9kdWxlVHlwZSA9IHsKICBFUzY6ICdlczYnLAogIEdPT0c6ICdnb29nJwp9OwoKCi8qKgogKiBAcHJpdmF0ZSB7P3sKICogICBtb2R1bGVOYW1lOiAoc3RyaW5nfHVuZGVmaW5lZCksCiAqICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTpib29sZWFuLAogKiAgIHR5cGU6ID9nb29nLk1vZHVsZVR5cGUKICogfX0KICovCmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gbnVsbDsKCgovKioKICogQHByaXZhdGUKICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGdvb2cubW9kdWxlIG9yIGFuIGVzNiBtb2R1bGUgaXMgY3VycmVudGx5IGJlaW5nCiAqICAgICBpbml0aWFsaXplZC4KICovCmdvb2cuaXNJbk1vZHVsZUxvYWRlcl8gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKSB8fCBnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfKCk7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBnb29nLm1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAhIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfICYmCiAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGUgPT0gZ29vZy5Nb2R1bGVUeXBlLkdPT0c7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gZXM2IG1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfID0gZnVuY3Rpb24oKSB7CiAgdmFyIGluTG9hZGVyID0gISFnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJgogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy50eXBlID09IGdvb2cuTW9kdWxlVHlwZS5FUzY7CgogIGlmIChpbkxvYWRlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKCiAgaWYgKGpzY29tcCkgewogICAgLy8ganNjb21wIG1heSBub3QgaGF2ZSBnZXRDdXJyZW50TW9kdWxlUGF0aCBpZiB0aGlzIGlzIGEgY29tcGlsZWQgYnVuZGxlCiAgICAvLyB0aGF0IGhhcyBzb21lIG9mIHRoZSBydW50aW1lLCBidXQgbm90IGFsbCBvZiBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmCiAgICAvLyBvcHRpbWl6YXRpb25zIGFyZSB0dXJuZWQgb24gc28gdGhlIHVudXNlZCBydW50aW1lIGlzIHJlbW92ZWQgYnV0IHJlbmFtaW5nCiAgICAvLyBhbmQgQ2xvc3VyZSBwYXNzIGFyZSBvZmYgKHNvICRqc2NvbXAgaXMgc3RpbGwgbmFtZWQgJGpzY29tcCBhbmQgdGhlCiAgICAvLyBnb29nLnByb3ZpZGUvcmVxdWlyZSBjYWxscyBzdGlsbCBleGlzdCkuCiAgICBpZiAodHlwZW9mIGpzY29tcC5nZXRDdXJyZW50TW9kdWxlUGF0aCAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBCdW5kbGVkIEVTNiBtb2R1bGUuCiAgICByZXR1cm4gISFqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKTsKICB9CgogIHJldHVybiBmYWxzZTsKfTsKCgovKioKICogUHJvdmlkZSB0aGUgbW9kdWxlJ3MgZXhwb3J0cyBhcyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgb2JqZWN0IHVuZGVyIHRoZQogKiBtb2R1bGUncyBkZWNsYXJlZCBuYW1lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBnb29nLm1vZHVsZQogKiBmb3IgZmlsZXMgdGhhdCBoYXZlIGV4aXN0aW5nIHVzYWdlcy4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgPSBmdW5jdGlvbigpIHsKICBpZiAoIUNPTVBJTEVEICYmICFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ2dvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgbXVzdCBiZSBjYWxsZWQgZnJvbSAnICsKICAgICAgICAnd2l0aGluIGEgZ29vZy5tb2R1bGUnKTsKICB9CiAgaWYgKCFDT01QSUxFRCAmJiAhZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byAnICsKICAgICAgICAnZ29vZy5tb2R1bGUuZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZS4nKTsKICB9CiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8uZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZSA9IHRydWU7Cn07CgoKLyoqCiAqIEFzc29jaWF0ZXMgYW4gRVM2IG1vZHVsZSB3aXRoIGEgQ2xvc3VyZSBtb2R1bGUgSUQgc28gdGhhdCBpcyBhdmFpbGFibGUgdmlhCiAqIGdvb2cucmVxdWlyZS4gVGhlIGFzc29jaWF0ZWQgSUQgIGFjdHMgbGlrZSBhIGdvb2cubW9kdWxlIElEIC0gaXQgZG9lcyBub3QKICogY3JlYXRlIGFueSBnbG9iYWwgbmFtZXMsIGl0IGlzIG1lcmVseSBhdmFpbGFibGUgdmlhIGdvb2cucmVxdWlyZSAvCiAqIGdvb2cubW9kdWxlLmdldCAvIGdvb2cuZm9yd2FyZERlY2xhcmUgLyBnb29nLnJlcXVpcmVUeXBlLiBnb29nLnJlcXVpcmUgYW5kCiAqIGdvb2cubW9kdWxlLmdldCB3aWxsIHJldHVybiB0aGUgZW50aXJlIG1vZHVsZSBhcyBpZiBpdCB3YXMgaW1wb3J0IConZC4gVGhpcwogKiBhbGxvd3MgQ2xvc3VyZSBmaWxlcyB0byByZWZlcmVuY2UgRVM2IG1vZHVsZXMgZm9yIHRoZSBzYWtlIG9mIG1pZ3JhdGlvbi4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm92aWRlfQogKi8KZ29vZy5kZWNsYXJlTW9kdWxlSWQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICBpZiAoIWdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnZ29vZy5kZWNsYXJlTW9kdWxlSWQgbWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gJyArCiAgICAgICAgICAnd2l0aGluIGFuIEVTNiBtb2R1bGUnKTsKICAgIH0KICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJiBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdnb29nLmRlY2xhcmVNb2R1bGVJZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLicpOwogICAgfQogICAgaWYgKG5hbWVzcGFjZSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgIicgKyBuYW1lc3BhY2UgKyAnIiBhbHJlYWR5IGV4aXN0cy4nKTsKICAgIH0KICB9CiAgaWYgKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfKSB7CiAgICAvLyBOb3QgYnVuZGxlZCAtIGRlYnVnIGxvYWRpbmcuCiAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lID0gbmFtZXNwYWNlOwogIH0gZWxzZSB7CiAgICAvLyBCdW5kbGVkIC0gbm90IGRlYnVnIGxvYWRpbmcsIG5vIG1vZHVsZSBsb2FkZXIgc3RhdGUuCiAgICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICAgIGlmICghanNjb21wIHx8IHR5cGVvZiBqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGggIT0gJ2Z1bmN0aW9uJykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnTW9kdWxlIHdpdGggbmFtZXNwYWNlICInICsgbmFtZXNwYWNlICsKICAgICAgICAgICciIGhhcyBiZWVuIGxvYWRlZCBpbmNvcnJlY3RseS4nKTsKICAgIH0KICAgIHZhciBleHBvcnRzID0ganNjb21wLnJlcXVpcmUoanNjb21wLmdldEN1cnJlbnRNb2R1bGVQYXRoKCkpOwogICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lc3BhY2VdID0gewogICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuRVM2LAogICAgICBtb2R1bGVJZDogbmFtZXNwYWNlCiAgICB9OwogIH0KfTsKCgovKioKICogTWFya3MgdGhhdCB0aGUgY3VycmVudCBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcsIGFuZCBuZXZlciBmb3IKICogbGl2ZSBjb2RlIGluIHByb2R1Y3Rpb24uCiAqCiAqIEluIHRoZSBjYXNlIG9mIHVuaXQgdGVzdHMsIHRoZSBtZXNzYWdlIG1heSBvcHRpb25hbGx5IGJlIGFuIGV4YWN0IG5hbWVzcGFjZQogKiBmb3IgdGhlIHRlc3QgKGUuZy4gJ2dvb2cuc3RyaW5nVGVzdCcpLiBUaGUgbGludGVyIHdpbGwgdGhlbiBpZ25vcmUgdGhlIGV4dHJhCiAqIHByb3ZpZGUgKGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIGNvZGUpLgogKgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tZXNzYWdlIE9wdGlvbmFsIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBlcnJvciB0aGF0J3MKICogICAgIHJhaXNlZCB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgogKi8KZ29vZy5zZXRUZXN0T25seSA9IGZ1bmN0aW9uKG9wdF9tZXNzYWdlKSB7CiAgaWYgKGdvb2cuRElTQUxMT1dfVEVTVF9PTkxZX0NPREUpIHsKICAgIG9wdF9tZXNzYWdlID0gb3B0X21lc3NhZ2UgfHwgJyc7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ0ltcG9ydGluZyB0ZXN0LW9ubHkgY29kZSBpbnRvIG5vbi1kZWJ1ZyBlbnZpcm9ubWVudCcgKwogICAgICAgIChvcHRfbWVzc2FnZSA/ICc6ICcgKyBvcHRfbWVzc2FnZSA6ICcuJykpOwogIH0KfTsKCgovKioKICogRm9yd2FyZCBkZWNsYXJlcyBhIHN5bWJvbC4gVGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBjb21waWxlciB0aGF0IHRoZQogKiBzeW1ib2wgbWF5IGJlIHVzZWQgaW4gdGhlIHNvdXJjZSB5ZXQgaXMgbm90IHJlcXVpcmVkIGFuZCBtYXkgbm90IGJlIHByb3ZpZGVkCiAqIGluIGNvbXBpbGF0aW9uLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNhZ2Ugb2YgZm9yd2FyZCBkZWNsYXJhdGlvbiBpcyBjb2RlIHRoYXQgdGFrZXMgYSB0eXBlIGFzIGEKICogZnVuY3Rpb24gcGFyYW1ldGVyIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIHJlcXVpcmUgaXQuIEJ5IGZvcndhcmQgZGVjbGFyaW5nCiAqIGluc3RlYWQgb2YgcmVxdWlyaW5nLCBubyBoYXJkIGRlcGVuZGVuY3kgaXMgbWFkZSwgYW5kIChpZiBub3QgcmVxdWlyZWQKICogZWxzZXdoZXJlKSB0aGUgbmFtZXNwYWNlIG1heSBuZXZlciBiZSByZXF1aXJlZCBhbmQgdGh1cywgbm90IGJlIHB1bGxlZAogKiBpbnRvIHRoZSBKYXZhU2NyaXB0IGJpbmFyeS4gSWYgaXQgaXMgcmVxdWlyZWQgZWxzZXdoZXJlLCBpdCB3aWxsIGJlIHR5cGUKICogY2hlY2tlZCBhcyBub3JtYWwuCiAqCiAqIEJlZm9yZSB1c2luZyBnb29nLmZvcndhcmREZWNsYXJlLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAogKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvd2lraS9CYWQtVHlwZS1Bbm5vdGF0aW9uIHRvCiAqIHVuZGVyc3RhbmQgdGhlIG9wdGlvbnMgYW5kIHRyYWRlb2ZmcyB3aGVuIHdvcmtpbmcgd2l0aCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWVzcGFjZSB0byBmb3J3YXJkIGRlY2xhcmUgaW4gdGhlIGZvcm0gb2YKICogICAgICJnb29nLnBhY2thZ2UucGFydCIuCiAqLwpnb29nLmZvcndhcmREZWNsYXJlID0gZnVuY3Rpb24obmFtZSkge307CgoKLyoqCiAqIEZvcndhcmQgZGVjbGFyZSB0eXBlIGluZm9ybWF0aW9uLiBVc2VkIHRvIGFzc2lnbiB0eXBlcyB0byBnb29nLmdsb2JhbAogKiByZWZlcmVuY2VkIG9iamVjdCB0aGF0IHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdW5rbm93biB0eXBlIHJlZmVyZW5jZXMKICogYW5kIHRodXMgYmxvY2sgcHJvcGVydHkgZGlzYW1iaWd1YXRpb24uCiAqLwpnb29nLmZvcndhcmREZWNsYXJlKCdEb2N1bWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdIVE1MU2NyaXB0RWxlbWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdYTUxIdHRwUmVxdWVzdCcpOwoKCmlmICghQ09NUElMRUQpIHsKICAvKioKICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBoYXMgYmVlbiBnb29nLnByb3ZpZGVkLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGZvcgogICAqIG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbmx5IGFzIGltcGxpY2l0IG5hbWVzcGFjZXMuCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQuCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmlzUHJvdmlkZWRfID0gZnVuY3Rpb24obmFtZSkgewogICAgcmV0dXJuIChuYW1lIGluIGdvb2cubG9hZGVkTW9kdWxlc18pIHx8CiAgICAgICAgKCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV0gJiYgZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZSkgIT0gbnVsbCk7CiAgfTsKCiAgLyoqCiAgICogTmFtZXNwYWNlcyBpbXBsaWNpdGx5IGRlZmluZWQgYnkgZ29vZy5wcm92aWRlLiBGb3IgZXhhbXBsZSwKICAgKiBnb29nLnByb3ZpZGUoJ2dvb2cuZXZlbnRzLkV2ZW50JykgaW1wbGljaXRseSBkZWNsYXJlcyB0aGF0ICdnb29nJyBhbmQKICAgKiAnZ29vZy5ldmVudHMnIG11c3QgYmUgbmFtZXNwYWNlcy4KICAgKgogICAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgKGJvb2xlYW58dW5kZWZpbmVkKT59CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmltcGxpY2l0TmFtZXNwYWNlc18gPSB7J2dvb2cubW9kdWxlJzogdHJ1ZX07CgogIC8vIE5PVEU6IFdlIGFkZCBnb29nLm1vZHVsZSBhcyBhbiBpbXBsaWNpdCBuYW1lc3BhY2UgYXMgZ29vZy5tb2R1bGUgaXMgZGVmaW5lZAogIC8vIGhlcmUgYW5kIGJlY2F1c2UgdGhlIGV4aXN0aW5nIG1vZHVsZSBwYWNrYWdlIGhhcyBub3QgYmVlbiBtb3ZlZCB5ZXQgb3V0IG9mCiAgLy8gdGhlIGdvb2cubW9kdWxlIG5hbWVzcGFjZS4gVGhpcyBzYXRpc2lmaWVzIGJvdGggdGhlIGRlYnVnIGxvYWRlciBhbmQKICAvLyBhaGVhZC1vZi10aW1lIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4KfQoKCi8qKgogKiBSZXR1cm5zIGFuIG9iamVjdCBiYXNlZCBvbiBpdHMgZnVsbHkgcXVhbGlmaWVkIGV4dGVybmFsIG5hbWUuICBUaGUgb2JqZWN0CiAqIGlzIG5vdCBmb3VuZCBpZiBudWxsIG9yIHVuZGVmaW5lZC4gIElmIHlvdSBhcmUgdXNpbmcgYSBjb21waWxhdGlvbiBwYXNzIHRoYXQKICogcmVuYW1lcyBwcm9wZXJ0eSBuYW1lcyBiZXdhcmUgdGhhdCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGZpbmQgcmVuYW1lZAogKiBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X29iaiBUaGUgb2JqZWN0IHdpdGhpbiB3aGljaCB0byBsb29rOyBkZWZhdWx0IGlzCiAqICAgICB8Z29vZy5nbG9iYWx8LgogKiBAcmV0dXJuIHs/fSBUaGUgdmFsdWUgKG9iamVjdCBvciBwcmltaXRpdmUpIG9yLCBpZiBub3QgZm91bmQsIG51bGwuCiAqLwpnb29nLmdldE9iamVjdEJ5TmFtZSA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmopIHsKICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CiAgdmFyIGN1ciA9IG9wdF9vYmogfHwgZ29vZy5nbG9iYWw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgY3VyID0gY3VyW3BhcnRzW2ldXTsKICAgIGlmIChjdXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIGN1cjsKfTsKCgovKioKICogR2xvYmFsaXplcyBhIHdob2xlIG5hbWVzcGFjZSwgc3VjaCBhcyBnb29nIG9yIGdvb2cubGFuZy4KICoKICogQHBhcmFtIHshT2JqZWN0fSBvYmogVGhlIG5hbWVzcGFjZSB0byBnbG9iYWxpemUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X2dsb2JhbCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcHJvcGVydGllcyB0by4KICogQGRlcHJlY2F0ZWQgUHJvcGVydGllcyBtYXkgYmUgZXhwbGljaXRseSBleHBvcnRlZCB0byB0aGUgZ2xvYmFsIHNjb3BlLCBidXQKICogICAgIHRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBkb25lIGluIGJ1bGsuCiAqLwpnb29nLmdsb2JhbGl6ZSA9IGZ1bmN0aW9uKG9iaiwgb3B0X2dsb2JhbCkgewogIHZhciBnbG9iYWwgPSBvcHRfZ2xvYmFsIHx8IGdvb2cuZ2xvYmFsOwogIGZvciAodmFyIHggaW4gb2JqKSB7CiAgICBnbG9iYWxbeF0gPSBvYmpbeF07CiAgfQp9OwoKCi8qKgogKiBBZGRzIGEgZGVwZW5kZW5jeSBmcm9tIGEgZmlsZSB0byB0aGUgZmlsZXMgaXQgcmVxdWlyZXMuCiAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoIFRoZSBwYXRoIHRvIHRoZSBqcyBmaWxlLgogKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGgKICogICAgIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyB0aGlzIGZpbGUgcHJvdmlkZXMuCiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aAogKiAgICAgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzIHRoaXMgZmlsZSByZXF1aXJlcy4KICogQHBhcmFtIHtib29sZWFufCFPYmplY3Q8c3RyaW5nPj19IG9wdF9sb2FkRmxhZ3MgUGFyYW1ldGVycyBpbmRpY2F0aW5nCiAqICAgICBob3cgdGhlIGZpbGUgbXVzdCBiZSBsb2FkZWQuICBUaGUgYm9vbGVhbiAndHJ1ZScgaXMgZXF1aXZhbGVudAogKiAgICAgdG8geydtb2R1bGUnOiAnZ29vZyd9IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIFZhbGlkIHByb3BlcnRpZXMKICogICAgIGFuZCB2YWx1ZXMgaW5jbHVkZSB7J21vZHVsZSc6ICdnb29nJ30gYW5kIHsnbGFuZyc6ICdlczYnfS4KICovCmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncykgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8uYWRkRGVwZW5kZW5jeShyZWxQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIG9wdF9sb2FkRmxhZ3MpOwogIH0KfTsKCgoKCi8vIE5PVEUobm5hemUpOiBUaGUgZGVidWcgRE9NIGxvYWRlciB3YXMgaW5jbHVkZWQgaW4gYmFzZS5qcyBhcyBhbiBvcmlnaW5hbCB3YXkKLy8gdG8gZG8gImRlYnVnLW1vZGUiIGRldmVsb3BtZW50LiAgVGhlIGRlcGVuZGVuY3kgc3lzdGVtIGNhbiBzb21ldGltZXMgYmUKLy8gY29uZnVzaW5nLCBhcyBjYW4gdGhlIGRlYnVnIERPTSBsb2FkZXIncyBhc3luY2hyb25vdXMgbmF0dXJlLgovLwovLyBXaXRoIHRoZSBET00gbG9hZGVyLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgaXMgbm90IGJsb2NraW5nIC0tIHRoZSBzY3JpcHQKLy8gd2lsbCBub3QgbG9hZCB1bnRpbCBzb21lIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHNjcmlwdC4gIElmIGEgbmFtZXNwYWNlIGlzCi8vIG5lZWRlZCBhdCBydW50aW1lLCBpdCBuZWVkcyB0byBiZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgc2NyaXB0LCBvciBsb2FkZWQgdmlhCi8vIHJlcXVpcmUoKSB3aXRoIGl0cyByZWdpc3RlcmVkIGRlcGVuZGVuY2llcy4KLy8KLy8gVXNlci1kZWZpbmVkIG5hbWVzcGFjZXMgbWF5IG5lZWQgdGhlaXIgb3duIGRlcHMgZmlsZS4gRm9yIGEgcmVmZXJlbmNlIG9uCi8vIGNyZWF0aW5nIGEgZGVwcyBmaWxlLCBzZWU6Ci8vIEV4dGVybmFsbHk6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nsb3N1cmUvbGlicmFyeS9kb2NzL2RlcHN3cml0ZXIKLy8KLy8gQmVjYXVzZSBvZiBsZWdhY3kgY2xpZW50cywgdGhlIERPTSBsb2FkZXIgY2FuJ3QgYmUgZWFzaWx5IHJlbW92ZWQgZnJvbQovLyBiYXNlLmpzLiAgV29yayB3YXMgZG9uZSB0byBtYWtlIGl0IGRpc2FibGVhYmxlIG9yIHJlcGxhY2VhYmxlIGZvcgovLyBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChET00tbGVzcyBKYXZhU2NyaXB0IGludGVycHJldGVycyBsaWtlIFJoaW5vIG9yIFY4LAovLyBmb3IgZXhhbXBsZSkuIFNlZSBib290c3RyYXAvIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZGVidWcgbG9hZGVyLgogKgogKiBJZiBlbmFibGVkLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIG5hbWVzcGFjZSBieQogKiBhcHBlbmRpbmcgYSBzY3JpcHQgdGFnIHRvIHRoZSBET00gKGlmIHRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCkuCiAqCiAqIElmIGRpc2FibGVkLCBnb29nLnJlcXVpcmUoKSB3aWxsIHNpbXBseSBhc3NlcnQgdGhhdCB0aGUgbmFtZXNwYWNlIGhhcyBiZWVuCiAqIHByb3ZpZGVkIChhbmQgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgc29tZSBvdXRzaWRlIHRvb2wgY29ycmVjdGx5IG9yZGVyZWQKICogdGhlIHNjcmlwdCkuCiAqLwpnb29nLkVOQUJMRV9ERUJVR19MT0FERVIgPSBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSJywgdHJ1ZSk7CgoKLyoqCiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cKICogQHByaXZhdGUKICovCmdvb2cubG9nVG9Db25zb2xlXyA9IGZ1bmN0aW9uKG1zZykgewogIGlmIChnb29nLmdsb2JhbC5jb25zb2xlKSB7CiAgICBnb29nLmdsb2JhbC5jb25zb2xlWydlcnJvciddKG1zZyk7CiAgfQp9OwoKCi8qKgogKiBJbXBsZW1lbnRzIGEgc3lzdGVtIGZvciB0aGUgZHluYW1pYyByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY2llcyB0aGF0IHdvcmtzIGluCiAqIHBhcmFsbGVsIHdpdGggdGhlIEJVSUxEIHN5c3RlbS4KICoKICogTm90ZSB0aGF0IGFsbCBjYWxscyB0byBnb29nLnJlcXVpcmUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBzZWUgZ29vZy5wcm92aWRlCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30gSWYgY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIGFzc29jaWF0ZWQKICogICAgIG5hbWVzcGFjZSBvciBtb2R1bGUgb3RoZXJ3aXNlIG51bGwuCiAqLwpnb29nLnJlcXVpcmUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICAvLyBNaWdodCBuZWVkIHRvIGxhenkgbG9hZCBvbiBvbGQgSUUuCiAgICBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIGdvb2cuZGVidWdMb2FkZXJfLnJlcXVlc3RlZChuYW1lc3BhY2UpOwogICAgfQoKICAgIC8vIElmIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMgd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lc3BhY2UpKSB7CiAgICAgIGlmIChnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpIHsKICAgICAgICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWVzcGFjZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIHZhciBtb2R1bGVMb2FkZXJTdGF0ZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfOwogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZF8obmFtZXNwYWNlKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG1vZHVsZUxvYWRlclN0YXRlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQp9OwoKCi8qKgogKiBSZXF1aXJlcyBhIHN5bWJvbCBmb3IgaXRzIHR5cGUgaW5mb3JtYXRpb24uIFRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUKICogY29tcGlsZXIgdGhhdCB0aGUgc3ltYm9sIG1heSBhcHBlYXIgaW4gdHlwZSBhbm5vdGF0aW9ucywgeWV0IGl0IGlzIG5vdAogKiByZWZlcmVuY2VkIGF0IHJ1bnRpbWUuCiAqCiAqIFdoZW4gY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUKICogYXNzaWduZWQgdG8gb3IgZGVzdHJ1Y3R1cmVkIGludG8gYSB2YXJpYWJsZSwgYnV0IGl0IG1heSBub3QgYmUgb3RoZXJ3aXNlIHVzZWQKICogaW4gY29kZSBvdXRzaWRlIG9mIGEgdHlwZSBhbm5vdGF0aW9uLgogKgogKiBOb3RlIHRoYXQgYWxsIGNhbGxzIHRvIGdvb2cucmVxdWlyZVR5cGUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30KICovCmdvb2cucmVxdWlyZVR5cGUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHNvIHRoYXQgc2luZ2xlLWxldmVsIGRlc3RydWN0dXJpbmcgb2YgdGhlIHJldHVybgogIC8vIHZhbHVlIGRvZXNuJ3QgY3Jhc2ggYXQgcnVudGltZSB3aGVuIHVzaW5nIHRoZSBkZWJ1ZyBsb2FkZXIuIE11bHRpLWxldmVsCiAgLy8gZGVzdHJ1Y3R1cmluZyBpc24ndCBzdXBwb3J0ZWQuCiAgcmV0dXJuIHt9Owp9OwoKCi8qKgogKiBQYXRoIGZvciBpbmNsdWRlZCBzY3JpcHRzLgogKiBAdHlwZSB7c3RyaW5nfQogKi8KZ29vZy5iYXNlUGF0aCA9ICcnOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGJhc2UgcGF0aC4KICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSDsKCgovKioKICogV2hldGhlciB0byBhdHRlbXB0IHRvIGxvYWQgQ2xvc3VyZSdzIGRlcHMgZmlsZS4gQnkgZGVmYXVsdCwgd2hlbiB1bmNvbXBpbGVkLAogKiBkZXBzIGZpbGVzIHdpbGwgYXR0ZW1wdCB0byBiZSBsb2FkZWQuCiAqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUzsKCgovKioKICogQSBmdW5jdGlvbiB0byBpbXBvcnQgYSBzaW5nbGUgc2NyaXB0LiBUaGlzIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gd2hlbgogKiBDbG9zdXJlIGlzIGJlaW5nIHJ1biBpbiBub24tSFRNTCBjb250ZXh0cywgc3VjaCBhcyB3ZWIgd29ya2Vycy4gSXQncyBkZWZpbmVkCiAqIGluIHRoZSBnbG9iYWwgc2NvcGUgc28gdGhhdCBpdCBjYW4gYmUgc2V0IGJlZm9yZSBiYXNlLmpzIGlzIGxvYWRlZCwgd2hpY2gKICogYWxsb3dzIGRlcHMuanMgdG8gYmUgaW1wb3J0ZWQgcHJvcGVybHkuCiAqCiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNjcmlwdCBzb3VyY2UsIHdoaWNoIGlzIGEgcmVsYXRpdmUgVVJJLiBUaGUgc2Vjb25kLAogKiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdGhlIHNjcmlwdCBjb250ZW50cywgaW4gdGhlIGV2ZW50IHRoZSBzY3JpcHQgbmVlZGVkCiAqIHRyYW5zZm9ybWF0aW9uLiBJdCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHNjcmlwdCB3YXMgaW1wb3J0ZWQsIGZhbHNlCiAqIG90aGVyd2lzZS4KICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcsIHN0cmluZz0pOiBib29sZWFuKXx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQ7CgoKLyoqCiAqIE51bGwgZnVuY3Rpb24gdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY2FsbGJhY2tzLCBldGMuCiAqIEByZXR1cm4ge3ZvaWR9IE5vdGhpbmcuCiAqLwpnb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge307CgoKLyoqCiAqIFdoZW4gZGVmaW5pbmcgYSBjbGFzcyBGb28gd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QgYmFyKCksIHlvdSBjYW4gZG86CiAqIEZvby5wcm90b3R5cGUuYmFyID0gZ29vZy5hYnN0cmFjdE1ldGhvZAogKgogKiBOb3cgaWYgYSBzdWJjbGFzcyBvZiBGb28gZmFpbHMgdG8gb3ZlcnJpZGUgYmFyKCksIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duCiAqIHdoZW4gYmFyKCkgaXMgaW52b2tlZC4KICoKICogQHR5cGUgeyFGdW5jdGlvbn0KICogQHRocm93cyB7RXJyb3J9IHdoZW4gaW52b2tlZCB0byBpbmRpY2F0ZSB0aGUgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuLgogKiBAZGVwcmVjYXRlZCBVc2UgIkBhYnN0cmFjdCIgYW5ub3RhdGlvbiBpbnN0ZWFkIG9mIGdvb2cuYWJzdHJhY3RNZXRob2QgaW4gbmV3CiAqICAgICBjb2RlLiBTZWUKICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci93aWtpL0BhYnN0cmFjdC1jbGFzc2VzLWFuZC1tZXRob2RzCiAqLwpnb29nLmFic3RyYWN0TWV0aG9kID0gZnVuY3Rpb24oKSB7CiAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZCcpOwp9OwoKCi8qKgogKiBBZGRzIGEgYGdldEluc3RhbmNlYCBzdGF0aWMgbWV0aG9kIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUKICogaW5zdGFuY2Ugb2JqZWN0LgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RvciBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcyB0byBhZGQgdGhlIHN0YXRpYwogKiAgICAgbWV0aG9kIHRvLgogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSAnaW5zdGFuY2VfJyBpc24ndCBhIHByb3BlcnR5IG9uICdGdW5jdGlvbicKICogICAgIGJ1dCB3ZSBkb24ndCBoYXZlIGEgYmV0dGVyIHR5cGUgdG8gdXNlIGhlcmUuCiAqLwpnb29nLmFkZFNpbmdsZXRvbkdldHRlciA9IGZ1bmN0aW9uKGN0b3IpIHsKICAvLyBpbnN0YW5jZV8gaXMgaW1tZWRpYXRlbHkgc2V0IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggc2VhbGVkIGNvbnN0cnVjdG9ycwogIC8vIHN1Y2ggYXMgYXJlIGVuY291bnRlcmVkIHdoZW4gYSBjb25zdHJ1Y3RvciBpcyByZXR1cm5lZCBhcyB0aGUgZXhwb3J0IG9iamVjdAogIC8vIG9mIGEgZ29vZy5tb2R1bGUgaW4gdW5vcHRpbWl6ZWQgY29kZS4KICAvLyBEZWxjYXJlIHR5cGUgdG8gYXZvaWQgY29uZm9ybWFuY2UgdmlvbGF0aW9ucyB0aGF0IGN0b3IuaW5zdGFuY2VfIGlzIHVua25vd24KICAvKiogQHR5cGUge3VuZGVmaW5lZHwhT2JqZWN0fSBAc3VwcHJlc3Mge3VuZGVyc2NvcmV9ICovCiAgY3Rvci5pbnN0YW5jZV8gPSB1bmRlZmluZWQ7CiAgY3Rvci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN0b3IuaW5zdGFuY2VfKSB7CiAgICAgIHJldHVybiBjdG9yLmluc3RhbmNlXzsKICAgIH0KICAgIGlmIChnb29nLkRFQlVHKSB7CiAgICAgIC8vIE5PVEU6IEpTQ29tcGlsZXIgY2FuJ3Qgb3B0aW1pemUgYXdheSBBcnJheSNwdXNoLgogICAgICBnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfW2dvb2cuaW5zdGFudGlhdGVkU2luZ2xldG9uc18ubGVuZ3RoXSA9IGN0b3I7CiAgICB9CiAgICAvLyBDYXN0IHRvIGF2b2lkIGNvbmZvcm1hbmNlIHZpb2xhdGlvbnMgdGhhdCBjdG9yLmluc3RhbmNlXyBpcyB1bmtub3duCiAgICByZXR1cm4gLyoqIEB0eXBlIHshT2JqZWN0fHVuZGVmaW5lZH0gKi8gKGN0b3IuaW5zdGFuY2VfKSA9IG5ldyBjdG9yOwogIH07Cn07CgoKLyoqCiAqIEFsbCBzaW5nbGV0b24gY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIGZvciB0ZXN0aW5nLiBEb24ndCByZWFkCiAqIGl0IGRpcmVjdGx5LCB1c2UgdGhlIGBnb29nLnRlc3Rpbmcuc2luZ2xldG9uYCBtb2R1bGUuIFRoZSBjb21waWxlcgogKiByZW1vdmVzIHRoaXMgdmFyaWFibGUgaWYgdW51c2VkLgogKiBAdHlwZSB7IUFycmF5PCFGdW5jdGlvbj59CiAqIEBwcml2YXRlCiAqLwpnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfID0gW107CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gbG9hZCBnb29nLm1vZHVsZXMgdXNpbmcgYGV2YWxgIHdoZW4gdXNpbmcKICogdGhlIGRlYnVnIGxvYWRlci4gIFRoaXMgcHJvdmlkZXMgYSBiZXR0ZXIgZGVidWdnaW5nIGV4cGVyaWVuY2UgYXMgdGhlCiAqIHNvdXJjZSBpcyB1bm1vZGlmaWVkIGFuZCBjYW4gYmUgZWRpdGVkIHVzaW5nIENocm9tZSBXb3Jrc3BhY2VzIG9yIHNpbWlsYXIuCiAqIEhvd2V2ZXIgaW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIHVzZSBvZiBgZXZhbGAgaXMgYmFubmVkCiAqIHNvIHdlIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUuCiAqLwpnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgPSBnb29nLmRlZmluZSgnZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGV4cG9ydHMgb2YgZ29vZy5tb2R1bGVzIHNob3VsZCBiZSBzZWFsZWQgd2hlbgogKiBwb3NzaWJsZS4KICovCmdvb2cuU0VBTF9NT0RVTEVfRVhQT1JUUyA9IGdvb2cuZGVmaW5lKCdnb29nLlNFQUxfTU9EVUxFX0VYUE9SVFMnLCBnb29nLkRFQlVHKTsKCgovKioKICogVGhlIHJlZ2lzdHJ5IG9mIGluaXRpYWxpemVkIG1vZHVsZXM6CiAqIFRoZSBtb2R1bGUgaWRlbnRpZmllciBvciBwYXRoIHRvIG1vZHVsZSBleHBvcnRzIG1hcC4KICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywge2V4cG9ydHM6Pyx0eXBlOnN0cmluZyxtb2R1bGVJZDpzdHJpbmd9Pn0KICovCmdvb2cubG9hZGVkTW9kdWxlc18gPSB7fTsKCgovKioKICogVHJ1ZSBpZiB0aGUgZGVidWcgbG9hZGVyIGVuYWJsZWQgYW5kIHVzZWQuCiAqIEBjb25zdCB7Ym9vbGVhbn0KICovCmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQgPSAhQ09NUElMRUQgJiYgZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IEhvdyB0byBkZWNpZGUgd2hldGhlciB0byB0cmFuc3BpbGUuICBWYWxpZCB2YWx1ZXMKICogYXJlICdhbHdheXMnLCAnbmV2ZXInLCBhbmQgJ2RldGVjdCcuICBUaGUgZGVmYXVsdCAoJ2RldGVjdCcpIGlzIHRvCiAqIHVzZSBmZWF0dXJlIGRldGVjdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbGFuZ3VhZ2UgbGV2ZWxzIG5lZWQKICogdHJhbnNwaWxhdGlvbi4KICovCi8vIE5PVEUoc2RoKTogd2UgY291bGQgZXhwYW5kIHRoaXMgdG8gYWNjZXB0IGEgbGFuZ3VhZ2UgbGV2ZWwgdG8gYnlwYXNzCi8vIGRldGVjdGlvbjogZS5nLiBnb29nLlRSQU5TUElMRSA9PSAnZXM1JyB3b3VsZCB0cmFuc3BpbGUgRVM2IGZpbGVzIGJ1dAovLyB3b3VsZCBsZWF2ZSBFUzMgYW5kIEVTNSBmaWxlcyBhbG9uZS4KZ29vZy5UUkFOU1BJTEUgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEUnLCAnZGV0ZWN0Jyk7CgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gSWYgdHJ1ZSBhc3N1bWUgdGhhdCBFUyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBiZWVuCiAqIHRyYW5zcGlsZWQgYnkgdGhlIGpzY29tcGlsZXIgKGluIHRoZSBzYW1lIHdheSB0aGF0IHRyYW5zcGlsZS5qcyB3b3VsZAogKiB0cmFuc3BpbGUgdGhlbSAtIHRvIGpzY29tcCBtb2R1bGVzKS4gVXNlZnVsIG9ubHkgZm9yIHNlcnZlcnMgdGhhdCB3aXNoIHRvIHVzZQogKiB0aGUgZGVidWcgbG9hZGVyIGFuZCB0cmFuc3BpbGUgc2VydmVyIHNpZGUuIFRodXMgdGhpcyBpcyBvbmx5IHJlc3BlY3RlZCBpZgogKiBnb29nLlRSQU5TUElMRSBpcyAibmV2ZXIiLgogKi8KZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gSWYgYSBmaWxlIG5lZWRzIHRvIGJlIHRyYW5zcGlsZWQgd2hhdCB0aGUgb3V0cHV0IGxhbmd1YWdlCiAqIHNob3VsZCBiZS4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBoaWdoZXN0IGxhbmd1YWdlIGxldmVsIHRoaXMgZmlsZSBkZXRlY3RzCiAqIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzLiBHZW5lcmFsbHkgdGhpcyBmbGFnIHNob3VsZCBub3QgYmUgc2V0LCBidXQKICogaXQgY291bGQgYmUgdXNlZnVsIHRvIG92ZXJyaWRlLiBFeGFtcGxlOiBJZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cwogKiBFUzYgdGhlbiBieSBkZWZhdWx0IEVTNysgZmlsZXMgd2lsbCBiZSB0cmFuc3BpbGVkIHRvIEVTNiwgdW5sZXNzIHRoaXMgaXMKICogb3ZlcnJpZGRlbi4KICoKICogVmFsaWQgdmFsdWVzIGluY2x1ZGU6IGVzMywgZXM1LCBlczYsIGVzNywgYW5kIGVzOC4gQW55dGhpbmcgbm90IHJlY29nbml6ZWQKICogaXMgdHJlYXRlZCBhcyBlczMuCiAqCiAqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdmFsdWUgZG9lcyBub3QgZm9yY2UgdHJhbnNwaWxhdGlvbi4gSnVzdCBpZgogKiB0cmFuc3BpbGF0aW9uIG9jY3VycyB0aGlzIHdpbGwgYmUgdGhlIG91dHB1dC4gU28gdGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuCiAqIGdvb2cuVFJBTlNQSUxFIGlzIHNldCB0byAnYWx3YXlzJyBhbmQgdGhlbiBmb3JjaW5nIHRoZSBsYW5ndWFnZSBsZXZlbCB0byBiZQogKiBzb21ldGhpbmcgbG93ZXIgdGhhbiB3aGF0IHRoZSBlbnZpcm9ubWVudCBkZXRlY3RzLgogKi8KZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UnLCAnJyk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gUGF0aCB0byB0aGUgdHJhbnNwaWxlci4gIEV4ZWN1dGluZyB0aGUgc2NyaXB0IGF0IHRoaXMKICogcGF0aCAocmVsYXRpdmUgdG8gYmFzZS5qcykgc2hvdWxkIGRlZmluZSBhIGZ1bmN0aW9uICRqc2NvbXAudHJhbnNwaWxlLgogKi8KZ29vZy5UUkFOU1BJTEVSID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJBTlNQSUxFUicsICd0cmFuc3BpbGUuanMnKTsKCgovKioKICogQHBhY2thZ2Ugez9ib29sZWFufQogKiBWaXNpYmxlIGZvciB0ZXN0aW5nLgogKi8KZ29vZy5oYXNCYWRMZXRTY29waW5nID0gbnVsbDsKCgovKioKICogQHJldHVybiB7Ym9vbGVhbn0KICogQHBhY2thZ2UgVmlzaWJsZSBmb3IgdGVzdGluZy4KICovCmdvb2cudXNlU2FmYXJpMTBXb3JrYXJvdW5kID0gZnVuY3Rpb24oKSB7CiAgaWYgKGdvb2cuaGFzQmFkTGV0U2NvcGluZyA9PSBudWxsKSB7CiAgICB2YXIgaGFzQmFkTGV0U2NvcGluZzsKICAgIHRyeSB7CiAgICAgIGhhc0JhZExldFNjb3BpbmcgPSAhZXZhbCgKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArCiAgICAgICAgICAnbGV0IHggPSAxOyBmdW5jdGlvbiBmKCkgeyByZXR1cm4gdHlwZW9mIHg7IH07JyArCiAgICAgICAgICAnZigpID09ICJudW1iZXIiOycpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBBc3N1bWUgdGhhdCBFUzYgc3ludGF4IGlzbid0IHN1cHBvcnRlZC4KICAgICAgaGFzQmFkTGV0U2NvcGluZyA9IGZhbHNlOwogICAgfQogICAgZ29vZy5oYXNCYWRMZXRTY29waW5nID0gaGFzQmFkTGV0U2NvcGluZzsKICB9CiAgcmV0dXJuIGdvb2cuaGFzQmFkTGV0U2NvcGluZzsKfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZURlZgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqIEBwYWNrYWdlIFZpc2libGUgZm9yIHRlc3RpbmcuCiAqLwpnb29nLndvcmthcm91bmRTYWZhcmkxMEV2YWxCdWcgPSBmdW5jdGlvbihtb2R1bGVEZWYpIHsKICByZXR1cm4gJyhmdW5jdGlvbigpeycgKyBtb2R1bGVEZWYgKwogICAgICAnXG4nICsgIC8vIFRlcm1pbmF0ZSBhbnkgdHJhaWxpbmcgc2luZ2xlIGxpbmUgY29tbWVudC4KICAgICAgJzsnICsgICAvLyBUZXJtaW5hdGUgYW55IHRyYWlsaW5nIGV4cHJlc3Npb24uCiAgICAgICd9KSgpO1xuJzsKfTsKCgovKioKICogQHBhcmFtIHtmdW5jdGlvbig/KTo/fHN0cmluZ30gbW9kdWxlRGVmIFRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KICovCmdvb2cubG9hZE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZURlZikgewogIC8vIE5PVEU6IHdlIGFsbG93IGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlIGVpdGhlciBpbiB0aGUgZnJvbQogIC8vIG9mIGEgc3RyaW5nIHRvIGV2YWwgKHdoaWNoIGtlZXBzIHRoZSBvcmlnaW5hbCBzb3VyY2UgaW50YWN0KSBvcgogIC8vIGluIGEgZXZhbCBmb3JiaWRkZW4gZW52aXJvbm1lbnQgKENTUCkgd2UgYWxsb3cgYSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgLy8gd2hpY2ggaW4gaXRzIGJvZHkgbXVzdCBjYWxsIGBnb29nLm1vZHVsZWAsIGFuZCByZXR1cm4gdGhlIGV4cG9ydHMKICAvLyBvZiB0aGUgbW9kdWxlLgogIHZhciBwcmV2aW91c1N0YXRlID0gZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV87CiAgdHJ5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICBtb2R1bGVOYW1lOiAnJywKICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UsCiAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HCiAgICB9OwogICAgdmFyIGV4cG9ydHM7CiAgICBpZiAoZ29vZy5pc0Z1bmN0aW9uKG1vZHVsZURlZikpIHsKICAgICAgZXhwb3J0cyA9IG1vZHVsZURlZi5jYWxsKHVuZGVmaW5lZCwge30pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlRGVmID09PSAnc3RyaW5nJykgewogICAgICBpZiAoZ29vZy51c2VTYWZhcmkxMFdvcmthcm91bmQoKSkgewogICAgICAgIG1vZHVsZURlZiA9IGdvb2cud29ya2Fyb3VuZFNhZmFyaTEwRXZhbEJ1Zyhtb2R1bGVEZWYpOwogICAgICB9CgogICAgICBleHBvcnRzID0gZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8uY2FsbCh1bmRlZmluZWQsIG1vZHVsZURlZik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGRlZmluaXRpb24nKTsKICAgIH0KCiAgICB2YXIgbW9kdWxlTmFtZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7CiAgICBpZiAodHlwZW9mIG1vZHVsZU5hbWUgPT09ICdzdHJpbmcnICYmIG1vZHVsZU5hbWUpIHsKICAgICAgLy8gRG9uJ3Qgc2VhbCBsZWdhY3kgbmFtZXNwYWNlcyBhcyB0aGV5IG1heSBiZSB1c2VkIGFzIGEgcGFyZW50IG9mCiAgICAgIC8vIGFub3RoZXIgbmFtZXNwYWNlCiAgICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKSB7CiAgICAgICAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG1vZHVsZU5hbWUsIGV4cG9ydHMpOwogICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgZ29vZy5TRUFMX01PRFVMRV9FWFBPUlRTICYmIE9iamVjdC5zZWFsICYmCiAgICAgICAgICB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICE9IG51bGwpIHsKICAgICAgICBPYmplY3Quc2VhbChleHBvcnRzKTsKICAgICAgfQoKICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgZXhwb3J0czogZXhwb3J0cywKICAgICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuR09PRywKICAgICAgICBtb2R1bGVJZDogZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZQogICAgICB9OwogICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZU5hbWVdID0gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2R1bGUgbmFtZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiJyk7CiAgICB9CiAgfSBmaW5hbGx5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gcHJldmlvdXNTdGF0ZTsKICB9Cn07CgoKLyoqCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8gPSAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6P30gKi8gKGZ1bmN0aW9uKCkgewogIC8vIE5PVEU6IHdlIGF2b2lkIGRlY2xhcmluZyBwYXJhbWV0ZXJzIG9yIGxvY2FsIHZhcmlhYmxlcyBoZXJlIHRvIGF2b2lkCiAgLy8gbWFza2luZyBnbG9iYWxzIG9yIGxlYWtpbmcgdmFsdWVzIGludG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLgogICd1c2Ugc3RyaWN0JzsKICB2YXIgZXhwb3J0cyA9IHt9OwogIGV2YWwoYXJndW1lbnRzWzBdKTsKICByZXR1cm4gZXhwb3J0czsKfSk7CgoKLyoqCiAqIE5vcm1hbGl6ZSBhIGZpbGUgcGF0aCBieSByZW1vdmluZyByZWR1bmRhbnQgIi4uIiBhbmQgZXh0cmFuZW91cyAiLiIgZmlsZQogKiBwYXRoIGNvbXBvbmVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cubm9ybWFsaXplUGF0aF8gPSBmdW5jdGlvbihwYXRoKSB7CiAgdmFyIGNvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgY29tcG9uZW50cy5sZW5ndGgpIHsKICAgIGlmIChjb21wb25lbnRzW2ldID09ICcuJykgewogICAgICBjb21wb25lbnRzLnNwbGljZShpLCAxKTsKICAgIH0gZWxzZSBpZiAoCiAgICAgICAgaSAmJiBjb21wb25lbnRzW2ldID09ICcuLicgJiYgY29tcG9uZW50c1tpIC0gMV0gJiYKICAgICAgICBjb21wb25lbnRzW2kgLSAxXSAhPSAnLi4nKSB7CiAgICAgIGNvbXBvbmVudHMuc3BsaWNlKC0taSwgMik7CiAgICB9IGVsc2UgewogICAgICBpKys7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnRzLmpvaW4oJy8nKTsKfTsKCgovKioKICogUHJvdmlkZXMgYSBob29rIGZvciBsb2FkaW5nIGEgZmlsZSB3aGVuIHVzaW5nIENsb3N1cmUncyBnb29nLnJlcXVpcmUoKSBBUEkKICogd2l0aCBnb29nLm1vZHVsZXMuICBJbiBwYXJ0aWN1bGFyIHRoaXMgaG9vayBpcyBwcm92aWRlZCB0byBzdXBwb3J0IE5vZGUuanMuCiAqCiAqIEB0eXBlIHsoZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmcpfHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkM7CgoKLyoqCiAqIExvYWRzIGZpbGUgYnkgc3luY2hyb25vdXMgWEhSLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgU291cmNlIFVSTC4KICogQHJldHVybiB7P3N0cmluZ30gRmlsZSBjb250ZW50cywgb3IgbnVsbCBpZiBsb2FkIGZhaWxlZC4KICogQHByaXZhdGUKICovCmdvb2cubG9hZEZpbGVTeW5jXyA9IGZ1bmN0aW9uKHNyYykgewogIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9MT0FEX0ZJTEVfU1lOQyhzcmMpOwogIH0gZWxzZSB7CiAgICB0cnkgewogICAgICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqLwogICAgICB2YXIgeGhyID0gbmV3IGdvb2cuZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddKCk7CiAgICAgIHhoci5vcGVuKCdnZXQnLCBzcmMsIGZhbHNlKTsKICAgICAgeGhyLnNlbmQoKTsKICAgICAgLy8gTk9URTogU3VjY2Vzc2Z1bCBodHRwOiByZXF1ZXN0cyBoYXZlIGEgc3RhdHVzIG9mIDIwMCwgYnV0IHN1Y2Nlc3NmdWwKICAgICAgLy8gZmlsZTogcmVxdWVzdHMgbWF5IGhhdmUgYSBzdGF0dXMgb2YgemVyby4gIEFueSBvdGhlciBzdGF0dXMsIG9yIGEKICAgICAgLy8gdGhyb3duIGV4Y2VwdGlvbiAocGFydGljdWxhcmx5IGluIGNhc2Ugb2YgZmlsZTogcmVxdWVzdHMpIGluZGljYXRlcwogICAgICAvLyBzb21lIHNvcnQgb2YgZXJyb3IsIHdoaWNoIHdlIHRyZWF0IGFzIGEgbWlzc2luZyBvciB1bmF2YWlsYWJsZSBmaWxlLgogICAgICByZXR1cm4geGhyLnN0YXR1cyA9PSAwIHx8IHhoci5zdGF0dXMgPT0gMjAwID8geGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgLy8gTm8gbmVlZCB0byByZXRocm93IG9yIGxvZywgc2luY2UgZXJyb3JzIHNob3VsZCBzaG93IHVwIG9uIHRoZWlyIG93bi4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKCi8qKgogKiBMYXppbHkgcmV0cmlldmVzIHRoZSB0cmFuc3BpbGVyIGFuZCBhcHBsaWVzIGl0IHRvIHRoZSBzb3VyY2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdGhlIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgTGFuZ3VhZ2UgbGV2ZWwgb3V0cHV0LgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAqIEBwcml2YXRlCiAqLwpnb29nLnRyYW5zcGlsZV8gPSBmdW5jdGlvbihjb2RlLCBwYXRoLCB0YXJnZXQpIHsKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICBpZiAoIWpzY29tcCkgewogICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXSA9IGpzY29tcCA9IHt9OwogIH0KICB2YXIgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZTsKICBpZiAoIXRyYW5zcGlsZSkgewogICAgdmFyIHRyYW5zcGlsZXJQYXRoID0gZ29vZy5iYXNlUGF0aCArIGdvb2cuVFJBTlNQSUxFUjsKICAgIHZhciB0cmFuc3BpbGVyQ29kZSA9IGdvb2cubG9hZEZpbGVTeW5jXyh0cmFuc3BpbGVyUGF0aCk7CiAgICBpZiAodHJhbnNwaWxlckNvZGUpIHsKICAgICAgLy8gVGhpcyBtdXN0IGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHksIHNpbmNlIGJ5IHRoZSB0aW1lIHdlIGtub3cgd2UKICAgICAgLy8gbmVlZCBpdCwgd2UncmUgYWJvdXQgdG8gbG9hZCBhbmQgd3JpdGUgdGhlIEVTNiBjb2RlIHN5bmNocm9ub3VzbHksCiAgICAgIC8vIHNvIGEgbm9ybWFsIHNjcmlwdC10YWcgbG9hZCB3aWxsIGJlIHRvbyBzbG93LiBXcmFwcGVkIGluIGEgZnVuY3Rpb24KICAgICAgLy8gc28gdGhhdCBjb2RlIGlzIGV2YWwnZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgKDAsIGV2YWwpKHRyYW5zcGlsZXJDb2RlICsgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdHJhbnNwaWxlclBhdGgpOwogICAgICB9KS5jYWxsKGdvb2cuZ2xvYmFsKTsKICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHRyYW5zcGlsZXIgaXMgb3B0aW9uYWwsIGlmICRnd3RFeHBvcnQgaXMgZm91bmQsIGl0J3MKICAgICAgLy8gYSBzaWduIHRoZSB0cmFuc3BpbGVyIHdhcyBsb2FkZWQgYW5kIHRoZSAkanNjb21wLnRyYW5zcGlsZSAqc2hvdWxkKgogICAgICAvLyBiZSB0aGVyZS4KICAgICAgaWYgKGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10gJiYgZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddICYmCiAgICAgICAgICAhZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddWyd0cmFuc3BpbGUnXSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ1RoZSB0cmFuc3BpbGVyIGRpZCBub3QgcHJvcGVybHkgZXhwb3J0IHRoZSAidHJhbnNwaWxlIiAnICsKICAgICAgICAgICAgJ21ldGhvZC4gJGd3dEV4cG9ydDogJyArIEpTT04uc3RyaW5naWZ5KGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10pKTsKICAgICAgfQogICAgICAvLyB0cmFuc3BpbGUuanMgb25seSBleHBvcnRzIGEgc2luZ2xlICRqc2NvbXAgZnVuY3Rpb24sIHRyYW5zcGlsZS4gV2UKICAgICAgLy8gZ3JhYiBqdXN0IHRoYXQgYW5kIGFkZCBpdCB0byB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBvZiAkanNjb21wIHdoaWNoCiAgICAgIC8vIGNvbnRhaW5zIHRoZSBwb2x5ZmlsbHMuCiAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ10udHJhbnNwaWxlID0KICAgICAgICAgIGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J11bJyRqc2NvbXAnXVsndHJhbnNwaWxlJ107CiAgICAgIGpzY29tcCA9IGdvb2cuZ2xvYmFsWyckanNjb21wJ107CiAgICAgIHRyYW5zcGlsZSA9IGpzY29tcC50cmFuc3BpbGU7CiAgICB9CiAgfQogIGlmICghdHJhbnNwaWxlKSB7CiAgICAvLyBUaGUgdHJhbnNwaWxlciBpcyBhbiBvcHRpb25hbCBjb21wb25lbnQuICBJZiBpdCdzIG5vdCBhdmFpbGFibGUgdGhlbgogICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgcGFzcy10aHJvdWdoIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGxvZ3MuCiAgICB2YXIgc3VmZml4ID0gJyByZXF1aXJlcyB0cmFuc3BpbGF0aW9uIGJ1dCBubyB0cmFuc3BpbGVyIHdhcyBmb3VuZC4nOwogICAgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZSA9IGZ1bmN0aW9uKGNvZGUsIHBhdGgpIHsKICAgICAgLy8gVE9ETyhzZGgpOiBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGdldCB0aGlzIGVycm9yIHRvIHNob3cgdXAKICAgICAgLy8gaW4gdGVzdCByZXN1bHRzLCBub3RpbmcgdGhhdCB0aGUgZmFpbHVyZSBtYXkgb2NjdXIgaW4gbWFueQogICAgICAvLyBkaWZmZXJlbnQgd2F5cywgaW5jbHVkaW5nIGluIGxvYWRNb2R1bGUoKSBiZWZvcmUgdGhlIHRlc3QKICAgICAgLy8gcnVubmVyIGV2ZW4gY29tZXMgdXAuCiAgICAgIGdvb2cubG9nVG9Db25zb2xlXyhwYXRoICsgc3VmZml4KTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9OwogIH0KICAvLyBOb3RlOiBhbnkgdHJhbnNwaWxhdGlvbiBlcnJvcnMvd2FybmluZ3Mgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCiAgcmV0dXJuIHRyYW5zcGlsZShjb2RlLCBwYXRoLCB0YXJnZXQpOwp9OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTGFuZ3VhZ2UgRW5oYW5jZW1lbnRzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKLyoqCiAqIFRoaXMgaXMgYSAiZml4ZWQiIHZlcnNpb24gb2YgdGhlIHR5cGVvZiBvcGVyYXRvci4gIEl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZW9mCiAqIG9wZXJhdG9yIGluIHN1Y2ggYSB3YXkgdGhhdCBudWxsIHJldHVybnMgJ251bGwnIGFuZCBhcnJheXMgcmV0dXJuICdhcnJheScuCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZSBvZi4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KICovCmdvb2cudHlwZU9mID0gZnVuY3Rpb24odmFsdWUpIHsKICB2YXIgcyA9IHR5cGVvZiB2YWx1ZTsKICBpZiAocyA9PSAnb2JqZWN0JykgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIC8vIENoZWNrIHRoZXNlIGZpcnN0LCBzbyB3ZSBjYW4gYXZvaWQgY2FsbGluZyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIGlmCiAgICAgIC8vIHBvc3NpYmxlLgogICAgICAvLwogICAgICAvLyBJRSBpbXByb3Blcmx5IG1hcnNoYWxzIHR5cGVvZiBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLCBidXQgYQogICAgICAvLyBjcm9zcy1jb250ZXh0IG9iamVjdCB3aWxsIHN0aWxsIHJldHVybiBmYWxzZSBmb3IgImluc3RhbmNlb2YgT2JqZWN0Ii4KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICByZXR1cm4gJ2FycmF5JzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIHJldHVybiBzOwogICAgICB9CgogICAgICAvLyBIQUNLOiBJbiBvcmRlciB0byB1c2UgYW4gT2JqZWN0IHByb3RvdHlwZSBtZXRob2Qgb24gdGhlIGFyYml0cmFyeQogICAgICAvLyAgIHZhbHVlLCB0aGUgY29tcGlsZXIgcmVxdWlyZXMgdGhlIHZhbHVlIGJlIGNhc3QgdG8gdHlwZSBPYmplY3QsCiAgICAgIC8vICAgZXZlbiB0aG91Z2ggdGhlIEVDTUEgc3BlYyBleHBsaWNpdGx5IGFsbG93cyBpdC4KICAgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKHZhbHVlKSk7CiAgICAgIC8vIEluIEZpcmVmb3ggMy42LCBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgd2luZG93IG9iamVjdHMnIGxlbmd0aAogICAgICAvLyBwcm9wZXJ0eSB0aHJvd3MgYW4gTlNfRVJST1JfRkFJTFVSRSwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKICAgICAgLy8gaGVyZS4KICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnW29iamVjdCBXaW5kb3ddJykgewogICAgICAgIHJldHVybiAnb2JqZWN0JzsKICAgICAgfQoKICAgICAgLy8gV2UgY2Fubm90IGFsd2F5cyB1c2UgY29uc3RydWN0b3IgPT0gQXJyYXkgb3IgaW5zdGFuY2VvZiBBcnJheSBiZWNhdXNlCiAgICAgIC8vIGRpZmZlcmVudCBmcmFtZXMgaGF2ZSBkaWZmZXJlbnQgQXJyYXkgb2JqZWN0cy4gSW4gSUU2LCBpZiB0aGUgaWZyYW1lCiAgICAgIC8vIHdoZXJlIHRoZSBhcnJheSB3YXMgY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHRoZSBhcnJheSBsb3NlcyBpdHMKICAgICAgLy8gcHJvdG90eXBlLiBUaGVuIGRlcmVmZXJlbmNpbmcgdmFsLnNwbGljZSBoZXJlIHRocm93cyBhbiBleGNlcHRpb24sIHNvCiAgICAgIC8vIHdlIGNhbid0IHVzZSBnb29nLmlzRnVuY3Rpb24uIENhbGxpbmcgdHlwZW9mIGRpcmVjdGx5IHJldHVybnMgJ3Vua25vd24nCiAgICAgIC8vIHNvIHRoYXQgd2lsbCB3b3JrLiBJbiB0aGlzIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgYW5kCiAgICAgIC8vIG1vc3QgYXJyYXkgZnVuY3Rpb25zIHdpbGwgc3RpbGwgd29yayBiZWNhdXNlIHRoZSBhcnJheSBpcyBzdGlsbAogICAgICAvLyBhcnJheS1saWtlIChzdXBwb3J0cyBsZW5ndGggYW5kIFtdKSBldmVuIHRob3VnaCBpdCBoYXMgbG9zdCBpdHMKICAgICAgLy8gcHJvdG90eXBlLgogICAgICAvLyBNYXJrIE1pbGxlciBub3RpY2VkIHRoYXQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZwogICAgICAvLyBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmZvcmdlYWJsZSBbW0NsYXNzXV0gcHJvcGVydHkuCiAgICAgIC8vICAxNS4yLjQuMiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICggKQogICAgICAvLyAgV2hlbiB0aGUgdG9TdHJpbmcgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgIC8vICAgICAgMS4gR2V0IHRoZSBbW0NsYXNzXV0gcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuCiAgICAgIC8vICAgICAgMi4gQ29tcHV0ZSBhIHN0cmluZyB2YWx1ZSBieSBjb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBzdHJpbmdzCiAgICAgIC8vICAgICAgICAgIltvYmplY3QgIiwgUmVzdWx0KDEpLCBhbmQgIl0iLgogICAgICAvLyAgICAgIDMuIFJldHVybiBSZXN1bHQoMikuCiAgICAgIC8vIGFuZCB0aGlzIGJlaGF2aW9yIHN1cnZpdmVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEFycmF5XScgfHwKICAgICAgICAgICAvLyBJbiBJRSBhbGwgbm9uIHZhbHVlIHR5cGVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMgYWNyb3NzIHdpbmRvdwogICAgICAgICAgIC8vIGJvdW5kYXJpZXMgKG5vdCBpZnJhbWUgdGhvdWdoKSBzbyB3ZSBoYXZlIHRvIGRvIG9iamVjdCBkZXRlY3Rpb24KICAgICAgICAgICAvLyBmb3IgdGhpcyBlZGdlIGNhc2UuCiAgICAgICAgICAgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUuc3BsaWNlICE9ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoJ3NwbGljZScpCgogICAgICAgICAgICAgICApKSB7CiAgICAgICAgcmV0dXJuICdhcnJheSc7CiAgICAgIH0KICAgICAgLy8gSEFDSzogVGhlcmUgaXMgc3RpbGwgYW4gYXJyYXkgY2FzZSB0aGF0IGZhaWxzLgogICAgICAvLyAgICAgZnVuY3Rpb24gQXJyYXlJbXBvc3RvcigpIHt9CiAgICAgIC8vICAgICBBcnJheUltcG9zdG9yLnByb3RvdHlwZSA9IFtdOwogICAgICAvLyAgICAgdmFyIGltcG9zdG9yID0gbmV3IEFycmF5SW1wb3N0b3I7CiAgICAgIC8vIHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGdldHRpbmcgcmlkIG9mIHRoZSBmYXN0IHBhdGgKICAgICAgLy8gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIGFuZCBzb2xlbHkgcmVseWluZyBvbgogICAgICAvLyAodmFsdWUgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy52YWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykKICAgICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBtYW55IG1vcmUgZnVuY3Rpb24gY2FsbHMgYW5kIGlzIG5vdCB3YXJyYW50ZWQKICAgICAgLy8gdW5sZXNzIGNsb3N1cmUgY29kZSBpcyByZWNlaXZpbmcgb2JqZWN0cyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgoKICAgICAgLy8gSUUgaW4gY3Jvc3Mtd2luZG93IGNhbGxzIGRvZXMgbm90IGNvcnJlY3RseSBtYXJzaGFsIHRoZSBmdW5jdGlvbiB0eXBlCiAgICAgIC8vIChpdCBhcHBlYXJzIGp1c3QgYXMgYW4gb2JqZWN0KSBzbyB3ZSBjYW5ub3QgdXNlIGp1c3QgdHlwZW9mIHZhbCA9PQogICAgICAvLyAnZnVuY3Rpb24nLiBIb3dldmVyLCBpZiB0aGUgb2JqZWN0IGhhcyBhIGNhbGwgcHJvcGVydHksIGl0IGlzIGEKICAgICAgLy8gZnVuY3Rpb24uCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwKICAgICAgICAgICB0eXBlb2YgdmFsdWUuY2FsbCAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUgIT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgICAgIXZhbHVlLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdjYWxsJykpKSB7CiAgICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJ251bGwnOwogICAgfQoKICB9IGVsc2UgaWYgKHMgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuY2FsbCA9PSAndW5kZWZpbmVkJykgewogICAgLy8gSW4gU2FmYXJpIHR5cGVvZiBub2RlTGlzdCByZXR1cm5zICdmdW5jdGlvbicsIGFuZCBvbiBGaXJlZm94IHR5cGVvZgogICAgLy8gYmVoYXZlcyBzaW1pbGFybHkgZm9yIEhUTUx7QXBwbGV0LEVtYmVkLE9iamVjdH0sIEVsZW1lbnRzIGFuZCBSZWdFeHBzLiBXZQogICAgLy8gd291bGQgbGlrZSB0byByZXR1cm4gb2JqZWN0IGZvciB0aG9zZSBhbmQgd2UgY2FuIGRldGVjdCBhbiBpbnZhbGlkCiAgICAvLyBmdW5jdGlvbiBieSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgaGFzIGEgY2FsbCBtZXRob2QuCiAgICByZXR1cm4gJ29iamVjdCc7CiAgfQogIHJldHVybiBzOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIG51bGwuCiAqIEBkZXByZWNhdGVkIFVzZSBgdmFsID09PSBudWxsYCBpbnN0ZWFkLgogKi8KZ29vZy5pc051bGwgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdmFsID09PSBudWxsOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQGRlcHJlY2F0ZWQgVXNlIGB2YWwgIT0gbnVsbGAgaW5zdGVhZC4KICovCmdvb2cuaXNEZWZBbmROb3ROdWxsID0gZnVuY3Rpb24odmFsKSB7CiAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCA9PSBudWxsLgogIHJldHVybiB2YWwgIT0gbnVsbDsKfTsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gYXJyYXkuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYW4gYXJyYXkuCiAqLwpnb29nLmlzQXJyYXkgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnYXJyYXknOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGFuIGFycmF5LiBUbyBxdWFsaWZ5IGFzIGFycmF5IGxpa2UKICogdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGVpdGhlciBhIE5vZGVMaXN0IG9yIGFuIG9iamVjdCB3aXRoIGEgTnVtYmVyIGxlbmd0aAogKiBwcm9wZXJ0eS4gTm90ZSB0aGF0IGZvciB0aGlzIGZ1bmN0aW9uIG5laXRoZXIgc3RyaW5ncyBub3IgZnVuY3Rpb25zIGFyZQogKiBjb25zaWRlcmVkICJhcnJheS1saWtlIi4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhbiBhcnJheS4KICovCmdvb2cuaXNBcnJheUxpa2UgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IGdvb2cudHlwZU9mKHZhbCk7CiAgLy8gV2UgZG8gbm90IHVzZSBnb29nLmlzT2JqZWN0IGhlcmUgaW4gb3JkZXIgdG8gZXhjbHVkZSBmdW5jdGlvbiB2YWx1ZXMuCiAgcmV0dXJuIHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwubGVuZ3RoID09ICdudW1iZXInOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGEgRGF0ZS4gVG8gcXVhbGlmeSBhcyBEYXRlLWxpa2UgdGhlCiAqIHZhbHVlIG5lZWRzIHRvIGJlIGFuIG9iamVjdCBhbmQgaGF2ZSBhIGdldEZ1bGxZZWFyKCkgZnVuY3Rpb24uCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBsaWtlIGEgRGF0ZS4KICovCmdvb2cuaXNEYXRlTGlrZSA9IGZ1bmN0aW9uKHZhbCkgewogIHJldHVybiBnb29nLmlzT2JqZWN0KHZhbCkgJiYgdHlwZW9mIHZhbC5nZXRGdWxsWWVhciA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24uCiAqLwpnb29nLmlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuICBUaGlzIGluY2x1ZGVzIGFycmF5cyBhbmQKICogZnVuY3Rpb25zLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGFuIG9iamVjdC4KICovCmdvb2cuaXNPYmplY3QgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7CiAgcmV0dXJuIHR5cGUgPT0gJ29iamVjdCcgJiYgdmFsICE9IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nOwogIC8vIHJldHVybiBPYmplY3QodmFsKSA9PT0gdmFsIGFsc28gd29ya3MsIGJ1dCBpcyBzbG93ZXIsIGVzcGVjaWFsbHkgaWYgdmFsIGlzCiAgLy8gbm90IGFuIG9iamVjdC4KfTsKCgovKioKICogR2V0cyBhIHVuaXF1ZSBJRCBmb3IgYW4gb2JqZWN0LiBUaGlzIG11dGF0ZXMgdGhlIG9iamVjdCBzbyB0aGF0IGZ1cnRoZXIgY2FsbHMKICogd2l0aCB0aGUgc2FtZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuaXF1ZSBJRCBpcwogKiBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbW9uZ3N0IG9iamVjdHMgdGhhdCBhcmUKICogcGFzc2VkIGludG8gYGdldFVpZGAuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJRCBpcyB1bmlxdWUgb3IKICogY29uc2lzdGVudCBhY3Jvc3Mgc2Vzc2lvbnMuIEl0IGlzIHVuc2FmZSB0byBnZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIGZ1bmN0aW9uCiAqIHByb3RvdHlwZXMuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHVuaXF1ZSBJRCBmb3IuCiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIG9iamVjdC4KICovCmdvb2cuZ2V0VWlkID0gZnVuY3Rpb24ob2JqKSB7CiAgLy8gVE9ETyhhcnYpOiBNYWtlIHRoZSB0eXBlIHN0cmljdGVyLCBkbyBub3QgYWNjZXB0IG51bGwuCgogIC8vIEluIE9wZXJhIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSBleGlzdHMgYnV0IGFsd2F5cyByZXR1cm5zIGZhbHNlIHNvIHdlIGF2b2lkCiAgLy8gdXNpbmcgaXQuIEFzIGEgY29uc2VxdWVuY2UgdGhlIHVuaXF1ZSBJRCBnZW5lcmF0ZWQgZm9yIEJhc2VDbGFzcy5wcm90b3R5cGUKICAvLyBhbmQgU3ViQ2xhc3MucHJvdG90eXBlIHdpbGwgYmUgdGhlIHNhbWUuCiAgLy8gVE9ETyhiLzE0MTUxMjMyMyk6IFVVSURzIGFyZSBicm9rZW4gZm9yIGN0b3JzIHdpdGggY2xhc3Mtc2lkZSBpbmhlcml0YW5jZS4KICByZXR1cm4gb2JqW2dvb2cuVUlEX1BST1BFUlRZX10gfHwKICAgICAgKG9ialtnb29nLlVJRF9QUk9QRVJUWV9dID0gKytnb29nLnVpZENvdW50ZXJfKTsKfTsKCgovKioKICogV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgYXNzaWduZWQgYSB1bmlxdWUgSUQuCiAqCiAqIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBvYmplY3QuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2suCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlcmUgaXMgYW4gYXNzaWduZWQgdW5pcXVlIGlkIGZvciB0aGUgb2JqZWN0LgogKi8KZ29vZy5oYXNVaWQgPSBmdW5jdGlvbihvYmopIHsKICByZXR1cm4gISFvYmpbZ29vZy5VSURfUFJPUEVSVFlfXTsKfTsKCgovKioKICogUmVtb3ZlcyB0aGUgdW5pcXVlIElEIGZyb20gYW4gb2JqZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgb2JqZWN0IHdhcwogKiBwcmV2aW91c2x5IG11dGF0ZWQgdXNpbmcgYGdvb2cuZ2V0VWlkYCBpbiB3aGljaCBjYXNlIHRoZSBtdXRhdGlvbiBpcwogKiB1bmRvbmUuCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZW1vdmUgdGhlIHVuaXF1ZSBJRCBmaWVsZCBmcm9tLgogKi8KZ29vZy5yZW1vdmVVaWQgPSBmdW5jdGlvbihvYmopIHsKICAvLyBUT0RPKGFydik6IE1ha2UgdGhlIHR5cGUgc3RyaWN0ZXIsIGRvIG5vdCBhY2NlcHQgbnVsbC4KCiAgLy8gSW4gSUUsIERPTSBub2RlcyBhcmUgbm90IGluc3RhbmNlcyBvZiBPYmplY3QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZQogIC8vIHRyeSB0byBkZWxldGUuICBJbnN0ZWFkIHdlIHRyeSB0byB1c2UgcmVtb3ZlQXR0cmlidXRlLgogIGlmIChvYmogIT09IG51bGwgJiYgJ3JlbW92ZUF0dHJpYnV0ZScgaW4gb2JqKSB7CiAgICBvYmoucmVtb3ZlQXR0cmlidXRlKGdvb2cuVUlEX1BST1BFUlRZXyk7CiAgfQoKICB0cnkgewogICAgZGVsZXRlIG9ialtnb29nLlVJRF9QUk9QRVJUWV9dOwogIH0gY2F0Y2ggKGV4KSB7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bmlxdWUgSUQgcHJvcGVydHkuIEluaXRpYWxpemVkIGluIGEgd2F5IHRvIGhlbHAgYXZvaWQgY29sbGlzaW9ucwogKiB3aXRoIG90aGVyIGNsb3N1cmUgSmF2YVNjcmlwdCBvbiB0aGUgc2FtZSBwYWdlLgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KZ29vZy5VSURfUFJPUEVSVFlfID0gJ2Nsb3N1cmVfdWlkXycgKyAoKE1hdGgucmFuZG9tKCkgKiAxZTkpID4+PiAwKTsKCgovKioKICogQ291bnRlciBmb3IgVUlELgogKiBAdHlwZSB7bnVtYmVyfQogKiBAcHJpdmF0ZQogKi8KZ29vZy51aWRDb3VudGVyXyA9IDA7CgoKLyoqCiAqIEFkZHMgYSBoYXNoIGNvZGUgZmllbGQgdG8gYW4gb2JqZWN0LiBUaGUgaGFzaCBjb2RlIGlzIHVuaXF1ZSBmb3IgdGhlCiAqIGdpdmVuIG9iamVjdC4KICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaGFzaCBjb2RlIGZvci4KICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaCBjb2RlIGZvciB0aGUgb2JqZWN0LgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5nZXRVaWQgaW5zdGVhZC4KICovCmdvb2cuZ2V0SGFzaENvZGUgPSBnb29nLmdldFVpZDsKCgovKioKICogUmVtb3ZlcyB0aGUgaGFzaCBjb2RlIGZpZWxkIGZyb20gYW4gb2JqZWN0LgogKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmVtb3ZlIHRoZSBmaWVsZCBmcm9tLgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5yZW1vdmVVaWQgaW5zdGVhZC4KICovCmdvb2cucmVtb3ZlSGFzaENvZGUgPSBnb29nLnJlbW92ZVVpZDsKCgovKioKICogQ2xvbmVzIGEgdmFsdWUuIFRoZSBpbnB1dCBtYXkgYmUgYW4gT2JqZWN0LCBBcnJheSwgb3IgYmFzaWMgdHlwZS4gT2JqZWN0cyBhbmQKICogYXJyYXlzIHdpbGwgYmUgY2xvbmVkIHJlY3Vyc2l2ZWx5LgogKgogKiBXQVJOSU5HUzoKICogPGNvZGU+Z29vZy5jbG9uZU9iamVjdDwvY29kZT4gZG9lcyBub3QgZGV0ZWN0IHJlZmVyZW5jZSBsb29wcy4gT2JqZWN0cyB0aGF0CiAqIHJlZmVyIHRvIHRoZW1zZWx2ZXMgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCiAqCiAqIDxjb2RlPmdvb2cuY2xvbmVPYmplY3Q8L2NvZGU+IGlzIHVuYXdhcmUgb2YgdW5pcXVlIGlkZW50aWZpZXJzLCBhbmQgY29waWVzCiAqIFVJRHMgY3JlYXRlZCBieSA8Y29kZT5nZXRVaWQ8L2NvZGU+IGludG8gY2xvbmVkIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSB2YWx1ZSB0byBjbG9uZS4KICogQHJldHVybiB7Kn0gQSBjbG9uZSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIEBkZXByZWNhdGVkIGdvb2cuY2xvbmVPYmplY3QgaXMgdW5zYWZlLiBQcmVmZXIgdGhlIGdvb2cub2JqZWN0IG1ldGhvZHMuCiAqLwpnb29nLmNsb25lT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZihvYmopOwogIGlmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2FycmF5JykgewogICAgaWYgKHR5cGVvZiBvYmouY2xvbmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIG9iai5jbG9uZSgpOwogICAgfQogICAgdmFyIGNsb25lID0gdHlwZSA9PSAnYXJyYXknID8gW10gOiB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgY2xvbmVba2V5XSA9IGdvb2cuY2xvbmVPYmplY3Qob2JqW2tleV0pOwogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgcmV0dXJuIG9iajsKfTsKCgovKioKICogQSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ29vZy5iaW5kLgogKiBAcGFyYW0gez9mdW5jdGlvbih0aGlzOlQsIC4uLil9IGZuIEEgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5LgogKiBAcGFyYW0ge1R9IHNlbGZPYmogU3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBzaG91bGQgcG9pbnQgdG8gd2hlbiB0aGUKICogICAgIGZ1bmN0aW9uIGlzIHJ1bi4KICogQHBhcmFtIHsuLi4qfSB2YXJfYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXJ0aWFsbHkgYXBwbGllZCB0byB0aGUKICogICAgIGZ1bmN0aW9uLgogKiBAcmV0dXJuIHshRnVuY3Rpb259IEEgcGFydGlhbGx5LWFwcGxpZWQgZm9ybSBvZiB0aGUgZnVuY3Rpb24gZ29vZy5iaW5kKCkgd2FzCiAqICAgICBpbnZva2VkIGFzIGEgbWV0aG9kIG9mLgogKiBAdGVtcGxhdGUgVAogKiBAcHJpdmF0ZQogKi8KZ29vZy5iaW5kTmF0aXZlXyA9IGZ1bmN0aW9uKGZuLCBzZWxmT2JqLCB2YXJfYXJncykgewogIHJldHVybiAvKiogQHR5cGUgeyFGdW5jdGlvbn0gKi8gKGZuLmNhbGwuYXBwbHkoZm4uYmluZCwgYXJndW1lbnRzKSk7Cn07CgoKLyoqCiAqIEEgcHVyZS1KUyBpbXBsZW1lbnRhdGlvbiBvZiBnb29nLmJpbmQuCiAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6VCwgLi4uKX0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7VH0gc2VsZk9iaiBTcGVjaWZpZXMgdGhlIG9iamVjdCB3aGljaCB0aGlzIHNob3VsZCBwb2ludCB0byB3aGVuIHRoZQogKiAgICAgZnVuY3Rpb24gaXMgcnVuLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgYXJlIHBhcnRpYWxseSBhcHBsaWVkIHRvIHRoZQogKiAgICAgZnVuY3Rpb24uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLmJpbmQoKSB3YXMKICogICAgIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwcml2YXRlCiAqLwpnb29nLmJpbmRKc18gPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICBpZiAoIWZuKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICB9CgogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgdmFyIGJvdW5kQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIC8vIFByZXBlbmQgdGhlIGJvdW5kIGFyZ3VtZW50cyB0byB0aGUgY3VycmVudCBhcmd1bWVudHMuCiAgICAgIHZhciBuZXdBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobmV3QXJncywgYm91bmRBcmdzKTsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIG5ld0FyZ3MpOwogICAgfTsKCiAgfSBlbHNlIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KfTsKCgovKioKICogUGFydGlhbGx5IGFwcGxpZXMgdGhpcyBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgJ3RoaXMgb2JqZWN0JyBhbmQgemVybyBvcgogKiBtb3JlIGFyZ3VtZW50cy4gVGhlIHJlc3VsdCBpcyBhIG5ldyBmdW5jdGlvbiB3aXRoIHNvbWUgYXJndW1lbnRzIG9mIHRoZSBmaXJzdAogKiBmdW5jdGlvbiBwcmUtZmlsbGVkIGFuZCB0aGUgdmFsdWUgb2YgdGhpcyAncHJlLXNwZWNpZmllZCcuCiAqCiAqIFJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmaWVkIGF0IGNhbGwtdGltZSBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZS1zcGVjaWZpZWQKICogb25lcy4KICoKICogQWxzbyBzZWU6IHtAbGluayAjcGFydGlhbH0uCiAqCiAqIFVzYWdlOgogKiA8cHJlPnZhciBiYXJNZXRoQm91bmQgPSBnb29nLmJpbmQobXlGdW5jdGlvbiwgbXlPYmosICdhcmcxJywgJ2FyZzInKTsKICogYmFyTWV0aEJvdW5kKCdhcmczJywgJ2FyZzQnKTs8L3ByZT4KICoKICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpULCAuLi4pfSBmbiBBIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseS4KICogQHBhcmFtIHtUfSBzZWxmT2JqIFNwZWNpZmllcyB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgc2hvdWxkIHBvaW50IHRvIHdoZW4gdGhlCiAqICAgICBmdW5jdGlvbiBpcyBydW4uCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gdGhlCiAqICAgICBmdW5jdGlvbi4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBBIHBhcnRpYWxseS1hcHBsaWVkIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIGdvb2cuYmluZCgpIHdhcwogKiAgICAgaW52b2tlZCBhcyBhIG1ldGhvZCBvZi4KICogQHRlbXBsYXRlIFQKICogQHN1cHByZXNzIHtkZXByZWNhdGVkfSBTZWUgYWJvdmUuCiAqLwpnb29nLmJpbmQgPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICAvLyBUT0RPKG5pY2tzYW50b3MpOiBuYXJyb3cgdGhlIHR5cGUgc2lnbmF0dXJlLgogIGlmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJgogICAgICAvLyBOT1RFKG5pY2tzYW50b3MpOiBTb21lYm9keSBwdWxsZWQgYmFzZS5qcyBpbnRvIHRoZSBkZWZhdWx0IENocm9tZQogICAgICAvLyBleHRlbnNpb24gZW52aXJvbm1lbnQuIFRoaXMgbWVhbnMgdGhhdCBmb3IgQ2hyb21lIGV4dGVuc2lvbnMsIHRoZXkgZ2V0CiAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB0aGF0IGNhbGxzIGdvb2cuYmluZAogICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgb25lLiBFdmVuIHdvcnNlLCB3ZSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBhCiAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBnb29nLmJpbmQgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBzbwogICAgICAvLyB3ZSBoYXZlIHRvIGhhY2sgdGhpcyB0byBtYWtlIHN1cmUgaXQgd29ya3MgY29ycmVjdGx5LgogICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoJ25hdGl2ZSBjb2RlJykgIT0gLTEpIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZE5hdGl2ZV87CiAgfSBlbHNlIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZEpzXzsKICB9CiAgcmV0dXJuIGdvb2cuYmluZC5hcHBseShudWxsLCBhcmd1bWVudHMpOwp9OwoKCi8qKgogKiBMaWtlIGdvb2cuYmluZCgpLCBleGNlcHQgdGhhdCBhICd0aGlzIG9iamVjdCcgaXMgbm90IHJlcXVpcmVkLiBVc2VmdWwgd2hlbgogKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAqCiAqIFVzYWdlOgogKiB2YXIgZyA9IGdvb2cucGFydGlhbChmLCBhcmcxLCBhcmcyKTsKICogZyhhcmczLCBhcmc0KTsKICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gZm4uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLnBhcnRpYWwoKQogKiAgICAgd2FzIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqLwpnb29nLnBhcnRpYWwgPSBmdW5jdGlvbihmbiwgdmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgLy8gQ2xvbmUgdGhlIGFycmF5ICh3aXRoIHNsaWNlKCkpIGFuZCBhcHBlbmQgYWRkaXRpb25hbCBhcmd1bWVudHMKICAgIC8vIHRvIHRoZSBleGlzdGluZyBhcmd1bWVudHMuCiAgICB2YXIgbmV3QXJncyA9IGFyZ3Muc2xpY2UoKTsKICAgIG5ld0FyZ3MucHVzaC5hcHBseShuZXdBcmdzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGZuLmFwcGx5KC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpLCBuZXdBcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDb3BpZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc291cmNlIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuIFRoaXMgbWV0aG9kCiAqIGRvZXMgbm90IHdvcmsgb24gYWxsIGJyb3dzZXJzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNvbnRhaW4ga2V5cyBzdWNoIGFzCiAqIHRvU3RyaW5nIG9yIGhhc093blByb3BlcnR5LiBVc2UgZ29vZy5vYmplY3QuZXh0ZW5kIGZvciB0aGlzIHB1cnBvc2UuCiAqCiAqIE5PVEU6IFNvbWUgaGF2ZSBhZHZvY2F0ZWQgZm9yIHRoZSB1c2Ugb2YgZ29vZy5taXhpbiB0byBzZXR1cCBjbGFzc2VzCiAqIHdpdGggbXVsdGlwbGUgaW5oZXJpdGVuY2UgKHRyYWl0cywgbWl4aW5zLCBldGMpLiAgSG93ZXZlciwgYXMgaXQgc2ltcGx5CiAqIHVzZXMgImZvciBpbiIsIHRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3NlcyB3aG9zZSBtZXRob2RzIGFyZQogKiBub24tZW51bWVyYWJsZS4gIENoYW5naW5nIHRoaXMsIHdvdWxkIGJyZWFrIGNhc2VzIHdoZXJlIG5vbi1lbnVtZXJhYmxlCiAqIHByb3BlcnRpZXMgYXJlIG5vdCBleHBlY3RlZC4KICoKICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQuCiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlLgogKiBAZGVwcmVjYXRlZCBQcmVmZXIgT2JqZWN0LmFzc2lnbgogKi8KZ29vZy5taXhpbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgZm9yICh2YXIgeCBpbiBzb3VyY2UpIHsKICAgIHRhcmdldFt4XSA9IHNvdXJjZVt4XTsKICB9CgogIC8vIEZvciBJRTcgb3IgbG93ZXIsIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlCiAgLy8gbm90IGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlLCBpc1Byb3RvdHlwZU9mIGZyb20KICAvLyBPYmplY3QucHJvdG90eXBlKSBidXQgYWxzbyBpdCB3aWxsIG5vdCBpbmNsdWRlICdyZXBsYWNlJyBvbiBvYmplY3RzIHRoYXQKICAvLyBleHRlbmQgU3RyaW5nIGFuZCBjaGFuZ2UgJ3JlcGxhY2UnIChub3QgdGhhdCBpdCBpcyBjb21tb24gZm9yIGFueW9uZSB0bwogIC8vIGV4dGVuZCBhbnl0aGluZyBleGNlcHQgT2JqZWN0KS4KfTsKCgovKioKICogQHJldHVybiB7bnVtYmVyfSBBbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwogKiAgICAgYmV0d2VlbiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIGFuZCB0aGUgY3VycmVudCB0aW1lLgogKiBAZGVwcmVjYXRlZCBVc2UgRGF0ZS5ub3cKICovCmdvb2cubm93ID0gKGdvb2cuVFJVU1RFRF9TSVRFICYmIERhdGUubm93KSB8fCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAvLyBVbmFyeSBwbHVzIG9wZXJhdG9yIGNvbnZlcnRzIGl0cyBvcGVyYW5kIHRvIGEgbnVtYmVyIHdoaWNoIGluCiAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZgogICAgICAgICAgICAgLy8gYSBkYXRlIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRUaW1lKCkuCiAgICAgICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7CiAgICAgICAgICAgfSk7CgoKLyoqCiAqIEV2YWxzIEphdmFTY3JpcHQgaW4gdGhlIGdsb2JhbCBzY29wZS4gIEluIElFIHRoaXMgdXNlcyBleGVjU2NyaXB0LCBvdGhlcgogKiBicm93c2VycyB1c2UgZ29vZy5nbG9iYWwuZXZhbC4gSWYgZ29vZy5nbG9iYWwuZXZhbCBkb2VzIG5vdCBldmFsdWF0ZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlIChmb3IgZXhhbXBsZSwgaW4gU2FmYXJpKSwgYXBwZW5kcyBhIHNjcmlwdCB0YWcgaW5zdGVhZC4KICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBuZWl0aGVyIGV4ZWNTY3JpcHQgb3IgZXZhbCBpcyBkZWZpbmVkLgogKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IEphdmFTY3JpcHQgc3RyaW5nLgogKi8KZ29vZy5nbG9iYWxFdmFsID0gZnVuY3Rpb24oc2NyaXB0KSB7CiAgaWYgKGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQpIHsKICAgIGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQoc2NyaXB0LCAnSmF2YVNjcmlwdCcpOwogIH0gZWxzZSBpZiAoZ29vZy5nbG9iYWwuZXZhbCkgewogICAgLy8gVGVzdCB0byBzZWUgaWYgZXZhbCB3b3JrcwogICAgaWYgKGdvb2cuZXZhbFdvcmtzRm9yR2xvYmFsc18gPT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIGdvb2cuZ2xvYmFsLmV2YWwoJ3ZhciBfZXZhbFRlc3RfID0gMTsnKTsKICAgICAgfSBjYXRjaCAoaWdub3JlKSB7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRlbGV0ZSBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddOwogICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgewogICAgICAgICAgLy8gTWljcm9zb2Z0IGVkZ2UgZmFpbHMgdGhlIGRlbGV0aW9uIGFib3ZlIGluIHN0cmljdCBtb2RlLgogICAgICAgIH0KICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXykgewogICAgICBnb29nLmdsb2JhbC5ldmFsKHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICAvKiogQHR5cGUgeyFEb2N1bWVudH0gKi8KICAgICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgICB2YXIgc2NyaXB0RWx0ID0KICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxTY3JpcHRFbGVtZW50fSAqLyAoZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKTsKICAgICAgc2NyaXB0RWx0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgc2NyaXB0RWx0LmRlZmVyID0gZmFsc2U7CiAgICAgIC8vIE5vdGUodXNlcik6IGNhbid0IHVzZSAuaW5uZXJIVE1MIHNpbmNlICJ0KCc8dGVzdD4nKSIgd2lsbCBmYWlsIGFuZAogICAgICAvLyAudGV4dCBkb2Vzbid0IHdvcmsgaW4gU2FmYXJpIDIuICBUaGVyZWZvcmUgd2UgYXBwZW5kIGEgdGV4dCBub2RlLgogICAgICBzY3JpcHRFbHQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNjcmlwdCkpOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbHQpOwogICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRFbHQpOwogICAgfQogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cuZ2xvYmFsRXZhbCBub3QgYXZhaWxhYmxlJyk7CiAgfQp9OwoKCi8qKgogKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgJ2V2YWwnIGRpcmVjdGx5IHRvIGV2YWwgY29kZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlLiBTZXQgdG8gYSBCb29sZWFuIGJ5IHRoZSBmaXJzdCBjYWxsIHRvIGdvb2cuZ2xvYmFsRXZhbCAod2hpY2gKICogZW1waXJpY2FsbHkgdGVzdHMgd2hldGhlciBldmFsIHdvcmtzIGZvciBnbG9iYWxzKS4gQHNlZSBnb29nLmdsb2JhbEV2YWwKICogQHR5cGUgez9ib29sZWFufQogKiBAcHJpdmF0ZQogKi8KZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9IG51bGw7CgoKLyoqCiAqIE9wdGlvbmFsIG1hcCBvZiBDU1MgY2xhc3MgbmFtZXMgdG8gb2JmdXNjYXRlZCBuYW1lcyB1c2VkIHdpdGgKICogZ29vZy5nZXRDc3NOYW1lKCkuCiAqIEBwcml2YXRlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqIEBzZWUgZ29vZy5zZXRDc3NOYW1lTWFwcGluZwogKi8KZ29vZy5jc3NOYW1lTWFwcGluZ187CgoKLyoqCiAqIE9wdGlvbmFsIG9iZnVzY2F0aW9uIHN0eWxlIGZvciBDU1MgY2xhc3MgbmFtZXMuIFNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCiAqICdCWV9XSE9MRScgb3IgJ0JZX1BBUlQnIGlmIGRlZmluZWQuCiAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfQogKiBAcHJpdmF0ZQogKiBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcKICovCmdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV87CgoKCi8qKgogKiBBIGhvb2sgZm9yIG1vZGlmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBnb29nLmdldENzc05hbWUuIFRoZSBmdW5jdGlvbgogKiBpZiBwcmVzZW50LCB3aWxsIHJlY2VpdmUgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgZ29vZy5nZXRDc3NOYW1lIGFzCiAqIGl0cyBpbnB1dC4KICoKICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcpOnN0cmluZyl8dW5kZWZpbmVkfQogKi8KZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk47CgoKLyoqCiAqIEhhbmRsZXMgc3RyaW5ncyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIENTUyBjbGFzcyBuYW1lcy4KICoKICogVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiB0YW5kZW0gd2l0aCBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcuCiAqCiAqIFdpdGhvdXQgYW55IG1hcHBpbmcgc2V0LCB0aGUgYXJndW1lbnRzIGFyZSBzaW1wbGUgam9pbmVkIHdpdGggYSBoeXBoZW4gYW5kCiAqIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC4KICoKICogV2hlbiB0aGVyZSBpcyBhIG1hcHBpbmcsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3R5bGVzIGluIHdoaWNoIHRoZXNlCiAqIG1hcHBpbmdzIGFyZSB1c2VkLiBJbiB0aGUgQllfUEFSVCBzdHlsZSwgZWFjaCBwYXJ0IChpLmUuIGluIGJldHdlZW4gaHlwaGVucykKICogb2YgdGhlIHBhc3NlZCBpbiBjc3MgbmFtZSBpcyByZXdyaXR0ZW4gYWNjb3JkaW5nIHRvIHRoZSBtYXAuIEluIHRoZSBCWV9XSE9MRQogKiBzdHlsZSwgdGhlIGZ1bGwgY3NzIG5hbWUgaXMgbG9va2VkIHVwIGluIHRoZSBtYXAgZGlyZWN0bHkuIElmIGEgcmV3cml0ZSBpcwogKiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBtYXAsIHRoZSBjb21waWxlciB3aWxsIG91dHB1dCBhIHdhcm5pbmcuCiAqCiAqIFdoZW4gdGhlIG1hcHBpbmcgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgaXQgd2lsbCByZXBsYWNlIGNhbGxzIHRvCiAqIGdvb2cuZ2V0Q3NzTmFtZSB3aXRoIHRoZSBzdHJpbmdzIGZyb20gdGhlIG1hcHBpbmcsIGUuZy4KICogICAgIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdmb28nKTsKICogICAgIHZhciB5ID0gZ29vZy5nZXRDc3NOYW1lKHRoaXMuYmFzZUNsYXNzLCAnYWN0aXZlJyk7CiAqICBiZWNvbWVzOgogKiAgICAgdmFyIHggPSAnZm9vJzsKICogICAgIHZhciB5ID0gdGhpcy5iYXNlQ2xhc3MgKyAnLWFjdGl2ZSc7CiAqCiAqIElmIG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSBwcm9jZXNzZWQsIGlmIHR3byBhcmUgcGFzc2VkIG9ubHkgdGhlCiAqIG1vZGlmaWVyIHdpbGwgYmUgcHJvY2Vzc2VkLCBhcyBpdCBpcyBhc3N1bWVkIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZ2VuZXJhdGVkCiAqIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgZ29vZy5nZXRDc3NOYW1lLgogKgogKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tb2RpZmllciBBIG1vZGlmaWVyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjbGFzcyBuYW1lLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGFzcyBuYW1lIG9yIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIGFuZAogKiAgICAgdGhlIG1vZGlmaWVyLgogKi8KZ29vZy5nZXRDc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBvcHRfbW9kaWZpZXIpIHsKICAvLyBTdHJpbmcoKSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29tcGlsZWQgc295IHdoZXJlIHRoZSBwYXNzZWQKICAvLyBjbGFzc05hbWUgY2FuIGJlIG5vbi1zdHJpbmcgb2JqZWN0cy4KICBpZiAoU3RyaW5nKGNsYXNzTmFtZSkuY2hhckF0KDApID09ICcuJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdjbGFzc05hbWUgcGFzc2VkIGluIGdvb2cuZ2V0Q3NzTmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIuIi4nICsKICAgICAgICAnIFlvdSBwYXNzZWQ6ICcgKyBjbGFzc05hbWUpOwogIH0KCiAgdmFyIGdldE1hcHBpbmcgPSBmdW5jdGlvbihjc3NOYW1lKSB7CiAgICByZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bY3NzTmFtZV0gfHwgY3NzTmFtZTsKICB9OwoKICB2YXIgcmVuYW1lQnlQYXJ0cyA9IGZ1bmN0aW9uKGNzc05hbWUpIHsKICAgIC8vIFJlbWFwIGFsbCB0aGUgcGFydHMgaW5kaXZpZHVhbGx5LgogICAgdmFyIHBhcnRzID0gY3NzTmFtZS5zcGxpdCgnLScpOwogICAgdmFyIG1hcHBlZCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBtYXBwZWQucHVzaChnZXRNYXBwaW5nKHBhcnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gbWFwcGVkLmpvaW4oJy0nKTsKICB9OwoKICB2YXIgcmVuYW1lOwogIGlmIChnb29nLmNzc05hbWVNYXBwaW5nXykgewogICAgcmVuYW1lID0KICAgICAgICBnb29nLmNzc05hbWVNYXBwaW5nU3R5bGVfID09ICdCWV9XSE9MRScgPyBnZXRNYXBwaW5nIDogcmVuYW1lQnlQYXJ0czsKICB9IGVsc2UgewogICAgcmVuYW1lID0gZnVuY3Rpb24oYSkgewogICAgICByZXR1cm4gYTsKICAgIH07CiAgfQoKICB2YXIgcmVzdWx0ID0KICAgICAgb3B0X21vZGlmaWVyID8gY2xhc3NOYW1lICsgJy0nICsgcmVuYW1lKG9wdF9tb2RpZmllcikgOiByZW5hbWUoY2xhc3NOYW1lKTsKCiAgLy8gVGhlIHNwZWNpYWwgQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4gYWxsb3dzIHVzZXJzIHRvIHNwZWNpZnkgZnVydGhlcgogIC8vIHByb2Nlc3Npbmcgb2YgdGhlIGNsYXNzIG5hbWUuCiAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4ocmVzdWx0KTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqCiAqIFNldHMgdGhlIG1hcCB0byBjaGVjayB3aGVuIHJldHVybmluZyBhIHZhbHVlIGZyb20gZ29vZy5nZXRDc3NOYW1lKCkuIEV4YW1wbGU6CiAqIDxwcmU+CiAqIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoewogKiAgICJnb29nIjogImEiLAogKiAgICJkaXNhYmxlZCI6ICJiIiwKICogfSk7CiAqCiAqIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdnb29nJyk7CiAqIC8vIFRoZSBmb2xsb3dpbmcgZXZhbHVhdGVzIHRvOiAiYSBhLWIiLgogKiBnb29nLmdldENzc05hbWUoJ2dvb2cnKSArICcgJyArIGdvb2cuZ2V0Q3NzTmFtZSh4LCAnZGlzYWJsZWQnKQogKiA8L3ByZT4KICogV2hlbiBkZWNsYXJlZCBhcyBhIG1hcCBvZiBzdHJpbmcgbGl0ZXJhbHMgdG8gc3RyaW5nIGxpdGVyYWxzLCB0aGUgSlNDb21waWxlcgogKiB3aWxsIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpIHVzaW5nIHRoZSBzdXBwbGllZCBtYXAgaWYgdGhlCiAqIC0tcHJvY2Vzc19jbG9zdXJlX3ByaW1pdGl2ZXMgZmxhZyBpcyBzZXQuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWFwcGluZyBBIG1hcCBvZiBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hlcmUga2V5cyBhcmUgcG9zc2libGUKICogICAgIGFyZ3VtZW50cyB0byBnb29nLmdldENzc05hbWUoKSBhbmQgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKICogICAgIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHlsZSBUaGUgc3R5bGUgb2YgY3NzIG5hbWUgbWFwcGluZy4gVGhlcmUgYXJlIHR3byB2YWxpZAogKiAgICAgb3B0aW9uczogJ0JZX1BBUlQnLCBhbmQgJ0JZX1dIT0xFJy4KICogQHNlZSBnb29nLmdldENzc05hbWUgZm9yIGEgZGVzY3JpcHRpb24uCiAqLwpnb29nLnNldENzc05hbWVNYXBwaW5nID0gZnVuY3Rpb24obWFwcGluZywgb3B0X3N0eWxlKSB7CiAgZ29vZy5jc3NOYW1lTWFwcGluZ18gPSBtYXBwaW5nOwogIGdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8gPSBvcHRfc3R5bGU7Cn07CgoKLyoqCiAqIFRvIHVzZSBDU1MgcmVuYW1pbmcgaW4gY29tcGlsZWQgbW9kZSwgb25lIG9mIHRoZSBpbnB1dCBmaWxlcyBzaG91bGQgaGF2ZSBhCiAqIGNhbGwgdG8gZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwgdGhhdCB0aGUgSlNDb21waWxlcgogKiBjYW4gZXh0cmFjdCBhbmQgdXNlIHRvIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpLiBJbiB1bmNvbXBpbGVkCiAqIG1vZGUsIEphdmFTY3JpcHQgY29kZSBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZSB0aGlzIGJhc2UuanMgZmlsZSB0aGF0IGRlY2xhcmVzCiAqIGEgZ2xvYmFsIHZhcmlhYmxlLCBDTE9TVVJFX0NTU19OQU1FX01BUFBJTkcsIHdoaWNoIGlzIHVzZWQgYmVsb3cuIFRoaXMgaXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIG1hcHBpbmcgaXMgbG9hZGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gZ29vZy5nZXRDc3NOYW1lKCkKICogYXJlIG1hZGUgaW4gdW5jb21waWxlZCBtb2RlLgogKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIENTUyBuYW1lIG1hcHBpbmcuCiAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkc7CgoKaWYgKCFDT01QSUxFRCAmJiBnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkcpIHsKICAvLyBUaGlzIGRvZXMgbm90IGNhbGwgZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIGJlY2F1c2UgdGhlIEpTQ29tcGlsZXIKICAvLyByZXF1aXJlcyB0aGF0IGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoKSBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4KICBnb29nLmNzc05hbWVNYXBwaW5nXyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORzsKfQoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb21waWxlciBwcmltaXRpdmUuIElmIHlvdSBnaXZlIHRoZSBjb21waWxlciBhIGxvY2FsaXplZAogKiBtZXNzYWdlIGJ1bmRsZSwgaXQgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgY29tcGlsZS10aW1lIHdpdGggYSBsb2NhbGl6ZWQKICogdmVyc2lvbiwgYW5kIGV4cGFuZCBnb29nLmdldE1zZyBjYWxsIHRvIGEgY29uY2F0ZW5hdGVkIHN0cmluZy4KICoKICogTWVzc2FnZXMgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgZm9ybToKICogPGNvZGU+CiAqIHZhciBNU0dfTkFNRSA9IGdvb2cuZ2V0TXNnKCdIZWxsbyB7JHBsYWNlaG9sZGVyfScsIHsncGxhY2Vob2xkZXInOiAnd29ybGQnfSk7CiAqIDwvY29kZT4KICoKICogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHN0cmluZyB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBwbGFpbiB0ZXh0LiBVc2UKICoge0BsaW5rIGdvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlcn0gaW4gY29uanVuY3Rpb24gd2l0aCBnb29nLmdldE1zZyB0bwogKiBwcm9kdWNlIFNhZmVIdG1sLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRyYW5zbGF0YWJsZSBzdHJpbmcsIHBsYWNlcyBob2xkZXJzIGluIHRoZSBmb3JtIHskZm9vfS4KICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+PX0gb3B0X3ZhbHVlcyBNYXBzIHBsYWNlIGhvbGRlciBuYW1lIHRvIHZhbHVlLgogKiBAcGFyYW0ge3todG1sOiBib29sZWFufT19IG9wdF9vcHRpb25zIE9wdGlvbnM6CiAqICAgICBodG1sOiBFc2NhcGUgJzwnIGluIHN0ciB0byAnJmx0OycuIFVzZWQgYnkgQ2xvc3VyZSBUZW1wbGF0ZXMgd2hlcmUgdGhlCiAqICAgICBnZW5lcmF0ZWQgY29kZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBpcyBjcml0aWNhbCB3aGljaCBpcyB3aHkge0BsaW5rCiAqICAgICBnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXJ9IGlzIG5vdCB1c2VkLiBUaGUgdmFsdWUgbXVzdCBiZSBsaXRlcmFsIHRydWUKICogICAgIG9yIGZhbHNlLgogKiBAcmV0dXJuIHtzdHJpbmd9IG1lc3NhZ2Ugd2l0aCBwbGFjZWhvbGRlcnMgZmlsbGVkLgogKi8KZ29vZy5nZXRNc2cgPSBmdW5jdGlvbihzdHIsIG9wdF92YWx1ZXMsIG9wdF9vcHRpb25zKSB7CiAgaWYgKG9wdF9vcHRpb25zICYmIG9wdF9vcHRpb25zLmh0bWwpIHsKICAgIC8vIE5vdGUgdGhhdCAnJicgaXMgbm90IHJlcGxhY2VkIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGNhbiBjb250YWluIEhUTUwKICAgIC8vIGVudGl0aWVzLgogICAgc3RyID0gc3RyLnJlcGxhY2UoLzwvZywgJyZsdDsnKTsKICB9CiAgaWYgKG9wdF92YWx1ZXMpIHsKICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ce1wkKFtefV0rKX0vZywgZnVuY3Rpb24obWF0Y2gsIGtleSkgewogICAgICByZXR1cm4gKG9wdF92YWx1ZXMgIT0gbnVsbCAmJiBrZXkgaW4gb3B0X3ZhbHVlcykgPyBvcHRfdmFsdWVzW2tleV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKICAgIH0pOwogIH0KICByZXR1cm4gc3RyOwp9OwoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc2xhdGlvbiwgZ2l2ZXMgYQogKiBmYWxsYmFjayBtZXNzYWdlLgogKgogKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGludHJvZHVjaW5nIGEgbmV3IG1lc3NhZ2UgdGhhdCBoYXMgbm90IHlldCBiZWVuCiAqIHRyYW5zbGF0ZWQgaW50byBhbGwgbGFuZ3VhZ2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBNdXN0IGJlIHVzZWQgaW4gdGhlIGZvcm06CiAqIDxjb2RlPnZhciB4ID0gZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2soTVNHX0EsIE1TR19CKTs8L2NvZGU+CiAqIHdoZXJlIE1TR19BIGFuZCBNU0dfQiB3ZXJlIGluaXRpYWxpemVkIHdpdGggZ29vZy5nZXRNc2cuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhIFRoZSBwcmVmZXJyZWQgbWVzc2FnZS4KICogQHBhcmFtIHtzdHJpbmd9IGIgVGhlIGZhbGxiYWNrIG1lc3NhZ2UuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJlc3QgdHJhbnNsYXRlZCBtZXNzYWdlLgogKi8KZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2sgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGE7Cn07CgoKLyoqCiAqIEV4cG9zZXMgYW4gdW5vYmZ1c2NhdGVkIGdsb2JhbCBuYW1lc3BhY2UgcGF0aCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KICogTm90ZSB0aGF0IGZpZWxkcyBvZiB0aGUgZXhwb3J0ZWQgb2JqZWN0ICp3aWxsKiBiZSBvYmZ1c2NhdGVkLCB1bmxlc3MgdGhleSBhcmUKICogZXhwb3J0ZWQgaW4gdHVybiB2aWEgdGhpcyBmdW5jdGlvbiBvciBnb29nLmV4cG9ydFByb3BlcnR5LgogKgogKiBBbHNvIGhhbmR5IGZvciBtYWtpbmcgcHVibGljIGl0ZW1zIHRoYXQgYXJlIGRlZmluZWQgaW4gYW5vbnltb3VzIGNsb3N1cmVzLgogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvbycsIEZvbyk7CiAqCiAqIGV4LiBnb29nLmV4cG9ydFN5bWJvbCgncHVibGljLnBhdGguRm9vLnN0YXRpY0Z1bmN0aW9uJywgRm9vLnN0YXRpY0Z1bmN0aW9uKTsKICogICAgIHB1YmxpYy5wYXRoLkZvby5zdGF0aWNGdW5jdGlvbigpOwogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvby5wcm90b3R5cGUubXlNZXRob2QnLAogKiAgICAgICAgICAgICAgICAgICAgICAgRm9vLnByb3RvdHlwZS5teU1ldGhvZCk7CiAqICAgICBuZXcgcHVibGljLnBhdGguRm9vKCkubXlNZXRob2QoKTsKICoKICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY1BhdGggVW5vYmZ1c2NhdGVkIG5hbWUgdG8gZXhwb3J0LgogKiBAcGFyYW0geyp9IG9iamVjdCBPYmplY3QgdGhlIG5hbWUgc2hvdWxkIHBvaW50IHRvLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBnb29nLmdsb2JhbC4KICovCmdvb2cuZXhwb3J0U3ltYm9sID0gZnVuY3Rpb24ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbykgewogIGdvb2cuZXhwb3J0UGF0aF8ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbyk7Cn07CgoKLyoqCiAqIEV4cG9ydHMgYSBwcm9wZXJ0eSB1bm9iZnVzY2F0ZWQgaW50byB0aGUgb2JqZWN0J3MgbmFtZXNwYWNlLgogKiBleC4gZ29vZy5leHBvcnRQcm9wZXJ0eShGb28sICdzdGF0aWNGdW5jdGlvbicsIEZvby5zdGF0aWNGdW5jdGlvbik7CiAqIGV4LiBnb29nLmV4cG9ydFByb3BlcnR5KEZvby5wcm90b3R5cGUsICdteU1ldGhvZCcsIEZvby5wcm90b3R5cGUubXlNZXRob2QpOwogKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IE9iamVjdCB3aG9zZSBzdGF0aWMgcHJvcGVydHkgaXMgYmVpbmcgZXhwb3J0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNOYW1lIFVub2JmdXNjYXRlZCBuYW1lIHRvIGV4cG9ydC4KICogQHBhcmFtIHsqfSBzeW1ib2wgT2JqZWN0IHRoZSBuYW1lIHNob3VsZCBwb2ludCB0by4KICovCmdvb2cuZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbihvYmplY3QsIHB1YmxpY05hbWUsIHN5bWJvbCkgewogIG9iamVjdFtwdWJsaWNOYW1lXSA9IHN5bWJvbDsKfTsKCgovKioKICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLgogKgogKiBVc2FnZToKICogPHByZT4KICogZnVuY3Rpb24gUGFyZW50Q2xhc3MoYSwgYikgeyB9CiAqIFBhcmVudENsYXNzLnByb3RvdHlwZS5mb28gPSBmdW5jdGlvbihhKSB7IH07CiAqCiAqIGZ1bmN0aW9uIENoaWxkQ2xhc3MoYSwgYiwgYykgewogKiAgIENoaWxkQ2xhc3MuYmFzZSh0aGlzLCAnY29uc3RydWN0b3InLCBhLCBiKTsKICogfQogKiBnb29nLmluaGVyaXRzKENoaWxkQ2xhc3MsIFBhcmVudENsYXNzKTsKICoKICogdmFyIGNoaWxkID0gbmV3IENoaWxkQ2xhc3MoJ2EnLCAnYicsICdzZWUnKTsKICogY2hpbGQuZm9vKCk7IC8vIFRoaXMgd29ya3MuCiAqIDwvcHJlPgogKgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY2hpbGRDdG9yIENoaWxkIGNsYXNzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gcGFyZW50Q3RvciBQYXJlbnQgY2xhc3MuCiAqIEBzdXBwcmVzcyB7c3RyaWN0TWlzc2luZ1Byb3BlcnRpZXN9IHN1cGVyQ2xhc3NfIGFuZCBiYXNlIGlzIG5vdCBkZWZpbmVkIG9uCiAqICAgIEZ1bmN0aW9uLgogKi8KZ29vZy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNoaWxkQ3RvciwgcGFyZW50Q3RvcikgewogIC8qKiBAY29uc3RydWN0b3IgKi8KICBmdW5jdGlvbiB0ZW1wQ3RvcigpIHt9CiAgdGVtcEN0b3IucHJvdG90eXBlID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnN1cGVyQ2xhc3NfID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogIC8qKiBAb3ZlcnJpZGUgKi8KICBjaGlsZEN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGRDdG9yOwoKICAvKioKICAgKiBDYWxscyBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yL21ldGhvZC4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHVzZSBnb29nLmluaGVyaXRzIHRvCiAgICogZXhwcmVzcyBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xhc3Nlcy4KICAgKgogICAqIE5PVEU6IFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgZ29vZy5iYXNlIGFuZCBmb3Igc3VwZXJDbGFzc18KICAgKiBwcm9wZXJ0eSBkZWZpbmVkIGluIGNoaWxkQ3Rvci4KICAgKgogICAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwuIENhbGxpbmcKICAgKiAgICAgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzcGVjaWFsIHN0cmluZwogICAqICAgICAnY29uc3RydWN0b3InLgogICAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHN1cGVyY2xhc3MKICAgKiAgICAgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqLwogIGNoaWxkQ3Rvci5iYXNlID0gZnVuY3Rpb24obWUsIG1ldGhvZE5hbWUsIHZhcl9hcmdzKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTsKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHBhcmVudEN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdLmFwcGx5KG1lLCBhcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDYWxsIHVwIHRvIHRoZSBzdXBlcmNsYXNzLgogKgogKiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGEgY29uc3RydWN0b3IsIHRoZW4gdGhpcyBjYWxscyB0aGUgc3VwZXJjbGFzcwogKiBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50cyAxLU4uCiAqCiAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYSBwcm90b3R5cGUgbWV0aG9kLCB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIG5hbWUgb2YgdGhlCiAqIG1ldGhvZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24uIElmIHlvdSBkbyBub3QsIHlvdSB3aWxsIGdldCBhCiAqIHJ1bnRpbWUgZXJyb3IuIFRoaXMgY2FsbHMgdGhlIHN1cGVyY2xhc3MnIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyAyLU4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBpZiB5b3UgdXNlIGdvb2cuaW5oZXJpdHMgdG8gZXhwcmVzcyBpbmhlcml0YW5jZQogKiByZWxhdGlvbnNoaXBzIGJldHdlZW4geW91ciBjbGFzc2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBBdCBjb21waWxlLXRpbWUsIHRoZSBjb21waWxlciB3aWxsIGRvCiAqIG1hY3JvIGV4cGFuc2lvbiB0byByZW1vdmUgYSBsb3Qgb2YgdGhlIGV4dHJhIG92ZXJoZWFkIHRoYXQgdGhpcyBmdW5jdGlvbgogKiBpbnRyb2R1Y2VzLiBUaGUgY29tcGlsZXIgd2lsbCBhbHNvIGVuZm9yY2UgYSBsb3Qgb2YgdGhlIGFzc3VtcHRpb25zIHRoYXQgdGhpcwogKiBmdW5jdGlvbiBtYWtlcywgYW5kIHRyZWF0IGl0IGFzIGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IGJyZWFrIHRoZW0uCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAqIEBwYXJhbSB7Kj19IG9wdF9tZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSBpZiBjYWxsaW5nIGEgc3VwZXIgbWV0aG9kLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kLgogKiBAc3VwcHJlc3Mge2VzNVN0cmljdH0gVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIGluIHN0cmljdCBtb2RlLCBidXQKICogICAgIGFsbCBDbG9zdXJlIExpYnJhcnkgY29uc3VtZXJzIG11c3QgZGVwZW5kIG9uIHRoaXMgZmlsZS4KICogQGRlcHJlY2F0ZWQgZ29vZy5iYXNlIGlzIG5vdCBzdHJpY3QgbW9kZSBjb21wYXRpYmxlLiAgUHJlZmVyIHRoZSBzdGF0aWMKICogICAgICJiYXNlIiBtZXRob2QgYWRkZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGJ5IGdvb2cuaW5oZXJpdHMKICogICAgIG9yIEVTNiBjbGFzc2VzIGFuZCB0aGUgInN1cGVyIiBrZXl3b3JkLgogKi8KZ29vZy5iYXNlID0gZnVuY3Rpb24obWUsIG9wdF9tZXRob2ROYW1lLCB2YXJfYXJncykgewogIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKCiAgaWYgKGdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSB8fCAoZ29vZy5ERUJVRyAmJiAhY2FsbGVyKSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdhcmd1bWVudHMuY2FsbGVyIG5vdCBkZWZpbmVkLiAgZ29vZy5iYXNlKCkgY2Fubm90IGJlIHVzZWQgJyArCiAgICAgICAgJ3dpdGggc3RyaWN0IG1vZGUgY29kZS4gU2VlICcgKwogICAgICAgICdodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtQycpOwogIH0KCiAgaWYgKHR5cGVvZiBjYWxsZXIuc3VwZXJDbGFzc18gIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBjdG9yQXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBjdG9yQXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IuIENhbGwgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICByZXR1cm4gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovIChjYWxsZXIuc3VwZXJDbGFzc18pCiAgICAgICAgLmNvbnN0cnVjdG9yLmFwcGx5KG1lLCBjdG9yQXJncyk7CiAgfQoKICBpZiAodHlwZW9mIG9wdF9tZXRob2ROYW1lICE9ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfbWV0aG9kTmFtZSAhPSAnc3ltYm9sJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdtZXRob2QgbmFtZXMgcHJvdmlkZWQgdG8gZ29vZy5iYXNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wnKTsKICB9CgogIC8vIENvcHlpbmcgdXNpbmcgbG9vcCB0byBhdm9pZCBkZW9wIGR1ZSB0byBwYXNzaW5nIGFyZ3VtZW50cyBvYmplY3QgdG8KICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMik7CiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogIH0KICB2YXIgZm91bmRDYWxsZXIgPSBmYWxzZTsKICBmb3IgKHZhciBwcm90byA9IG1lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsgcHJvdG87CiAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpIHsKICAgIGlmIChwcm90b1tvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgICBmb3VuZENhbGxlciA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGZvdW5kQ2FsbGVyKSB7CiAgICAgIHJldHVybiBwcm90b1tvcHRfbWV0aG9kTmFtZV0uYXBwbHkobWUsIGFyZ3MpOwogICAgfQogIH0KCiAgLy8gSWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBjYWxsZXIgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiwgdGhlbiBvbmUgb2YgdHdvCiAgLy8gdGhpbmdzIGhhcHBlbmVkOgogIC8vIDEpIFRoZSBjYWxsZXIgaXMgYW4gaW5zdGFuY2UgbWV0aG9kLgogIC8vIDIpIFRoaXMgbWV0aG9kIHdhcyBub3QgY2FsbGVkIGJ5IHRoZSByaWdodCBjYWxsZXIuCiAgaWYgKG1lW29wdF9tZXRob2ROYW1lXSA9PT0gY2FsbGVyKSB7CiAgICByZXR1cm4gbWUuY29uc3RydWN0b3IucHJvdG90eXBlW29wdF9tZXRob2ROYW1lXS5hcHBseShtZSwgYXJncyk7CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAnZ29vZy5iYXNlIGNhbGxlZCBmcm9tIGEgbWV0aG9kIG9mIG9uZSBuYW1lICcgKwogICAgICAgICd0byBhIG1ldGhvZCBvZiBhIGRpZmZlcmVudCBuYW1lJyk7CiAgfQp9OwoKCi8qKgogKiBBbGxvdyBmb3IgYWxpYXNpbmcgd2l0aGluIHNjb3BlIGZ1bmN0aW9ucy4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcgogKiB1bmNvbXBpbGVkIGNvZGUgLSBpbiBjb21waWxlZCBjb2RlIHRoZSBjYWxscyB3aWxsIGJlIGlubGluZWQgYW5kIHRoZSBhbGlhc2VzCiAqIGFwcGxpZWQuICBJbiB1bmNvbXBpbGVkIGNvZGUgdGhlIGZ1bmN0aW9uIGlzIHNpbXBseSBydW4gc2luY2UgdGhlIGFsaWFzZXMgYXMKICogd3JpdHRlbiBhcmUgdmFsaWQgSmF2YVNjcmlwdC4KICoKICoKICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBGdW5jdGlvbiB0byBjYWxsLiAgVGhpcyBmdW5jdGlvbiBjYW4gY29udGFpbiBhbGlhc2VzCiAqICAgICB0byBuYW1lc3BhY2VzIChlLmcuICJ2YXIgZG9tID0gZ29vZy5kb20iKSBvciBjbGFzc2VzCiAqICAgICAoZS5nLiAidmFyIFRpbWVyID0gZ29vZy5UaW1lciIpLgogKi8KZ29vZy5zY29wZSA9IGZ1bmN0aW9uKGZuKSB7CiAgaWYgKGdvb2cuaXNJbk1vZHVsZUxvYWRlcl8oKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCdnb29nLnNjb3BlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aGluIGEgbW9kdWxlLicpOwogIH0KICBmbi5jYWxsKGdvb2cuZ2xvYmFsKTsKfTsKCgovKgogKiBUbyBzdXBwb3J0IHVuY29tcGlsZWQsIHN0cmljdCBtb2RlIGJ1bmRsZXMgdGhhdCB1c2UgZXZhbCB0byBkaXZpZGUgc291cmNlCiAqIGxpa2Ugc286CiAqICAgIGV2YWwoJ3NvbWVTb3VyY2U7Ly8jIHNvdXJjZVVybCBzb3VyY2VmaWxlLmpzJyk7CiAqIFdlIG5lZWQgdG8gZXhwb3J0IHRoZSBnbG9iYWxseSBkZWZpbmVkIHN5bWJvbHMgImdvb2ciIGFuZCAiQ09NUElMRUQiLgogKiBFeHBvcnRpbmcgImdvb2ciIGJyZWFrcyB0aGUgY29tcGlsZXIgb3B0aW1pemF0aW9ucywgc28gd2UgcmVxdWlyZWQgdGhhdAogKiBiZSBkZWZpbmVkIGV4dGVybmFsbHkuCiAqIE5PVEU6IFdlIGRvbid0IHVzZSBnb29nLmV4cG9ydFN5bWJvbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyCiAqIGV4dGVybiBnZW5lcmF0aW9uIHdoZW4gdGhhdCBjb21waWxlciBvcHRpb24gaXMgZW5hYmxlZC4KICovCmlmICghQ09NUElMRUQpIHsKICBnb29nLmdsb2JhbFsnQ09NUElMRUQnXSA9IENPTVBJTEVEOwp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZ29vZy5kZWZpbmVDbGFzcyBpbXBsZW1lbnRhdGlvbgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8qKgogKiBDcmVhdGVzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIGEgQ2xvc3VyZSAiY2xhc3MiOgogKiAgIC0gZnJvbSB0aGUgY29tcGlsZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhlCiAqICAgICBjb25zdHJ1Y3RvciBpcyBzZWFsZWQgKG5vIG5ldyBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCkuICBUaGlzIGVuYWJsZXMKICogICAgIGJldHRlciBjaGVja3MuCiAqICAgLSB0aGUgY29tcGlsZXIgd2lsbCByZXdyaXRlIHRoaXMgZGVmaW5pdGlvbiB0byBhIGZvcm0gdGhhdCBpcyBvcHRpbWFsCiAqICAgICBmb3IgdHlwZSBjaGVja2luZyBhbmQgb3B0aW1pemF0aW9uIChpbml0aWFsbHkgdGhpcyB3aWxsIGJlIGEgbW9yZQogKiAgICAgdHJhZGl0aW9uYWwgZm9ybSkuCiAqCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MsIE9iamVjdCBvciBudWxsLgogKiBAcGFyYW0ge2dvb2cuZGVmaW5lQ2xhc3MuQ2xhc3NEZXNjcmlwdG9yfSBkZWYKICogICAgIEFuIG9iamVjdCBsaXRlcmFsIGRlc2NyaWJpbmcKICogICAgIHRoZSBjbGFzcy4gIEl0IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICogICAgICJjb25zdHJ1Y3RvciI6IHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiAgICAgInN0YXRpY3MiOiBhbiBvYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIG1ldGhvZHMgdG8gYWRkIHRvIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgYXMgInN0YXRpYyIgbWV0aG9kcyBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgZnVuY3Rpb24gYXMgaXRzIG9ubHkgcGFyYW1ldGVyIHRvIHdoaWNoIHN0YXRpYyBwcm9wZXJ0aWVzIGNhbgogKiAgICAgICAgYmUgYWRkZWQuCiAqICAgICBhbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIHByb3RvdHlwZS4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBUaGUgY2xhc3MgY29uc3RydWN0b3IuCiAqIEBkZXByZWNhdGVkIFVzZSBFUzYgY2xhc3Mgc3ludGF4IGluc3RlYWQuCiAqLwpnb29nLmRlZmluZUNsYXNzID0gZnVuY3Rpb24oc3VwZXJDbGFzcywgZGVmKSB7CiAgLy8gVE9ETyhqb2hubGVueik6IGNvbnNpZGVyIG1ha2luZyB0aGUgc3VwZXJDbGFzcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgdmFyIGNvbnN0cnVjdG9yID0gZGVmLmNvbnN0cnVjdG9yOwogIHZhciBzdGF0aWNzID0gZGVmLnN0YXRpY3M7CiAgLy8gV3JhcCB0aGUgY29uc3RydWN0b3IgcHJpb3IgdG8gc2V0dGluZyB1cCB0aGUgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcy4KICBpZiAoIWNvbnN0cnVjdG9yIHx8IGNvbnN0cnVjdG9yID09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHsKICAgIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdjYW5ub3QgaW5zdGFudGlhdGUgYW4gaW50ZXJmYWNlIChubyBjb25zdHJ1Y3RvciBkZWZpbmVkKS4nKTsKICAgIH07CiAgfQoKICB2YXIgY2xzID0gZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfKGNvbnN0cnVjdG9yLCBzdXBlckNsYXNzKTsKICBpZiAoc3VwZXJDbGFzcykgewogICAgZ29vZy5pbmhlcml0cyhjbHMsIHN1cGVyQ2xhc3MpOwogIH0KCiAgLy8gUmVtb3ZlIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgY29waWVkIHRvIHRoZSBwcm90b3R5cGUuCiAgZGVsZXRlIGRlZi5jb25zdHJ1Y3RvcjsKICBkZWxldGUgZGVmLnN0YXRpY3M7CgogIGdvb2cuZGVmaW5lQ2xhc3MuYXBwbHlQcm9wZXJ0aWVzXyhjbHMucHJvdG90eXBlLCBkZWYpOwogIGlmIChzdGF0aWNzICE9IG51bGwpIHsKICAgIGlmIChzdGF0aWNzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgc3RhdGljcyhjbHMpOwogICAgfSBlbHNlIHsKICAgICAgZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGNscywgc3RhdGljcyk7CiAgICB9CiAgfQoKICByZXR1cm4gY2xzOwp9OwoKCi8qKgogKiBAdHlwZWRlZiB7ewogKiAgIGNvbnN0cnVjdG9yOiAoIUZ1bmN0aW9ufHVuZGVmaW5lZCksCiAqICAgc3RhdGljczogKE9iamVjdHx1bmRlZmluZWR8ZnVuY3Rpb24oRnVuY3Rpb24pOnZvaWQpCiAqIH19CiAqLwpnb29nLmRlZmluZUNsYXNzLkNsYXNzRGVzY3JpcHRvcjsKCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IGdvb2cuZGVmaW5lQ2xhc3Mgc2hvdWxkCiAqICAgICBiZSBzZWFsZWQgd2hlbiBwb3NzaWJsZS4KICoKICogV2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIG5vdCBiZSB3cmFwcGVkIGJ5CiAqIGdvb2cuZGVmaW5lQ2xhc3MsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3MgbWV0aG9kcy4KICovCmdvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMgPQogICAgZ29vZy5kZWZpbmUoJ2dvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMnLCBnb29nLkRFQlVHKTsKCgovKioKICogSWYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUyBpcyBlbmFibGVkIGFuZCBPYmplY3Quc2VhbCBpcwogKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd3JhcCB0aGUgY29uc3RydWN0b3IgaW4gYSBmdW5jdGlvbiB0aGF0IHNlYWxzIHRoZQogKiByZXN1bHRzIG9mIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHshRnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3Igd2hvc2UgcmVzdWx0cyBtYXliZSBiZSBzZWFsZWQuCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gVGhlIHJlcGxhY2VtZW50IGNvbnN0cnVjdG9yLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfID0gZnVuY3Rpb24oY3RyLCBzdXBlckNsYXNzKSB7CiAgaWYgKCFnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTKSB7CiAgICAvLyBEbyBub3cgd3JhcCB0aGUgY29uc3RydWN0b3Igd2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkLiBBbmd1bGFyIGNvZGUKICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmb3IgaW5qZWN0aW9uIHRvIHdvcmsgcHJvcGVybHkuCiAgICByZXR1cm4gY3RyOwogIH0KCiAgLy8gQ29tcHV0ZSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBzZWFsYWJsZSBhdCBkZWZpbml0aW9uIHRpbWUsIHJhdGhlcgogIC8vIHRoYW4gd2hlbiB0aGUgaW5zdGFuY2UgaXMgYmVpbmcgY29uc3RydWN0ZWQuCiAgdmFyIHN1cGVyY2xhc3NTZWFsYWJsZSA9ICFnb29nLmRlZmluZUNsYXNzLmlzVW5zZWFsYWJsZV8oc3VwZXJDbGFzcyk7CgogIC8qKgogICAqIEB0aGlzIHtPYmplY3R9CiAgICogQHJldHVybiB7P30KICAgKi8KICB2YXIgd3JhcHBlZEN0ciA9IGZ1bmN0aW9uKCkgewogICAgLy8gRG9uJ3Qgc2VhbCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHdoZW4gaXQgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIG9mCiAgICAvLyBpdHMgc3VwZXIgY2xhc3MgYXMgdGhlcmUgaXMgbW9zdCBsaWtlbHkgc3RpbGwgc2V0dXAgdG8gZG8uCiAgICB2YXIgaW5zdGFuY2UgPSBjdHIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgaW5zdGFuY2VbZ29vZy5VSURfUFJPUEVSVFlfXSA9IGluc3RhbmNlW2dvb2cuVUlEX1BST1BFUlRZX107CgogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IHdyYXBwZWRDdHIgJiYgc3VwZXJjbGFzc1NlYWxhYmxlICYmCiAgICAgICAgT2JqZWN0LnNlYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICBPYmplY3Quc2VhbChpbnN0YW5jZSk7CiAgICB9CiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfTsKCiAgcmV0dXJuIHdyYXBwZWRDdHI7Cn07CgoKLyoqCiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3IgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGJlZW4gdGFnZ2VkIGFzIHVuc2VhbGFibGUKICogICAgIHVzaW5nIGdvb2cudGFnVW5zZWFsYWJsZUNsYXNzLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5pc1Vuc2VhbGFibGVfID0gZnVuY3Rpb24oY3RyKSB7CiAgcmV0dXJuIGN0ciAmJiBjdHIucHJvdG90eXBlICYmCiAgICAgIGN0ci5wcm90b3R5cGVbZ29vZy5VTlNFQUxBQkxFX0NPTlNUUlVDVE9SX1BST1BFUlRZX107Cn07CgoKLy8gVE9ETyhqb2hubGVueik6IHNoYXJlIHRoZXNlIHZhbHVlcyB3aXRoIHRoZSBnb29nLm9iamVjdAovKioKICogVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBhcmUgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLgogKiBAdHlwZSB7IUFycmF5PHN0cmluZz59CiAqIEBwcml2YXRlCiAqIEBjb25zdAogKi8KZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18gPSBbCiAgJ2NvbnN0cnVjdG9yJywgJ2hhc093blByb3BlcnR5JywgJ2lzUHJvdG90eXBlT2YnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsICd0b1N0cmluZycsICd2YWx1ZU9mJwpdOwoKCi8vIFRPRE8oam9obmxlbnopOiBzaGFyZSB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGdvb2cub2JqZWN0Ci8qKgogKiBAcGFyYW0geyFPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRvIGFkZCBwcm9wZXJ0aWVzIHRvLgogKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAvLyBUT0RPKGpvaG5sZW56KTogdXBkYXRlIHRoaXMgdG8gc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzCgogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gc291cmNlKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgfQogIH0KCiAgLy8gRm9yIElFIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdAogIC8vIGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlIGlzUHJvdG90eXBlT2YgZnJvbQogIC8vIE9iamVjdC5wcm90b3R5cGUpIGFuZCBpdCB3aWxsIGFsc28gbm90IGluY2x1ZGUgJ3JlcGxhY2UnIG9uIG9iamVjdHMgdGhhdAogIC8vIGV4dGVuZCBTdHJpbmcgYW5kIGNoYW5nZSAncmVwbGFjZScgKG5vdCB0aGF0IGl0IGlzIGNvbW1vbiBmb3IgYW55b25lIHRvCiAgLy8gZXh0ZW5kIGFueXRoaW5nIGV4Y2VwdCBPYmplY3QpLgogIGZvciAodmFyIGkgPSAwOyBpIDwgZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoOyBpKyspIHsKICAgIGtleSA9IGdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2ldOwogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgIH0KICB9Cn07CgoKLyoqCiAqIFNlYWxpbmcgY2xhc3NlcyBicmVha3MgdGhlIG9sZGVyIGlkaW9tIG9mIGFzc2lnbmluZyBwcm9wZXJ0aWVzIG9uIHRoZQogKiBwcm90b3R5cGUgcmF0aGVyIHRoYW4gaW4gdGhlIGNvbnN0cnVjdG9yLiBBcyBzdWNoLCBnb29nLmRlZmluZUNsYXNzCiAqIG11c3Qgbm90IHNlYWwgc3ViY2xhc3NlcyBvZiB0aGVzZSBvbGQtc3R5bGUgY2xhc3NlcyB1bnRpbCB0aGV5IGFyZSBmaXhlZC4KICogVW50aWwgdGhlbiwgdGhpcyBtYXJrcyBhIGNsYXNzIGFzICJicm9rZW4iLCBpbnN0cnVjdGluZyBkZWZpbmVDbGFzcwogKiBub3QgdG8gc2VhbCBzdWJjbGFzc2VzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RyIFRoZSBsZWdhY3kgY29uc3RydWN0b3IgdG8gdGFnIGFzIHVuc2VhbGFibGUuCiAqLwpnb29nLnRhZ1Vuc2VhbGFibGVDbGFzcyA9IGZ1bmN0aW9uKGN0cikgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUykgewogICAgY3RyLnByb3RvdHlwZVtnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfXSA9IHRydWU7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bnNlYWxhYmxlIHRhZyBwcm9wZXJ0eS4KICogQGNvbnN0IEBwcml2YXRlIHtzdHJpbmd9CiAqLwpnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfID0gJ2dvb2dfZGVmaW5lQ2xhc3NfbGVnYWN5X3Vuc2VhbGFibGUnOwoKCi8vIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGNvbXBpbGVyIHdoZXJlIHdpdGhvdXQgY29sbGFwc2UgcHJvcGVydGllcyB0aGUKLy8gQ2xvc3VyZSBuYW1lc3BhY2UgZGVmaW5lcyBkbyBub3QgZ3VhcmQgY29kZSBjb3JyZWN0bHkuIFRvIGhlbHAgcmVkdWNlIGNvZGUKLy8gc2l6ZSBhbHNvIGNoZWNrIGZvciAhQ09NUElMRUQgZXZlbiB0aG91Z2ggaXQgcmVkdW5kYW50IHVudGlsIHRoaXMgaXMgZml4ZWQuCmlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBpcyBpbiB0aGUgY29udGV4dCBvZiBhbiBIVE1MIGRvY3VtZW50LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgbG9va3MgbGlrZSBIVE1MIGRvY3VtZW50LgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5pbkh0bWxEb2N1bWVudF8gPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAdHlwZSB7IURvY3VtZW50fSAqLwogICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgcmV0dXJuIGRvYyAhPSBudWxsICYmICd3cml0ZScgaW4gZG9jOyAgLy8gWFVMRG9jdW1lbnQgbWlzc2VzIHdyaXRlLgogIH07CgoKICAvKioKICAgKiBXZSdkIGxpa2UgdG8gY2hlY2sgZm9yIGlmIHRoZSBkb2N1bWVudCByZWFkeVN0YXRlIGlzICdsb2FkaW5nJzsgaG93ZXZlcgogICAqIHRoZXJlIGFyZSBidWdzIG9uIElFIDEwIGFuZCBiZWxvdyB3aGVyZSB0aGUgcmVhZHlTdGF0ZSBiZWluZyBhbnl0aGluZyBvdGhlcgogICAqIHRoYW4gJ2NvbXBsZXRlJyBpcyBub3QgcmVsaWFibGUuCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfID0gZnVuY3Rpb24oKSB7CiAgICAvLyBhdHRhY2hFdmVudCBpcyBhdmFpbGFibGUgb24gSUUgNiB0aHJ1IDEwIG9ubHksIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvCiAgICAvLyBkZXRlY3QgdGhvc2UgYnJvd3NlcnMuCiAgICAvKiogQHR5cGUgeyFIVE1MRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICByZXR1cm4gZG9jLmF0dGFjaEV2ZW50ID8gZG9jLnJlYWR5U3RhdGUgIT0gJ2NvbXBsZXRlJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLnJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnOwogIH07CgoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3QgdGhlIGJhc2UgcGF0aCBvZiBiYXNlLmpzIHNjcmlwdCB0aGF0IGJvb3RzdHJhcHMgQ2xvc3VyZS4KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuZmluZEJhc2VQYXRoXyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIICE9IHVuZGVmaW5lZCAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgdHlwZW9mIGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIID09PSAnc3RyaW5nJykgewogICAgICBnb29nLmJhc2VQYXRoID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEg7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoIWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyoqIEB0eXBlIHshRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICAvLyBJZiB3ZSBoYXZlIGEgY3VycmVudFNjcmlwdCBhdmFpbGFibGUsIHVzZSBpdCBleGNsdXNpdmVseS4KICAgIHZhciBjdXJyZW50U2NyaXB0ID0gZG9jLmN1cnJlbnRTY3JpcHQ7CiAgICBpZiAoY3VycmVudFNjcmlwdCkgewogICAgICB2YXIgc2NyaXB0cyA9IFtjdXJyZW50U2NyaXB0XTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzY3JpcHRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdTQ1JJUFQnKTsKICAgIH0KICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgc2luY2UgdGhlIGN1cnJlbnQgc2NyaXB0IGlzIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIG9uZQogICAgLy8gdGhhdCBoYXMgYmFzZS5qcy4KICAgIGZvciAodmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBzY3JpcHQgPSAvKiogQHR5cGUgeyFIVE1MU2NyaXB0RWxlbWVudH0gKi8gKHNjcmlwdHNbaV0pOwogICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYzsKICAgICAgdmFyIHFtYXJrID0gc3JjLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgIHZhciBsID0gcW1hcmsgPT0gLTEgPyBzcmMubGVuZ3RoIDogcW1hcms7CiAgICAgIGlmIChzcmMuc3Vic3RyKGwgLSA3LCA3KSA9PSAnYmFzZS5qcycpIHsKICAgICAgICBnb29nLmJhc2VQYXRoID0gc3JjLnN1YnN0cigwLCBsIC0gNyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfTsKCiAgZ29vZy5maW5kQmFzZVBhdGhfKCk7CgogIC8qKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgKi8KICBnb29nLlRyYW5zcGlsZXIgPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAcHJpdmF0ZSB7P09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSAqLwogICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gbnVsbDsKICAgIC8qKiBAcHJpdmF0ZSB7c3RyaW5nfSAqLwogICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IGdvb2cuVFJBTlNQSUxFX1RPX0xBTkdVQUdFOwogIH07CgoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBtYXAgZnJvbSBsYW5ndWFnZSBtb2RlIHN0cmluZyB0byBhIGJvb2xlYW4KICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdHJhbnNwaWxhdGlvbiBzaG91bGQgYmUgZG9uZSBmb3IgdGhhdCBtb2RlIGFzIHdlbGwgYXMKICAgKiB0aGUgaGlnaGVzdCBsZXZlbCBsYW5ndWFnZSB0aGF0IHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMuCiAgICoKICAgKiBHdWFyYW50ZWVkIGludmFyaWFudDoKICAgKiBGb3IgYW55IHR3byBtb2RlcywgbDEgYW5kIGwyIHdoZXJlIGwyIGlzIGEgbmV3ZXIgbW9kZSB0aGFuIGwxLAogICAqIGBtYXBbbDFdID09IHRydWVgIGltcGxpZXMgdGhhdCBgbWFwW2wyXSA9PSB0cnVlYC4KICAgKgogICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZXh0cmFjdGVkIGFuZCB1c2VkIGVsc2V3aGVyZSwgc28gaXQgY2Fubm90IHJlbHkgb24KICAgKiBhbnl0aGluZyBleHRlcm5hbCAoaXQgc2hvdWxkIGVhc2lseSBiZSBhYmxlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAqIHN0YW5kYWxvbmUsIHRvcCBsZXZlbCBmdW5jdGlvbikuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEByZXR1cm4ge3sKICAgKiAgIHRhcmdldDogc3RyaW5nLAogICAqICAgbWFwOiAhT2JqZWN0PHN0cmluZywgYm9vbGVhbj4KICAgKiB9fQogICAqLwogIGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUuY3JlYXRlUmVxdWlyZXNUcmFuc3BpbGF0aW9uXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHRyYW5zcGlsYXRpb25UYXJnZXQgPSAnZXMzJzsKICAgIHZhciAvKiogIU9iamVjdDxzdHJpbmcsIGJvb2xlYW4+ICovIHJlcXVpcmVzVHJhbnNwaWxhdGlvbiA9IHsnZXMzJzogZmFsc2V9OwogICAgdmFyIHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEFkZHMgYW4gZW50cnkgdG8gcmVxdWlyZXNUcmFuc3BsaWF0aW9uIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbW9kZS4KICAgICAqCiAgICAgKiBJTVBPUlRBTlQ6IENhbGxzIG11c3QgYmUgbWFkZSBpbiBvcmRlciBmcm9tIG9sZGVzdCB0byBuZXdlc3QgbGFuZ3VhZ2UKICAgICAqIG1vZGUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZU5hbWUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogYm9vbGVhbn0gaXNTdXBwb3J0ZWQgUmV0dXJucyB0cnVlIGlmIHRoZSBKUyBlbmdpbmUKICAgICAqICAgICBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjayhtb2RlTmFtZSwgaXNTdXBwb3J0ZWQpIHsKICAgICAgaWYgKHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMpIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgdHJhbnNwaWxhdGlvblRhcmdldCA9IG1vZGVOYW1lOwogICAgICAgIHJlcXVpcmVzVHJhbnNwaWxhdGlvblttb2RlTmFtZV0gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgICB0cmFuc3BpbGF0aW9uUmVxdWlyZWRGb3JBbGxMYXRlck1vZGVzID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRG9lcyB0aGUgZ2l2ZW4gY29kZSBldmFsdWF0ZSB3aXRob3V0IHN5bnRheCBlcnJvcnMgYW5kIHJldHVybiBhIHRydXRoeQogICAgICogcmVzdWx0PwogICAgICovCiAgICBmdW5jdGlvbiAvKiogYm9vbGVhbiAqLyBldmFsQ2hlY2soLyoqIHN0cmluZyAqLyBjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhZXZhbChjb2RlKTsKICAgICAgfSBjYXRjaCAoaWdub3JlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciB1c2VyQWdlbnQgPSBnb29nLmdsb2JhbC5uYXZpZ2F0b3IgJiYgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA/CiAgICAgICAgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA6CiAgICAgICAgJyc7CgogICAgLy8gSWRlbnRpZnkgRVMzLW9ubHkgYnJvd3NlcnMgYnkgdGhlaXIgaW5jb3JyZWN0IHRyZWF0bWVudCBvZiBjb21tYXMuCiAgICBhZGROZXdlckxhbmd1YWdlVHJhbnNwaWxhdGlvbkNoZWNrKCdlczUnLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV2YWxDaGVjaygnWzEsXS5sZW5ndGg9PTEnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM2JywgZnVuY3Rpb24oKSB7CiAgICAgIC8vIEVkZ2UgaGFzIGEgbm9uLWRldGVybWluaXN0aWMgKGkuZS4sIG5vdCByZXByb2R1Y2libGUpIGJ1ZyB3aXRoIEVTNjoKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9DaGFrcmFDb3JlL2lzc3Vlcy8xNDk2LgogICAgICB2YXIgcmUgPSAvRWRnZVwvKFxkKykoXC5cZCkqL2k7CiAgICAgIHZhciBlZGdlVXNlckFnZW50ID0gdXNlckFnZW50Lm1hdGNoKHJlKTsKICAgICAgaWYgKGVkZ2VVc2VyQWdlbnQpIHsKICAgICAgICAvLyBUaGUgUmVmbGVjdC5jb25zdHJ1Y3QgdGVzdCBiZWxvdyBpcyBmbGFreSBvbiBFZGdlLiBJdCBjYW4gc29tZXRpbWVzCiAgICAgICAgLy8gcGFzcyBvciBmYWlsIG9uIDQwIDE1LjE1MDYzLCBzbyBqdXN0IGV4aXQgZWFybHkgZm9yIEVkZ2UgYW5kIHRyZWF0CiAgICAgICAgLy8gaXQgYXMgRVM1LiBVbnRpbCB3ZSdyZSBvbiBhIG1vcmUgdXAgdG8gZGF0ZSB2ZXJzaW9uIGp1c3QgYWx3YXlzIHVzZQogICAgICAgIC8vIEVTNS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzIxNy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVGVzdCBlczY6IFtGRjUwICg/KSwgRWRnZSAxNCAoPyksIENocm9tZSA1MF0KICAgICAgLy8gICAoYSkgZGVmYXVsdCBwYXJhbXMgKHNwZWNpZmljYWxseSBzaGFkb3dpbmcgbG9jYWxzKSwKICAgICAgLy8gICAoYikgZGVzdHJ1Y3R1cmluZywgKGMpIGJsb2NrLXNjb3BlZCBmdW5jdGlvbnMsCiAgICAgIC8vICAgKGQpIGZvci1vZiAoY29uc3QpLCAoZSkgbmV3LnRhcmdldC9SZWZsZWN0LmNvbnN0cnVjdAogICAgICB2YXIgZXM2ZnVsbFRlc3QgPQogICAgICAgICAgJ2NsYXNzIFh7Y29uc3RydWN0b3IoKXtpZihuZXcudGFyZ2V0IT1TdHJpbmcpdGhyb3cgMTt0aGlzLng9NDJ9fScgKwogICAgICAgICAgJ2xldCBxPVJlZmxlY3QuY29uc3RydWN0KFgsW10sU3RyaW5nKTtpZihxLnghPTQyfHwhKHEgaW5zdGFuY2VvZiAnICsKICAgICAgICAgICdTdHJpbmcpKXRocm93IDE7Zm9yKGNvbnN0IGEgb2ZbMiwzXSl7aWYoYT09Miljb250aW51ZTtmdW5jdGlvbiAnICsKICAgICAgICAgICdmKHo9e2F9KXtsZXQgYT0wO3JldHVybiB6LmF9e2Z1bmN0aW9uIGYoKXtyZXR1cm4gMDt9fXJldHVybiBmKCknICsKICAgICAgICAgICc9PTN9JzsKCiAgICAgIHJldHVybiBldmFsQ2hlY2soJygoKT0+eyJ1c2Ugc3RyaWN0IjsnICsgZXM2ZnVsbFRlc3QgKyAnfSkoKScpOwogICAgfSk7CiAgICAvLyAqKiBhbmQgKio9IGFyZSB0aGUgb25seSBuZXcgZmVhdHVyZXMgaW4gJ2VzNycKICAgIGFkZE5ld2VyTGFuZ3VhZ2VUcmFuc3BpbGF0aW9uQ2hlY2soJ2VzNycsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZhbENoZWNrKCcyICoqIDIgPT0gNCcpOwogICAgfSk7CiAgICAvLyBhc3luYyBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiAnZXM4JwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM4JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJ2FzeW5jICgpID0+IDEsIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM5JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJyh7Li4ucmVzdH0gPSB7fSksIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXNfbmV4dCcsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZmFsc2U7ICAvLyBhc3N1bWUgaXQgYWx3YXlzIG5lZWQgdG8gdHJhbnNwaWxlCiAgICB9KTsKICAgIHJldHVybiB7dGFyZ2V0OiB0cmFuc3BpbGF0aW9uVGFyZ2V0LCBtYXA6IHJlcXVpcmVzVHJhbnNwaWxhdGlvbn07CiAgfTsKCgogIC8qKgogICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZC4KICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZwogICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbW9kdWxlCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKi8KICBnb29nLlRyYW5zcGlsZXIucHJvdG90eXBlLm5lZWRzVHJhbnNwaWxlID0gZnVuY3Rpb24obGFuZywgbW9kdWxlKSB7CiAgICBpZiAoZ29vZy5UUkFOU1BJTEUgPT0gJ2Fsd2F5cycpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmICghdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fKSB7CiAgICAgIHZhciBvYmogPSB0aGlzLmNyZWF0ZVJlcXVpcmVzVHJhbnNwaWxhdGlvbl8oKTsKICAgICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gb2JqLm1hcDsKICAgICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IHRoaXMudHJhbnNwaWxhdGlvblRhcmdldF8gfHwgb2JqLnRhcmdldDsKICAgIH0KICAgIGlmIChsYW5nIGluIHRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXykgewogICAgICBpZiAodGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fW2xhbmddKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmIG1vZHVsZSA9PSAnZXM2JyAmJgogICAgICAgICAgISgnbm9Nb2R1bGUnIGluIGdvb2cuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlIG1vZGU6ICcgKyBsYW5nKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTGF6aWx5IHJldHJpZXZlcyB0aGUgdHJhbnNwaWxlciBhbmQgYXBwbGllcyBpdCB0byB0aGUgc291cmNlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgY29kZS4KICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAgICovCiAgZ29vZy5UcmFuc3BpbGVyLnByb3RvdHlwZS50cmFuc3BpbGUgPSBmdW5jdGlvbihjb2RlLCBwYXRoKSB7CiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IFdlIHNob3VsZCBkZWxldGUgZ29vZy50cmFuc3BpbGVfIGFuZCBqdXN0IGhhdmUgdGhpcwogICAgLy8gZnVuY3Rpb24uIEJ1dCB0aGVyZSdzIHNvbWUgY29tcGlsZSBlcnJvciBhdG0gd2hlcmUgZ29vZy5nbG9iYWwgaXMgYmVpbmcKICAgIC8vIHN0cmlwcGVkIGluY29ycmVjdGx5IHdpdGhvdXQgdGhpcy4KICAgIHJldHVybiBnb29nLnRyYW5zcGlsZV8oY29kZSwgcGF0aCwgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0Xyk7CiAgfTsKCgogIC8qKiBAcHJpdmF0ZSBAZmluYWwgeyFnb29nLlRyYW5zcGlsZXJ9ICovCiAgZ29vZy50cmFuc3BpbGVyXyA9IG5ldyBnb29nLlRyYW5zcGlsZXIoKTsKCiAgLyoqCiAgICogUmV3cml0ZXMgY2xvc2luZyBzY3JpcHQgdGFncyBpbiBpbnB1dCB0byBhdm9pZCBlbmRpbmcgYW4gZW5jbG9zaW5nIHNjcmlwdAogICAqIHRhZy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLnByb3RlY3RTY3JpcHRUYWdfID0gZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLzxcLyhTQ1JJUFQpL2lnLCAnXFx4M2MvJDEnKTsKICB9OwoKCiAgLyoqCiAgICogQSBkZWJ1ZyBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvd25sb2FkaW5nIGFuZCBleGVjdXRpbmcgamF2YXNjcmlwdAogICAqIGZpbGVzIGluIGFuIHVuYnVuZGxlZCwgdW5jb21waWxlZCBlbnZpcm9ubWVudC4KICAgKgogICAqIFRoaXMgY2FuIGJlIGN1c3RpbWl6ZWQgdmlhIHRoZSBzZXREZXBlbmRlbmN5RmFjdG9yeSBtZXRob2QsIG9yIGJ5CiAgICogQ0xPU1VSRV9JTVBPUlRfU0NSSVBUL0NMT1NVUkVfTE9BRF9GSUxFX1NZTkMuCiAgICoKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogICAgLyoqIEBwcml2YXRlIEBjb25zdCB7IU9iamVjdDxzdHJpbmcsICFnb29nLkRlcGVuZGVuY3k+fSAqLwogICAgdGhpcy5kZXBlbmRlbmNpZXNfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gKi8KICAgIHRoaXMuaWRUb1BhdGhfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgYm9vbGVhbj59ICovCiAgICB0aGlzLndyaXR0ZW5fID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmxvYWRpbmdEZXBzXyA9IFtdOwogICAgLyoqIEBwcml2YXRlIHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmRlcHNUb0xvYWRfID0gW107CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLnBhdXNlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IWdvb2cuRGVwZW5kZW5jeUZhY3Rvcnl9ICovCiAgICB0aGlzLmZhY3RvcnlfID0gbmV3IGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkoZ29vZy50cmFuc3BpbGVyXyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8c3RyaW5nPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8gPSBbXTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmRlZmluZWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGNhbGwgb25jZSBhbGwgdGhlCiAgICogICAgIG5hbWVzcGFjZXMgaGF2ZSBsb2FkZWQuCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmJvb3RzdHJhcCA9IGZ1bmN0aW9uKG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7CiAgICB2YXIgY2IgPSBjYWxsYmFjazsKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSB7CiAgICAgIGlmIChjYikgewogICAgICAgIGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoY2IsIDApOwogICAgICAgIGNiID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGlmICghbmFtZXNwYWNlcy5sZW5ndGgpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGRlcHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2VzW2ldKTsKICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlZ29uaXplZCBuYW1lc3BhY2U6ICcgKyBuYW1lc3BhY2VzW2ldKTsKICAgICAgfQogICAgICBkZXBzLnB1c2godGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdKTsKICAgIH0KCiAgICB2YXIgcmVxdWlyZSA9IGdvb2cucmVxdWlyZTsKICAgIHZhciBsb2FkZWQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcXVpcmUobmFtZXNwYWNlc1tpXSk7CiAgICAgIGRlcHNbaV0ub25Mb2FkKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgrK2xvYWRlZCA9PSBuYW1lc3BhY2VzLmxlbmd0aCkgewogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIExvYWRzIHRoZSBDbG9zdXJlIERlcGVuZGVuY3kgZmlsZS4KICAgKgogICAqIEV4cG9zZWQgYSBwdWJsaWMgZnVuY3Rpb24gc28gQ0xPU1VSRV9OT19ERVBTIGNhbiBiZSBzZXQgdG8gZmFsc2UsIGJhc2UKICAgKiBsb2FkZWQsIHNldERlcGVuZGVuY3lGYWN0b3J5IGNhbGxlZCwgYW5kIHRoZW4gdGhpcyBjYWxsZWQuIGkuZS4gYWxsb3dzCiAgICogY3VzdG9tIGxvYWRpbmcgb2YgdGhlIGRlcHMgZmlsZS4KICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZENsb3N1cmVEZXBzID0gZnVuY3Rpb24oKSB7CiAgICAvLyBDaXJjdW12ZW50IGFkZERlcGVuZGVuY3ksIHdoaWNoIHdvdWxkIHRyeSB0byB0cmFuc3BpbGUgZGVwcy5qcyBpZgogICAgLy8gdHJhbnNwaWxlIGlzIHNldCB0byBhbHdheXMuCiAgICB2YXIgcmVsUGF0aCA9ICdkZXBzLmpzJzsKICAgIHRoaXMuZGVwc1RvTG9hZF8ucHVzaCh0aGlzLmZhY3RvcnlfLmNyZWF0ZURlcGVuZGVuY3koCiAgICAgICAgZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCksIHJlbFBhdGgsIFtdLCBbXSwge30sCiAgICAgICAgZmFsc2UpKTsKICAgIHRoaXMubG9hZERlcHNfKCk7CiAgfTsKCgogIC8qKgogICAqIE5vdGlmaWVzIHRoZSBkZWJ1ZyBsb2FkZXIgd2hlbiBhIGRlcGVuZGVuY3kgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGFic1BhdGhPcklkIFBhdGggb2YgdGhlIGRlcGVuZGVuY3kgb3IgZ29vZyBpZC4KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfZm9yY2UKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUucmVxdWVzdGVkID0gZnVuY3Rpb24oYWJzUGF0aE9ySWQsIG9wdF9mb3JjZSkgewogICAgdmFyIHBhdGggPSB0aGlzLmdldFBhdGhGcm9tRGVwc18oYWJzUGF0aE9ySWQpOwogICAgaWYgKHBhdGggJiYKICAgICAgICAob3B0X2ZvcmNlIHx8IHRoaXMuYXJlRGVwc0xvYWRlZF8odGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdLnJlcXVpcmVzKSkpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5kZWZlcnJlZENhbGxiYWNrc19bcGF0aF07CiAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgIGRlbGV0ZSB0aGlzLmRlZmVycmVkQ2FsbGJhY2tzX1twYXRoXTsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFNldHMgdGhlIGRlcGVuZGVuY3kgZmFjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbQogICAqIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gY29udHJvbCBob3cgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnNldERlcGVuZGVuY3lGYWN0b3J5ID0gZnVuY3Rpb24oZmFjdG9yeSkgewogICAgdGhpcy5mYWN0b3J5XyA9IGZhY3Rvcnk7CiAgfTsKCgogIC8qKgogICAqIFRyYXZzZXJzZXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggYW5kIHF1ZXVlcyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSwgYW5kIGFsbCBvZgogICAqIGl0cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcywgZm9yIGxvYWRpbmcgYW5kIHRoZW4gc3RhcnRzIGxvYWRpbmcgaWYgbm90CiAgICogcGF1c2VkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRfID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7CiAgICBpZiAoIXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2UpKSB7CiAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnZ29vZy5yZXF1aXJlIGNvdWxkIG5vdCBmaW5kOiAnICsgbmFtZXNwYWNlOwoKICAgICAgZ29vZy5sb2dUb0NvbnNvbGVfKGVycm9yTWVzc2FnZSk7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbG9hZGVyID0gdGhpczsKCiAgICAgIHZhciBkZXBzID0gW107CgogICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAqLwogICAgICB2YXIgdmlzaXQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICAgICB2YXIgcGF0aCA9IGxvYWRlci5nZXRQYXRoRnJvbURlcHNfKG5hbWVzcGFjZSk7CgogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZGVwZW5kZW5jeSBwYXRoIG9yIHN5bWJvbDogJyArIG5hbWVzcGFjZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobG9hZGVyLndyaXR0ZW5fW3BhdGhdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb2FkZXIud3JpdHRlbl9bcGF0aF0gPSB0cnVlOwoKICAgICAgICB2YXIgZGVwID0gbG9hZGVyLmRlcGVuZGVuY2llc19bcGF0aF07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXAucmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICghZ29vZy5pc1Byb3ZpZGVkXyhkZXAucmVxdWlyZXNbaV0pKSB7CiAgICAgICAgICAgIHZpc2l0KGRlcC5yZXF1aXJlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgfTsKCiAgICAgIHZpc2l0KG5hbWVzcGFjZSk7CgogICAgICB2YXIgd2FzTG9hZGluZyA9ICEhdGhpcy5kZXBzVG9Mb2FkXy5sZW5ndGg7CiAgICAgIHRoaXMuZGVwc1RvTG9hZF8gPSB0aGlzLmRlcHNUb0xvYWRfLmNvbmNhdChkZXBzKTsKCiAgICAgIGlmICghdGhpcy5wYXVzZWRfICYmICF3YXNMb2FkaW5nKSB7CiAgICAgICAgdGhpcy5sb2FkRGVwc18oKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBMb2FkcyBhbnkgcXVldWVkIGRlcGVuZGVuY2llcyB1bnRpbCB0aGV5IGFyZSBhbGwgbG9hZGVkIG9yIHBhdXNlZC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWREZXBzXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvYWRlciA9IHRoaXM7CiAgICB2YXIgcGF1c2VkID0gdGhpcy5wYXVzZWRfOwoKICAgIHdoaWxlICh0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aCAmJiAhcGF1c2VkKSB7CiAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbG9hZENhbGxEb25lID0gZmFsc2U7CiAgICAgICAgdmFyIGRlcCA9IGxvYWRlci5kZXBzVG9Mb2FkXy5zaGlmdCgpOwoKICAgICAgICB2YXIgbG9hZGVkID0gZmFsc2U7CiAgICAgICAgbG9hZGVyLmxvYWRpbmdfKGRlcCk7CgogICAgICAgIHZhciBjb250cm9sbGVyID0gewogICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBwYXVzZSBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXN1bWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgbG9hZGVyLnJlc3VtZV8oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBTb21lIGRlcCBjYWxsZWQgcGF1c2UgYW5kIHRoZW4gcmVzdW1lIGluIHRoZSBzYW1lIGxvYWQgY2FsbC4KICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgcnVubmluZyB0aGlzIHNhbWUgbG9vcC4KICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsb2FkZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBjYWxsIHRvIGxvYWRlZC4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgbG9hZGVyLmxvYWRlZF8oZGVwKTsKICAgICAgICAgIH0sCiAgICAgICAgICBwZW5kaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvcHkuCiAgICAgICAgICAgIHZhciBwZW5kaW5nID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9hZGVyLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHBlbmRpbmcucHVzaChsb2FkZXIubG9hZGluZ0RlcHNfW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGVuZGluZzsKICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlCiAgICAgICAgICAgKi8KICAgICAgICAgIHNldE1vZHVsZVN0YXRlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsCiAgICAgICAgICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCBzdHJpbmc9KX0gKi8KICAgICAgICAgIHJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0czogZnVuY3Rpb24oCiAgICAgICAgICAgICAgcGF0aCwgZXhwb3J0cywgb3B0X2Nsb3N1cmVOYW1lc3BhY2UpIHsKICAgICAgICAgICAgaWYgKG9wdF9jbG9zdXJlTmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tvcHRfY2xvc3VyZU5hbWVzcGFjZV0gPSB7CiAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgICAgdHlwZTogZ29vZy5Nb2R1bGVUeXBlLkVTNiwKICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBvcHRfY2xvc3VyZU5hbWVzcGFjZSB8fCAnJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgPyl9ICovCiAgICAgICAgICByZWdpc3Rlckdvb2dNb2R1bGVFeHBvcnRzOiBmdW5jdGlvbihtb2R1bGVJZCwgZXhwb3J0cykgewogICAgICAgICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZUlkXSA9IHsKICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HLAogICAgICAgICAgICAgIG1vZHVsZUlkOiBtb2R1bGVJZAogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIGNsZWFyTW9kdWxlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVmZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmIChsb2FkQ2FsbERvbmUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICdDYW5ub3QgcmVnaXN0ZXIgd2l0aCBkZWZlciBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvYWRlci5kZWZlcl8oZGVwLCBjYWxsYmFjayk7CiAgICAgICAgICB9LAogICAgICAgICAgYXJlRGVwc0xvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBsb2FkZXIuYXJlRGVwc0xvYWRlZF8oZGVwLnJlcXVpcmVzKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB0cnkgewogICAgICAgICAgZGVwLmxvYWQoY29udHJvbGxlcik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGxvYWRDYWxsRG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQoKICAgIGlmIChwYXVzZWQpIHsKICAgICAgdGhpcy5wYXVzZV8oKTsKICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnBhdXNlXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wYXVzZWRfID0gdHJ1ZTsKICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlc3VtZV8gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhdXNlZF8pIHsKICAgICAgdGhpcy5wYXVzZWRfID0gZmFsc2U7CiAgICAgIHRoaXMubG9hZERlcHNfKCk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGxvYWRpbmcgKGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCBpdCBoYXMgbm90CiAgICogeWV0IG1hcmtlZCBpdHNlbGYgYXMgZmluaXNoZWQpLiBVc2VmdWwgZm9yIGRlcGVuZGVuY2llcyB0aGF0IHdhbnQgdG8ga25vdwogICAqIHdoYXQgZWxzZSBpcyBsb2FkaW5nLiBFeGFtcGxlOiBnb29nLm1vZHVsZXMgY2Fubm90IGV2YWwgaWYgdGhlcmUgYXJlCiAgICogbG9hZGluZyBkZXBlbmRlbmNpZXMuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3l9IGRlcAogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRpbmdfID0gZnVuY3Rpb24oZGVwKSB7CiAgICB0aGlzLmxvYWRpbmdEZXBzXy5wdXNoKGRlcCk7CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGhhdmluZyBmaW5pc2hlZCBsb2FkaW5nIGFuZCBiZWluZyBhdmFpbGFibGUKICAgKiBmb3IgcmVxdWlyZS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuRGVwZW5kZW5jeX0gZGVwCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGVkXyA9IGZ1bmN0aW9uKGRlcCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5sb2FkaW5nRGVwc19baV0gPT0gZGVwKSB7CiAgICAgICAgdGhpcy5sb2FkaW5nRGVwc18uc3BsaWNlKGksIDEpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmRlZmVycmVkUXVldWVfW2ldID09IGRlcC5wYXRoKSB7CiAgICAgICAgdGhpcy5kZWZlcnJlZFF1ZXVlXy5zcGxpY2UoaSwgMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5sb2FkaW5nRGVwc18ubGVuZ3RoID09IHRoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoICYmCiAgICAgICAgIXRoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoKSB7CiAgICAgIC8vIFNvbWV0aGluZyBoYXMgYXNrZWQgdG8gbG9hZCB0aGVzZSwgYnV0IHRoZXkgbWF5IG5vdCBiZSBkaXJlY3RseQogICAgICAvLyByZXF1aXJlZCBhZ2FpbiBsYXRlciwgc28gbG9hZCB0aGVtIG5vdyB0aGF0IHdlIGtub3cgd2UncmUgZG9uZSBsb2FkaW5nCiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZS4gZS5nLiBhIGdvb2cgbW9kdWxlIGVudHJ5IHBvaW50LgogICAgICB3aGlsZSAodGhpcy5kZWZlcnJlZFF1ZXVlXy5sZW5ndGgpIHsKICAgICAgICB0aGlzLnJlcXVlc3RlZCh0aGlzLmRlZmVycmVkUXVldWVfLnNoaWZ0KCksIHRydWUpOwogICAgICB9CiAgICB9CgogICAgZGVwLmxvYWRlZCgpOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwYXRoc09ySWRzCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkXyA9IGZ1bmN0aW9uKHBhdGhzT3JJZHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHNPcklkcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhwYXRoc09ySWRzW2ldKTsKICAgICAgaWYgKCFwYXRoIHx8CiAgICAgICAgICAoIShwYXRoIGluIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfKSAmJgogICAgICAgICAgICFnb29nLmlzUHJvdmlkZWRfKHBhdGhzT3JJZHNbaV0pKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gYWJzUGF0aE9ySWQKICAgKiBAcmV0dXJuIHs/c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmdldFBhdGhGcm9tRGVwc18gPSBmdW5jdGlvbihhYnNQYXRoT3JJZCkgewogICAgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuaWRUb1BhdGhfKSB7CiAgICAgIHJldHVybiB0aGlzLmlkVG9QYXRoX1thYnNQYXRoT3JJZF07CiAgICB9IGVsc2UgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuZGVwZW5kZW5jaWVzXykgewogICAgICByZXR1cm4gYWJzUGF0aE9ySWQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHshZ29vZy5EZXBlbmRlbmN5fSBkZXBlbmRlbmN5CiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuZGVmZXJfID0gZnVuY3Rpb24oZGVwZW5kZW5jeSwgY2FsbGJhY2spIHsKICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2RlcGVuZGVuY3kucGF0aF0gPSBjYWxsYmFjazsKICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8ucHVzaChkZXBlbmRlbmN5LnBhdGgpOwogIH07CgoKICAvKioKICAgKiBJbnRlcmZhY2UgZm9yIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gaGF2ZSBzb21lIGNvbnRyb2wgb3ZlcgogICAqIGxvYWRpbmcgb2YgZGVwZW5kZW5jaWVzLgogICAqCiAgICogQHJlY29yZAogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gaGFsdCBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIFRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHJlc3VtZSBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzIGlmIHBhdXNlZC4KICAgKi8KICBnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdGhhdCB0aGlzIGRlcGVuZGVuY3kgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAgICoKICAgKiBUaGlzIGNhdXNlcyB0aGlzIHRvIGJlIHJlbW92ZWQgZnJvbSBwZW5kaW5nKCkgYW5kIGFueSBsb2FkIGNhbGxiYWNrcyB0bwogICAqIGZpcmUuCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIExpc3Qgb2YgZGVwZW5kZW5jaWVzIG9uIHdoaWNoIGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCB3aGljaCBoYXZlIG5vdAogICAqIGNhbGxlZCBsb2FkZWQgb24gdGhlaXIgY29udHJvbGxlci4gVGhpcyBpbmNsdWRlcyB0aGUgY3VycmVudCBkZXBlbmRlbmN5LgogICAqCiAgICogQHJldHVybiB7IUFycmF5PCFnb29nLkRlcGVuZGVuY3k+fQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBlbmRpbmcgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBhcyBhbiBFUzYgbW9kdWxlJ3MgZXhwb3J0cyBzbyB0aGF0IGdvb2cubW9kdWxlcyBtYXkKICAgKiByZXF1aXJlIGl0IGJ5IHBhdGguCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBGdWxsIHBhdGggb2YgdGhlIG1vZHVsZS4KICAgKiBAcGFyYW0gez99IGV4cG9ydHMKICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jbG9zdXJlTmFtZXNwYWNlIENsb3N1cmUgbmFtZXNwYWNlIHRvIGFzc29jaWF0ZSB3aXRoCiAgICogICAgIHRoaXMgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCBleHBvcnRzLCBvcHRfY2xvc3VyZU5hbWVzcGFjZSkge307CgoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IG1vZHVsZSBzdGF0ZS4KICAgKgogICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlIFR5cGUgb2YgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnNldE1vZHVsZVN0YXRlID0gZnVuY3Rpb24odHlwZSkge307CgoKICAvKioKICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgbW9kdWxlIHN0YXRlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyTW9kdWxlU3RhdGUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gY2FsbCBvbmNlIHRoZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IHJlcXVlc3RlZAogICAqIHZpYSBnb29nLnJlcXVpcmUgKyBhbGwgb2YgdGhlIGltbWVkaWF0ZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGxvYWRlZCBvcgogICAqIGFsbCBvdGhlciBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkLiBBbGxvd3MgZm9yIGxhenkgbG9hZGluZyB1bnRpbAogICAqIHJlcXVpcmUnZCB3aXRob3V0IHBhdXNpbmcgZGVwZW5kZW5jeSBsb2FkaW5nLCB3aGljaCBpcyBuZWVkZWQgb24gb2xkIElFLgogICAqCiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbihjYWxsYmFjaykge307CgoKICAvKioKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmFyZURlcHNMb2FkZWQgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogQmFzaWMgc3VwZXIgY2xhc3MgZm9yIGFsbCBkZXBlbmRlbmNpZXMgQ2xvc3VyZSBMaWJyYXJ5IGNhbiBsb2FkLgogICAqCiAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGxvYWQgdW50cmFuc3BpbGVkLCBub24tbW9kdWxlCiAgICogc2NyaXB0cyBpbiBhIHdlYiBicm9zd2VyLgogICAqCiAgICogRm9yIHRyYW5zcGlsZWQgbm9uLWdvb2cubW9kdWxlIGZpbGVzIHtAc2VlIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3l9LgogICAqIEZvciBnb29nLm1vZHVsZXMgc2VlIHtAc2VlIGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3l9LgogICAqIEZvciB1bnRyYW5zcGlsZWQgRVM2IG1vZHVsZXMge0BzZWUgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5fS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IKICAgKi8KICBnb29nLkRlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncykgewogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wYXRoID0gcGF0aDsKICAgIC8qKiBAY29uc3QgKi8KICAgIHRoaXMucmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wcm92aWRlcyA9IHByb3ZpZGVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5yZXF1aXJlcyA9IHJlcXVpcmVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5sb2FkRmxhZ3MgPSBsb2FkRmxhZ3M7CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLmxvYWRlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IUFycmF5PGZ1bmN0aW9uKCk+fSAqLwogICAgdGhpcy5sb2FkQ2FsbGJhY2tzXyA9IFtdOwogIH07CgoKICAvKioKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXRobmFtZSBwYXJ0IG9mIHRoaXMgZGVwZW5kZW5jeSdzIHBhdGggaWYgaXQgaXMgYQogICAqICAgICBVUkkuCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5nZXRQYXRoTmFtZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhdGhOYW1lID0gdGhpcy5wYXRoOwogICAgdmFyIHByb3RvY29sSW5kZXggPSBwYXRoTmFtZS5pbmRleE9mKCc6Ly8nKTsKICAgIGlmIChwcm90b2NvbEluZGV4ID49IDApIHsKICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCArIDMpOwogICAgICB2YXIgc2xhc2hJbmRleCA9IHBhdGhOYW1lLmluZGV4T2YoJy8nKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPj0gMCkgewogICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGhOYW1lOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIGZpcmUgYXMgc29vbiBhcyB0aGlzIGhhcyBsb2FkZWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHRoaXMubG9hZGVkXykgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTWFya3MgdGhpcyBkZXBlbmRlbmN5IGFzIGxvYWRlZCBhbmQgZmlyZXMgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGgKICAgKiBvbkxvYWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9hZGVkXyA9IHRydWU7CiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5sb2FkQ2FsbGJhY2tzXzsKICAgIHRoaXMubG9hZENhbGxiYWNrc18gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbGxiYWNrc1tpXSgpOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCBkb2N1bWVudC53cml0dGVuIC8gYXBwZW5kZWQgc2NyaXB0IHRhZ3Mgc2hvdWxkIGJlIGRlZmVycmVkLgogICAqCiAgICogQHByaXZhdGUge2Jvb2xlYW59CiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IGZhbHNlOwoKCiAgLyoqCiAgICogTWFwIG9mIHNjcmlwdCByZWFkeSAvIHN0YXRlIGNoYW5nZSBjYWxsYmFja3MuIE9sZCBJRSBjYW5ub3QgaGFuZGxlIHB1dHRpbmcKICAgKiB0aGVzZSBwcm9wZXJ0aWVzIG9uIGdvb2cuZ2xvYmFsLgogICAqCiAgICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgZnVuY3Rpb24oPyk6dW5kZWZpbmVkPn0KICAgKi8KICBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfID0ge307CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLj8pOj99IGNhbGxiYWNrCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBrZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKTsKICAgIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9ba2V5XSA9IGNhbGxiYWNrOwogICAgcmV0dXJuIGtleTsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGtleQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18gPSBmdW5jdGlvbihrZXkpIHsKICAgIGRlbGV0ZSBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfW2tleV07CiAgfTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgKiBAcGFyYW0gey4uLj99IHZhcl9hcmdzCiAgICogQHByaXZhdGUKICAgKiBAc3VwcHJlc3Mge3VudXNlZFByaXZhdGVNZW1iZXJzfQogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18gPSBmdW5jdGlvbihrZXksIHZhcl9hcmdzKSB7CiAgICBpZiAoa2V5IGluIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF8pIHsKICAgICAgdmFyIGNhbGxiYWNrID0gZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1trZXldOwogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB9CiAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ0NhbGxiYWNrIGtleSAnICsga2V5ICsKICAgICAgICAgICcgZG9lcyBub3QgZXhpc3QgKHdhcyBiYXNlLmpzIGxvYWRlZCBtb3JlIHRoYW4gb25jZT8pLic7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFN0YXJ0cyBsb2FkaW5nIHRoaXMgZGVwZW5kZW5jeS4gVGhpcyBkZXBlbmRlbmN5IGNhbiBwYXVzZSBsb2FkaW5nIGlmIGl0CiAgICogbmVlZHMgdG8gYW5kIHJlc3VtZSBpdCBsYXRlciB2aWEgdGhlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgogICAqCiAgICogV2hlbiB0aGlzIGlzIGxvYWRlZCBpdCBzaG91bGQgY2FsbCBjb250cm9sbGVyLmxvYWRlZCgpLiBOb3RlIHRoYXQgdGhpcyB3aWxsCiAgICogZW5kIHVwIGNhbGxpbmcgdGhlIGxvYWRlZCBtZXRob2Qgb2YgdGhpcyBkZXBlbmRlbmN5OyB0aGVyZSBpcyBubyBuZWVkIHRvCiAgICogY2FsbCBpdCBleHBsaWNpdGx5LgogICAqCiAgICogQHBhcmFtIHshZ29vZy5Mb2FkQ29udHJvbGxlcn0gY29udHJvbGxlcgogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHsKICAgIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpIHsKICAgICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCh0aGlzLnBhdGgpKSB7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghZ29vZy5pbkh0bWxEb2N1bWVudF8oKSkgewogICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAnQ2Fubm90IHVzZSBkZWZhdWx0IGRlYnVnIGxvYWRlciBvdXRzaWRlIG9mIEhUTUwgZG9jdW1lbnRzLicpOwogICAgICBpZiAodGhpcy5yZWxhdGl2ZVBhdGggPT0gJ2RlcHMuanMnKSB7CiAgICAgICAgLy8gU29tZSBvbGQgY29kZSBpcyByZWx5aW5nIG9uIGJhc2UuanMgYXV0byBsb2FkaW5nIGRlcHMuanMgZmFpbGluZyB3aXRoCiAgICAgICAgLy8gbm8gZXJyb3IgYmVmb3JlIGxhdGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBULgogICAgICAgIC8vIENMT1NVUkVfSU1QT1JUX1NDUklQVCBzaG91bGQgYmUgc2V0ICpiZWZvcmUqIGJhc2UuanMgaXMgbG9hZGVkLCBvcgogICAgICAgIC8vIENMT1NVUkVfTk9fREVQUyBzZXQgdG8gdHJ1ZS4KICAgICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAgICdDb25zaWRlciBzZXR0aW5nIENMT1NVUkVfSU1QT1JUX1NDUklQVCBiZWZvcmUgbG9hZGluZyBiYXNlLmpzLCAnICsKICAgICAgICAgICAgJ29yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuJyk7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byByZXF1aXJlIGEgbmV3IHN5bWJvbCBhZnRlciBkb2N1bWVudCBsb2FkLAogICAgLy8gc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nLiBEb2luZyBhIGRvY3VtZW50LndyaXRlIHdvdWxkCiAgICAvLyB3aXBlIG91dCB0aGUgcGFnZS4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgQ1NQLWNvbXBsaWFudCBtZXRob2QKICAgIC8vIG9mIHdyaXRpbmcgc2NyaXB0IHRhZ3MuCiAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyAmJgogICAgICAgICFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcpIHsKICAgICAgLy8gQ2VydGFpbiB0ZXN0IGZyYW1ld29ya3MgbG9hZCBiYXNlLmpzIG11bHRpcGxlIHRpbWVzLCB3aGljaCB0cmllcwogICAgICAvLyB0byB3cml0ZSBkZXBzLmpzIGVhY2ggdGltZS4gSWYgdGhhdCBoYXBwZW5zLCBqdXN0IGZhaWwgc2lsZW50bHkuCiAgICAgIC8vIFRoZXNlIGZyYW1ld29ya3Mgd2lwZSB0aGUgcGFnZSBiZXR3ZWVuIGVhY2ggbG9hZCBvZiBiYXNlLmpzLCBzbyB0aGlzCiAgICAgIC8vIGlzIE9LLgogICAgICB2YXIgaXNEZXBzID0gL1xiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKTsKICAgICAgaWYgKGlzRGVwcykgewogICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgd3JpdGUgIicgKyB0aGlzLnBhdGggKyAnIiBhZnRlciBkb2N1bWVudCBsb2FkJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyAmJgogICAgICAgIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpIHsKICAgICAgdmFyIGtleSA9IGdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgICBpZiAoIWdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gfHwgc2NyaXB0LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJykgewogICAgICAgICAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oa2V5KTsKICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIG5vbmNlQXR0ciA9ICFnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfICYmIGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSA/CiAgICAgICAgICAnIG5vbmNlPSInICsgZ29vZy5nZXRTY3JpcHROb25jZSgpICsgJyInIDoKICAgICAgICAgICcnOwogICAgICB2YXIgZXZlbnQgPQogICAgICAgICAgZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXyA/ICdvbnJlYWR5c3RhdGVjaGFuZ2UnIDogJ29ubG9hZCc7CiAgICAgIHZhciBkZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPyAnZGVmZXInIDogJyc7CiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCBzcmM9IicgKyB0aGlzLnBhdGggKyAnIiAnICsgZXZlbnQgKwogICAgICAgICAgJz0iZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXyhcJycgKyBrZXkgKwogICAgICAgICAgJ1wnLCB0aGlzKSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAnICsgZGVmZXIgKyBub25jZUF0dHIgKyAnPjwnICsKICAgICAgICAgICcvc2NyaXB0Pic7CiAgICAgIGRvYy53cml0ZSgKICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgICBnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKHNjcmlwdCkgOgogICAgICAgICAgICAgIHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl87CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCiAgICAgIC8vIElmIENTUCBub25jZXMgYXJlIHVzZWQsIHByb3BhZ2F0ZSB0aGVtIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZWQgc2NyaXB0cy4KICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbm9uY2UtYmFzZWQgQ1NQcyB3aXRob3V0ICdzdHJpY3QtZHluYW1pYycuCiAgICAgIHZhciBub25jZSA9IGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKTsKICAgICAgaWYgKG5vbmNlKSB7CiAgICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTsKICAgICAgfQoKICAgICAgaWYgKGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8pIHsKICAgICAgICAvLyBFeGVjdXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgb24gb2xkIElFLCBoYWx0IGxvYWRpbmcgYW5kIHdyaXRlCiAgICAgICAgLy8gdGhlc2Ugc2NyaXB0cyBvbmUgYXQgYSB0aW1lLCBhZnRlciBlYWNoIGxvYWRzLgogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzY3JpcHRFbC5yZWFkeVN0YXRlID09ICdsb2FkZWQnIHx8CiAgICAgICAgICAgICAgc2NyaXB0RWwucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdW1lKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHRFbC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHNjcmlwdEVsLm9ubG9hZCA9IG51bGw7CiAgICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTCh0aGlzLnBhdGgpIDoKICAgICAgICAgIHRoaXMucGF0aDsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpOwogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIFNob3VsZCBiZSBhbiBlbXB0eSBhcnJheS4KICAgKiAgICAgVE9ETyhqb2hucGxhaXN0ZWQpIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgY2xvc3VyZSBuYW1lc3BhY2VzIHRvIEVTNgogICAqICAgICBtb2R1bGVzIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLkRlcGVuZGVuY3l9CiAgICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLkVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCkgewogICAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCkpIHsKICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFnb29nLmluSHRtbERvY3VtZW50XygpKSB7CiAgICAgIGdvb2cubG9nVG9Db25zb2xlXygKICAgICAgICAgICdDYW5ub3QgdXNlIGRlZmF1bHQgZGVidWcgbG9hZGVyIG91dHNpZGUgb2YgSFRNTCBkb2N1bWVudHMuJyk7CiAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgZGVwID0gdGhpczsKCiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IERvZXMgZG9jdW1lbnQud3JpdGluZyByZWFsbHkgc3BlZWQgdXAgYW55dGhpbmc/IEFueQogICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGp1c3Qgd2FpdGluZyBmb3IgaW50ZXJhY3RpdmUgbW9kZSBhbmQgdGhlbgogICAgLy8gYXBwZW5kaW5nPwogICAgZnVuY3Rpb24gd3JpdGUoc3JjLCBjb250ZW50cykgewogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICB2YXIgc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj4nICsgY29udGVudHMgKyAnPC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSInICsgc3JjICsgJyI+PC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBlbmQoc3JjLCBjb250ZW50cykgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IHRydWU7CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAnbW9kdWxlJzsKICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdjcm9zc29yaWdpbicsIHRydWUpOwoKICAgICAgLy8gSWYgQ1NQIG5vbmNlcyBhcmUgdXNlZCwgcHJvcGFnYXRlIHRoZW0gdG8gZHluYW1pY2FsbHkgY3JlYXRlZCBzY3JpcHRzLgogICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBub25jZS1iYXNlZCBDU1BzIHdpdGhvdXQgJ3N0cmljdC1keW5hbWljJy4KICAgICAgdmFyIG5vbmNlID0gZ29vZy5nZXRTY3JpcHROb25jZSgpOwogICAgICBpZiAobm9uY2UpIHsKICAgICAgICBzY3JpcHRFbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpOwogICAgICB9CgogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICBzY3JpcHRFbC50ZXh0Q29udGVudCA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0KGNvbnRlbnRzKSA6CiAgICAgICAgICAgIGNvbnRlbnRzOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0VVJMKHNyYykgOgogICAgICAgICAgICBzcmM7CiAgICAgIH0KCiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsKTsKICAgIH0KCiAgICB2YXIgY3JlYXRlOwoKICAgIGlmIChnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpKSB7CiAgICAgIGNyZWF0ZSA9IHdyaXRlOwogICAgICAvLyBXZSBjYW4gT05MWSBjYWxsIGRvY3VtZW50LndyaXRlIGlmIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgYW55CiAgICAgIC8vIG5vbi1tb2R1bGUgc2NyaXB0IHRhZ3MgZG9jdW1lbnQud3JpdHRlbiBhZnRlciB0aGlzIGFyZSBkZWZlcnJlZC4KICAgICAgLy8gU21hbGwgb3B0aW1pemF0aW9uLCBpbiB0aGVvcnkgZG9jdW1lbnQud3JpdGluZyBpcyBmYXN0ZXIuCiAgICAgIGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3JlYXRlID0gYXBwZW5kOwogICAgfQoKICAgIC8vIFdyaXRlIDQgc2VwYXJhdGUgdGFncyBoZXJlOgogICAgLy8gMSkgU2V0cyB0aGUgbW9kdWxlIHN0YXRlIGF0IHRoZSBjb3JyZWN0IHRpbWUgKGp1c3QgYmVmb3JlIGV4ZWN1dGlvbikuCiAgICAvLyAyKSBBIHNyYyBub2RlIGZvciB0aGlzLCB3aGljaCBqdXN0IGhvcGVmdWxseSBsZXRzIHRoZSBicm93c2VyIGxvYWQgaXQgYQogICAgLy8gICAgbGl0dGxlIGVhcmx5IChubyBuZWVkIHRvIHBhcnNlICMzKS4KICAgIC8vIDMpIEltcG9ydCB0aGUgbW9kdWxlIGFuZCByZWdpc3RlciBpdC4KICAgIC8vIDQpIENsZWFyIHRoZSBtb2R1bGUgc3RhdGUgYXQgdGhlIGNvcnJlY3QgdGltZS4gR3VhcmFudGVlZCB0byBydW4gZXZlbgogICAgLy8gICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIG1vZHVsZSAoIzMgd2lsbCBub3QgcnVuIGlmIHRoZXJlIGlzIGFuCiAgICAvLyAgICBlcnJvciBpbiB0aGUgbW9kdWxlKS4KICAgIHZhciBiZWZvcmVLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oKSB7CiAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGJlZm9yZUtleSk7CiAgICAgIGNvbnRyb2xsZXIuc2V0TW9kdWxlU3RhdGUoZ29vZy5Nb2R1bGVUeXBlLkVTNik7CiAgICB9KTsKICAgIGNyZWF0ZSh1bmRlZmluZWQsICdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInICsgYmVmb3JlS2V5ICsgJyIpJyk7CgogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBEb2VzIHRoaXMgcmVhbGx5IHNwZWVkIHVwIGFueXRoaW5nPwogICAgY3JlYXRlKHRoaXMucGF0aCwgdW5kZWZpbmVkKTsKCiAgICB2YXIgcmVnaXN0ZXJLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oZXhwb3J0cykgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhyZWdpc3RlcktleSk7CiAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgZGVwLnBhdGgsIGV4cG9ydHMsIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpOwogICAgfSk7CiAgICBjcmVhdGUoCiAgICAgICAgdW5kZWZpbmVkLAogICAgICAgICdpbXBvcnQgKiBhcyBtIGZyb20gIicgKyB0aGlzLnBhdGggKyAnIjsgZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArCiAgICAgICAgICAgIHJlZ2lzdGVyS2V5ICsgJyIsIG0pJyk7CgogICAgdmFyIGFmdGVyS2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhhZnRlcktleSk7CiAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgfSk7CiAgICBjcmVhdGUodW5kZWZpbmVkLCAnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGFmdGVyS2V5ICsgJyIpJyk7CiAgfTsKCgogIC8qKgogICAqIFN1cGVyY2xhc3Mgb2YgYW55IGRlcGVuZGVuY3kgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQgaW50byBtZW1vcnksCiAgICogdHJhbnNmb3JtZWQsIGFuZCB0aGVuIGV2YWwnZCAoZ29vZy5tb2R1bGVzIGFuZCB0cmFuc3BpbGVkIGZpbGVzKS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IgQGFic3RyYWN0CiAgICogQGV4dGVuZHMge2dvb2cuRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKSB7CiAgICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgLyoqIEBwcml2YXRlIHs/c3RyaW5nfSAqLwogICAgdGhpcy5jb250ZW50c18gPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBsYXppbHkgbWFrZSB0aGUgc3luY2hyb25vdXMgWEhSICh3aGVuIGdvb2cucmVxdWlyZSdkKSBvciBtYWtlCiAgICAgKiB0aGUgc3luY2hyb25vdXMgWEhSIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcuIE9uIEZpcmVGb3ggNjEgdGhlcmUgaXMgYSBidWcKICAgICAqIHdoZXJlIGFuIEVTNiBtb2R1bGUgY2Fubm90IG1ha2UgYSBzeW5jaHJvbm91cyBYSFIgKHJhdGhlciwgaXQgY2FuLCBidXQgaWYKICAgICAqIGl0IGRvZXMgdGhlbiBubyBvdGhlciBFUzYgbW9kdWxlcyB3aWxsIGxvYWQgYWZ0ZXIpLgogICAgICoKICAgICAqIHRsO2RyIHdlIGxhenkgbG9hZCBkdWUgdG8gYnVncyBvbiBvbGRlciBicm93c2VycyBhbmQgZWFnZXIgbG9hZCBkdWUgdG8KICAgICAqIGJ1Z3Mgb24gbmV3ZXIgb25lcy4KICAgICAqCiAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDc3MDkwCiAgICAgKgogICAgICogQHByaXZhdGUgQGNvbnN0IHtib29sZWFufQogICAgICovCiAgICB0aGlzLmxhenlGZXRjaF8gPSAhZ29vZy5pbkh0bWxEb2N1bWVudF8oKSB8fAogICAgICAgICEoJ25vTW9kdWxlJyBpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSk7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LCBnb29nLkRlcGVuZGVuY3kpOwoKCiAgLyoqIEBvdmVycmlkZSAqLwogIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgdmFyIGRlcCA9IHRoaXM7CgogICAgZnVuY3Rpb24gZmV0Y2goKSB7CiAgICAgIGRlcC5jb250ZW50c18gPSBnb29nLmxvYWRGaWxlU3luY18oZGVwLnBhdGgpOwoKICAgICAgaWYgKGRlcC5jb250ZW50c18pIHsKICAgICAgICBkZXAuY29udGVudHNfID0gZGVwLnRyYW5zZm9ybShkZXAuY29udGVudHNfKTsKICAgICAgICBpZiAoZGVwLmNvbnRlbnRzXykgewogICAgICAgICAgZGVwLmNvbnRlbnRzXyArPSAnXG4vLyMgc291cmNlVVJMPScgKyBkZXAucGF0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKSB7CiAgICAgIGZldGNoKCk7CiAgICAgIGlmICh0aGlzLmNvbnRlbnRzXyAmJgogICAgICAgICAgZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKCcnLCB0aGlzLmNvbnRlbnRzXykpIHsKICAgICAgICB0aGlzLmNvbnRlbnRzXyA9IG51bGw7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKCiAgICB2YXIgaXNFczYgPSB0aGlzLmxvYWRGbGFnc1snbW9kdWxlJ10gPT0gZ29vZy5Nb2R1bGVUeXBlLkVTNjsKCiAgICBpZiAoIXRoaXMubGF6eUZldGNoXykgewogICAgICBmZXRjaCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICAgIGlmIChkZXAubGF6eUZldGNoXykgewogICAgICAgIGZldGNoKCk7CiAgICAgIH0KCiAgICAgIGlmICghZGVwLmNvbnRlbnRzXykgewogICAgICAgIC8vIGxvYWRGaWxlU3luY18gb3IgdHJhbnNmb3JtIGFyZSByZXNwb25zaWJsZS4gQXNzdW1lIHRoZXkgbG9nZ2VkIGFuCiAgICAgICAgLy8gZXJyb3IuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaXNFczYpIHsKICAgICAgICBjb250cm9sbGVyLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpOwogICAgICB9CgogICAgICB2YXIgbmFtZXNwYWNlOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgY29udGVudHMgPSBkZXAuY29udGVudHNfOwogICAgICAgIGRlcC5jb250ZW50c18gPSBudWxsOwogICAgICAgIGdvb2cuZ2xvYmFsRXZhbChjb250ZW50cyk7CiAgICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgICBuYW1lc3BhY2UgPSBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lOwogICAgICAgIH0KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoaXNFczYpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgLy8gRHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB0aGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciByZXF1aXJlCiAgICAgICAgLy8gcmlnaHQgbm93LgogICAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ11bJ3JlcXVpcmUnXVsnZW5zdXJlJ10oCiAgICAgICAgICAgIFtkZXAuZ2V0UGF0aE5hbWUoKV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgICAgICAgICBkZXAucGF0aCwKICAgICAgICAgICAgICAgICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXVsncmVxdWlyZSddKGRlcC5nZXRQYXRoTmFtZSgpKSwKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKTsKICAgICAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICB9CgogICAgLy8gRG8gbm90IGZldGNoIG5vdzsgaW4gRmlyZUZveCA0NyB0aGUgc3luY2hyb25vdXMgWEhSIGRvZXNuJ3QgYmxvY2sgYWxsCiAgICAvLyBldmVudHMuIElmIHdlIGZldGNoZWQgbm93IGFuZCB0aGVuIGRvY3VtZW50LndyaXRlJ2QgdGhlIGNvbnRlbnRzIHRoZQogICAgLy8gZG9jdW1lbnQud3JpdGUgd291bGQgYmUgYW4gZXZhbCBhbmQgd291bGQgZXhlY3V0ZSB0b28gc29vbiEgSW5zdGVhZCB3cml0ZQogICAgLy8gYSBzY3JpcHQgdGFnIHRvIGZldGNoIGFuZCBldmFsIHN5bmNocm9ub3VzbHkgYXQgdGhlIGNvcnJlY3QgdGltZS4KICAgIGZ1bmN0aW9uIGZldGNoSW5Pd25TY3JpcHRUaGVuTG9hZCgpIHsKICAgICAgLyoqIEB0eXBlIHshSFRNTERvY3VtZW50fSAqLwogICAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CgogICAgICB2YXIga2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGtleSk7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKCiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPicgKwogICAgICAgICAgZ29vZy5wcm90ZWN0U2NyaXB0VGFnXygnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGtleSArICciKTsnKSArCiAgICAgICAgICAnPC8nICsKICAgICAgICAgICdzY3JpcHQ+JzsKICAgICAgZG9jLndyaXRlKAogICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoc2NyaXB0KSA6CiAgICAgICAgICAgICAgc2NyaXB0KTsKICAgIH0KCiAgICAvLyBJZiBvbmUgdGhpbmcgaXMgcGVuZGluZyBpdCBpcyB0aGlzLgogICAgdmFyIGFueXRoaW5nRWxzZVBlbmRpbmcgPSBjb250cm9sbGVyLnBlbmRpbmcoKS5sZW5ndGggPiAxOwoKICAgIC8vIElmIGFueXRoaW5nIGVsc2UgaXMgbG9hZGluZyB3ZSBuZWVkIHRvIGxhenkgbG9hZCBkdWUgdG8gYnVncyBpbiBvbGQgSUUuCiAgICAvLyBTcGVjaWZpY2FsbHkgc2NyaXB0IHRhZ3Mgd2l0aCBzcmMgYW5kIHNjcmlwdCB0YWdzIHdpdGggY29udGVudHMgY291bGQKICAgIC8vIGV4ZWN1dGUgb3V0IG9mIG9yZGVyIGlmIGRvY3VtZW50LndyaXRlIGlzIHVzZWQsIHNvIHdlIGNhbm5vdCB1c2UKICAgIC8vIGRvY3VtZW50LndyaXRlLiBEbyBub3QgcGF1c2UgaGVyZTsgaXQgYnJlYWtzIG9sZCBJRSBhcyB3ZWxsLgogICAgdmFyIHVzZU9sZEllV29ya0Fyb3VuZCA9CiAgICAgICAgYW55dGhpbmdFbHNlUGVuZGluZyAmJiBnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfOwoKICAgIC8vIEFkZGl0aW9uYWxseSBpZiB3ZSBhcmUgbWVhbnQgdG8gZGVmZXIgc2NyaXB0cyBidXQgdGhlIHBhZ2UgaXMgc3RpbGwKICAgIC8vIGxvYWRpbmcgKGUuZy4gYW4gRVM2IG1vZHVsZSBpcyBsb2FkaW5nKSB0aGVuIGFsc28gZGVmZXIuIE9yIGlmIHdlIGFyZQogICAgLy8gbWVhbnQgdG8gZGVmZXIgYW5kIGFueXRoaW5nIGVsc2UgaXMgcGVuZGluZyB0aGVuIGRlZmVyICh0aG9zZSBtYXkgYmUKICAgIC8vIHNjcmlwdHMgdGhhdCBkaWQgbm90IG5lZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFyZSBqdXN0IHNjcmlwdCB0YWdzIHdpdGgKICAgIC8vIGRlZmVyIHNldCB0byB0cnVlLCBhbmQgd2UgbmVlZCB0byBldmFsdWF0ZSBhZnRlciB0aGF0IGRlZmVycmVkIHNjcmlwdCkuCiAgICB2YXIgbmVlZHNBc3luY0xvYWRpbmcgPSBnb29nLkRlcGVuZGVuY3kuZGVmZXJfICYmCiAgICAgICAgKGFueXRoaW5nRWxzZVBlbmRpbmcgfHwgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSk7CgogICAgaWYgKHVzZU9sZEllV29ya0Fyb3VuZCB8fCBuZWVkc0FzeW5jTG9hZGluZykgewogICAgICAvLyBOb3RlIHRoYXQgd2Ugb25seSBkZWZlciB3aGVuIHdlIGhhdmUgdG8gcmF0aGVyIHRoYW4gMTAwJSBvZiB0aGUgdGltZS4KICAgICAgLy8gQWx3YXlzIGRlZmVyaW5nIHdvdWxkIHdvcmssIGJ1dCB0aGVuIGluIHRoZW9yeSB0aGUgb3JkZXIgb2YKICAgICAgLy8gZ29vZy5yZXF1aXJlIGNhbGxzIHdvdWxkIHRoZW4gbWF0dGVyLiBXZSB3YW50IHRvIGVuZm9yY2UgdGhhdCBtb3N0IG9mCiAgICAgIC8vIHRoZSB0aW1lIHRoZSBvcmRlciBvZiB0aGUgcmVxdWlyZSBjYWxscyBkb2VzIG5vdCBtYXR0ZXIuCiAgICAgIGNvbnRyb2xsZXIuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBFeHRlcm5zIGFyZSBtaXNzaW5nIG9ucmVhZHlzdGF0ZWNoYW5nZSBmb3IKICAgIC8vIEhUTUxEb2N1bWVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgaXNJbnRlcm5ldEV4cGxvcmVyID0KICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnb29nLmdsb2JhbDsKCiAgICAvLyBEb24ndCBkZWxheSBpbiBhbnkgdmVyc2lvbiBvZiBJRS4gVGhlcmUncyBidWcgYXJvdW5kIHRoaXMgdGhhdCB3aWxsCiAgICAvLyBjYXVzZSBvdXQgb2Ygb3JkZXIgc2NyaXB0IGV4ZWN1dGlvbi4gVGhpcyBtZWFucyB0aGF0IG9uIG9sZGVyIElFIEVTNgogICAgLy8gbW9kdWxlcyB3aWxsIGxvYWQgdG9vIGVhcmx5ICh3aGlsZSB0aGUgZG9jdW1lbnQgaXMgc3RpbGwgbG9hZGluZyArIHRoZQogICAgLy8gZG9tIGlzIG5vdCBhdmFpbGFibGUpLiBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGxvYWQgdG9vIGxhdGUgKHdoZW4gdGhlCiAgICAvLyBkb2N1bWVudCBpcyBjb21wbGV0ZSBhbmQgdGhlIG9ubG9hZCBldmVuIHdpbGwgbmV2ZXIgZmlyZSkuIFRoaXMgc2VlbXMKICAgIC8vIHRvIGJlIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzIGFzIHNjcmlwdHMgYWxyZWFkeSBhY3QgbGlrZSB0aGUgZm9ybWVyLgogICAgaWYgKGlzRXM2ICYmIGdvb2cuaW5IdG1sRG9jdW1lbnRfKCkgJiYgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSAmJgogICAgICAgICFpc0ludGVybmV0RXhwbG9yZXIpIHsKICAgICAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IHRydWU7CiAgICAgIC8vIFRyYW5zcGlsZWQgRVM2IG1vZHVsZXMgc3RpbGwgbmVlZCB0byBsb2FkIGxpa2UgcmVndWxhciBFUzYgbW9kdWxlcywKICAgICAgLy8gYWthIG9ubHkgYWZ0ZXIgdGhlIGRvY3VtZW50IGlzIGludGVyYWN0aXZlLgogICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIHZhciBvbGRDYWxsYmFjayA9IGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2U7CiAgICAgIGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgZG9jLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG9sZENhbGxiYWNrOwogICAgICAgICAgbG9hZCgpOwogICAgICAgICAgY29udHJvbGxlci5yZXN1bWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdvb2cuaXNGdW5jdGlvbihvbGRDYWxsYmFjaykpIHsKICAgICAgICAgIG9sZENhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvLyBBbHdheXMgZXZhbCBvbiBvbGQgSUUuCiAgICAgIGlmIChnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfIHx8ICFnb29nLmluSHRtbERvY3VtZW50XygpIHx8CiAgICAgICAgICAhZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSkgewogICAgICAgIGxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmZXRjaEluT3duU2NyaXB0VGhlbkxvYWQoKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudHMKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQGFic3RyYWN0CiAgICovCiAgZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbnRlbnRzKSB7fTsKCgogIC8qKgogICAqIEFueSBub24tZ29vZy5tb2R1bGUgZGVwZW5kZW5jeSB3aGljaCBuZWVkcyB0byBiZSB0cmFuc3BpbGVkIGJlZm9yZSBldmFsLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRyYW5zcGlsZXIpIHsKICAgIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCovCiAgICB0aGlzLnRyYW5zcGlsZXIgPSB0cmFuc3BpbGVyOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5LCBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oY29udGVudHMpIHsKICAgIC8vIFRyYW5zcGlsZSB3aXRoIHRoZSBwYXRobmFtZSBzbyB0aGF0IEVTNiBtb2R1bGVzIGFyZSBkb21haW4gYWdub3N0aWMuCiAgICByZXR1cm4gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShjb250ZW50cywgdGhpcy5nZXRQYXRoTmFtZSgpKTsKICB9OwoKCiAgLyoqCiAgICogQW4gRVM2IG1vZHVsZSBkZXBlbmRlbmN5IHRoYXQgd2FzIHRyYW5zcGlsZWQgdG8gYSBqc2NvbXAgbW9kdWxlIG91dHNpZGUKICAgKiBvZiB0aGUgZGVidWcgbG9hZGVyLCBlLmcuIHNlcnZlciBzaWRlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICB9OwogIGdvb2cuaW5oZXJpdHMoCiAgICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbigKICAgICAgY29udGVudHMpIHsKICAgIHJldHVybiBjb250ZW50czsKICB9OwoKCiAgLyoqCiAgICogQSBnb29nLm1vZHVsZSwgdHJhbnNwaWxlZCBvciBub3QuIFdpbGwgYWx3YXlzIHBlcmZvcm0gc29tZSBtaW5pbWFsCiAgICogdHJhbnNmb3JtYXRpb24gZXZlbiB3aGVuIG5vdCB0cmFuc3BpbGVkIHRvIHdyYXAgaW4gYSBnb29nLmxvYWRNb2R1bGUKICAgKiBzdGF0ZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIGdvb2cucHJvdmlkZWQgb3IgZ29vZy5tb2R1bGUgc3ltYm9scwogICAqICAgICBpbiB0aGlzIGZpbGUuCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMgZ29vZyBzeW1ib2xzIG9yIHJlbGF0aXZlIHBhdGhzIHRvIENsb3N1cmUKICAgKiAgICAgdGhpcyBkZXBlbmRzIG9uLgogICAqIEBwYXJhbSB7IU9iamVjdDxzdHJpbmcsIHN0cmluZz59IGxvYWRGbGFncwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZHNUcmFuc3BpbGUKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIG5lZWRzVHJhbnNwaWxlLAogICAgICB0cmFuc3BpbGVyKSB7CiAgICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LmJhc2UoCiAgICAgICAgdGhpcywgJ2NvbnN0cnVjdG9yJywgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0ICovCiAgICB0aGlzLm5lZWRzVHJhbnNwaWxlXyA9IG5lZWRzVHJhbnNwaWxlOwogICAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyXyA9IHRyYW5zcGlsZXI7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb250ZW50cykgewogICAgaWYgKHRoaXMubmVlZHNUcmFuc3BpbGVfKSB7CiAgICAgIGNvbnRlbnRzID0gdGhpcy50cmFuc3BpbGVyXy50cmFuc3BpbGUoY29udGVudHMsIHRoaXMuZ2V0UGF0aE5hbWUoKSk7CiAgICB9CgogICAgaWYgKCFnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgfHwgZ29vZy5nbG9iYWwuSlNPTiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKGZ1bmN0aW9uKGV4cG9ydHMpIHsnICsKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArIGNvbnRlbnRzICsKICAgICAgICAgICdcbicgKyAgLy8gdGVybWluYXRlIGFueSB0cmFpbGluZyBzaW5nbGUgbGluZSBjb21tZW50LgogICAgICAgICAgJztyZXR1cm4gZXhwb3J0cycgKwogICAgICAgICAgJ30pOycgKwogICAgICAgICAgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdGhpcy5wYXRoICsgJ1xuJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKCcgKwogICAgICAgICAgZ29vZy5nbG9iYWwuSlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICAgICAgY29udGVudHMgKyAnXG4vLyMgc291cmNlVVJMPScgKyB0aGlzLnBhdGggKyAnXG4nKSArCiAgICAgICAgICAnKTsnOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIGlzIElFOSBvciBlYXJsaWVyLCB3aGljaCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nCiAgICogZm9yIGRlZmVycmVkIG1vZHVsZXMuCiAgICogQGNvbnN0IEBwcml2YXRlIHtib29sZWFufQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gPSAhISgKICAgICAgIWdvb2cuZ2xvYmFsLmF0b2IgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnQgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnRbJ2FsbCddKTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPnx1bmRlZmluZWR9IHByb3ZpZGVzCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW58IU9iamVjdDxzdHJpbmc+PX0gb3B0X2xvYWRGbGFncwogICAqIEBzZWUgZ29vZy5hZGREZXBlbmRlbmN5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmFkZERlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcmVsUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBvcHRfbG9hZEZsYWdzKSB7CiAgICBwcm92aWRlcyA9IHByb3ZpZGVzIHx8IFtdOwogICAgcmVsUGF0aCA9IHJlbFBhdGgucmVwbGFjZSgvXFwvZywgJy8nKTsKICAgIHZhciBwYXRoID0gZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCk7CiAgICBpZiAoIW9wdF9sb2FkRmxhZ3MgfHwgdHlwZW9mIG9wdF9sb2FkRmxhZ3MgPT09ICdib29sZWFuJykgewogICAgICBvcHRfbG9hZEZsYWdzID0gb3B0X2xvYWRGbGFncyA/IHsnbW9kdWxlJzogZ29vZy5Nb2R1bGVUeXBlLkdPT0d9IDoge307CiAgICB9CiAgICB2YXIgZGVwID0gdGhpcy5mYWN0b3J5Xy5jcmVhdGVEZXBlbmRlbmN5KAogICAgICAgIHBhdGgsIHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncywKICAgICAgICBnb29nLnRyYW5zcGlsZXJfLm5lZWRzVHJhbnNwaWxlKAogICAgICAgICAgICBvcHRfbG9hZEZsYWdzWydsYW5nJ10gfHwgJ2VzMycsIG9wdF9sb2FkRmxhZ3NbJ21vZHVsZSddKSk7CiAgICB0aGlzLmRlcGVuZGVuY2llc19bcGF0aF0gPSBkZXA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuaWRUb1BhdGhfW3Byb3ZpZGVzW2ldXSA9IHBhdGg7CiAgICB9CiAgICB0aGlzLmlkVG9QYXRoX1tyZWxQYXRoXSA9IHBhdGg7CiAgfTsKCgogIC8qKgogICAqIENyZWF0ZXMgZ29vZy5EZXBlbmRlbmN5IGluc3RhbmNlcyBmb3IgdGhlIGRlYnVnIGxvYWRlciB0byBsb2FkLgogICAqCiAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaGF2ZSB0aGUgZGVidWcgbG9hZGVyIHVzZSBjdXN0b20gc3ViY2xhc3NlcyBvZgogICAqIGdvb2cuRGVwZW5kZW5jeS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuVHJhbnNwaWxlcn0gdHJhbnNwaWxlcgogICAqIEBzdHJ1Y3QgQGNvbnN0cnVjdG9yCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKHRyYW5zcGlsZXIpIHsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyID0gdHJhbnNwaWxlcjsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggcmVsYXRpdmUgdG8gY2xvc3VyZeKAmXMgYmFzZS5qcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBcnJheSBvZiBwcm92aWRlZCBnb29nLnByb3ZpZGUvbW9kdWxlIGlkcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBBcnJheSBvZiByZXF1aXJlZCBnb29nLnByb3ZpZGUvbW9kdWxlIC8KICAgKiAgICAgcmVsYXRpdmUgRVM2IG1vZHVsZSBwYXRocy4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZWRzVHJhbnNwaWxlIFRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZAogICAqICAgICBwZXIgdGhlIGdvb2cuVHJhbnNwaWxlci4KICAgKiBAcmV0dXJuIHshZ29vZy5EZXBlbmRlbmN5fQogICAqLwogIGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZURlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncywgbmVlZHNUcmFuc3BpbGUpIHsKCiAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuR09PRykgewogICAgICByZXR1cm4gbmV3IGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzLCBuZWVkc1RyYW5zcGlsZSwKICAgICAgICAgIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgaWYgKG5lZWRzVHJhbnNwaWxlKSB7CiAgICAgIHJldHVybiBuZXcgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeSgKICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuRVM2KSB7CiAgICAgICAgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicgJiYgZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBuZXcgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5KAogICAgICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IGdvb2cuRGVwZW5kZW5jeSgKICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogIGdvb2cuZGVidWdMb2FkZXJfID0gbmV3IGdvb2cuRGVidWdMb2FkZXJfKCk7CgoKICAvKioKICAgKiBMb2FkcyB0aGUgQ2xvc3VyZSBEZXBlbmRlbmN5IGZpbGUuCiAgICoKICAgKiBFeHBvc2VkIGEgcHVibGljIGZ1bmN0aW9uIHNvIENMT1NVUkVfTk9fREVQUyBjYW4gYmUgc2V0IHRvIGZhbHNlLCBiYXNlCiAgICogbG9hZGVkLCBzZXREZXBlbmRlbmN5RmFjdG9yeSBjYWxsZWQsIGFuZCB0aGVuIHRoaXMgY2FsbGVkLiBpLmUuIGFsbG93cwogICAqIGN1c3RvbSBsb2FkaW5nIG9mIHRoZSBkZXBzIGZpbGUuCiAgICovCiAgZ29vZy5sb2FkQ2xvc3VyZURlcHMgPSBmdW5jdGlvbigpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpOwogIH07CgoKICAvKioKICAgKiBTZXRzIHRoZSBkZXBlbmRlbmN5IGZhY3RvcnksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjdXN0b20KICAgKiBnb29nLkRlcGVuZGVuY3kgaW1wbGVtZW50YXRpb25zIHRvIGNvbnRyb2wgaG93IGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkLgogICAqCiAgICogTm90ZTogaWYgeW91IHdpc2ggdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBwcm92aWRlIHlvdXIgb3duIGltcGxlbW5ldGF0aW9uCiAgICogaXQgaXMgYSB3aXNlIGlkZWEgdG8gc2V0IENMT1NVUkVfTk9fREVQUyB0byB0cnVlLCBvdGhlcndpc2UgdGhlIGRlcGVuZGVuY3kKICAgKiBmaWxlIGFuZCBhbGwgb2YgaXRzIGdvb2cuYWRkRGVwZW5kZW5jeSBjYWxscyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmYWN0b3J5LgogICAqIFlvdSBjYW4gY2FsbCBnb29nLmxvYWRDbG9zdXJlRGVwcyB0byBsb2FkIHRoZSBDbG9zdXJlIGRlcGVuZGVuY3kgZmlsZQogICAqIGxhdGVyLCBhZnRlciB5b3VyIGZhY3RvcnkgaXMgaW5qZWN0ZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5zZXREZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLnNldERlcGVuZGVuY3lGYWN0b3J5KGZhY3RvcnkpOwogIH07CgoKICBpZiAoIWdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUykgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZENsb3N1cmVEZXBzKCk7CiAgfQoKCiAgLyoqCiAgICogQm9vdHN0cmFwcyB0aGUgZ2l2ZW4gbmFtZXNwYWNlcyBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIG9uY2UgdGhleSBhcmUKICAgKiBhdmFpbGFibGUgZWl0aGVyIHZpYSBnb29nLnJlcXVpcmUuIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgdXNpbmcKICAgKiBgZ29vZy5yZXF1aXJlYCB0byBib290c3RyYXAgQ2xvc3VyZSBKYXZhU2NyaXB0LiBQcmV2aW91c2x5IGEgYGdvb2cucmVxdWlyZWAKICAgKiBpbiBhbiBIVE1MIGZpbGUgd291bGQgZ3VhcmFudGVlIHRoYXQgdGhlIHJlcXVpcmUnZCBuYW1lc3BhY2Ugd2FzIGF2YWlsYWJsZQogICAqIGluIHRoZSBuZXh0IGltbWVkaWF0ZSBzY3JpcHQgdGFnLiBXaXRoIEVTNiBtb2R1bGVzIHRoaXMgbm8gbG9uZ2VyIGEKICAgKiBndWFyYW50ZWUuCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiA/fSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsIG9uY2UgYWxsIHRoZSBuYW1lc3BhY2VzCiAgICogICAgIGhhdmUgbG9hZGVkLiBBbHdheXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5LgogICAqLwogIGdvb2cuYm9vdHN0cmFwID0gZnVuY3Rpb24obmFtZXNwYWNlcywgY2FsbGJhY2spIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmJvb3RzdHJhcChuYW1lc3BhY2VzLCBjYWxsYmFjayk7CiAgfTsKfQoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IFRydXN0ZWQgVHlwZXMgcG9saWN5IG5hbWUuIElmIG5vbi1lbXB0eSB0aGVuIENsb3N1cmUgd2lsbAogKiB1c2UgVHJ1c3RlZCBUeXBlcy4KICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FJywgJycpOwoKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBzCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cuaWRlbnRpdHlfID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzOwp9OwoKCi8qKgogKiBDcmVhdGVzIFRydXN0ZWQgVHlwZXMgcG9saWN5IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4KICogVGhlIHBvbGljeSBqdXN0IGJsZXNzZXMgYW55IHN0cmluZyBhcyBhIFRydXN0ZWQgVHlwZS4gSXQgaXMgbm90IHZpc2liaWxpdHkKICogcmVzdHJpY3RlZCBiZWNhdXNlIGFueW9uZSBjYW4gYWxzbyBjYWxsIFRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgZGlyZWN0bHkuCiAqIEhvd2V2ZXIsIHRoZSBhbGxvd2VkIG5hbWVzIHNob3VsZCBiZSByZXN0cmljdGVkIGJ5IGEgSFRUUCBoZWFkZXIgYW5kIHRoZQogKiByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgcG9saWN5IHNob3VsZCBiZSB2aXNpYmlsaXR5IHJlc3RyaWN0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0KICovCmdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24obmFtZSkgewogIHZhciBwb2xpY3kgPSBudWxsOwogIC8vIFRPRE8oa290byk6IFJlbW92ZSB3aW5kb3cuVHJ1c3RlZFR5cGVzIHZhcmlhbnQgd2hlbiB0aGUgbmV3ZXIgQVBJIHNoaXBzLgogIHZhciBwb2xpY3lGYWN0b3J5ID0gZ29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzIHx8IGdvb2cuZ2xvYmFsLlRydXN0ZWRUeXBlczsKICBpZiAoIXBvbGljeUZhY3RvcnkgfHwgIXBvbGljeUZhY3RvcnkuY3JlYXRlUG9saWN5KSB7CiAgICByZXR1cm4gcG9saWN5OwogIH0KICAvLyBUcnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5IHRocm93cyBpZiBjYWxsZWQgd2l0aCBhIG5hbWUgdGhhdCBpcyBhbHJlYWR5CiAgLy8gcmVnaXN0ZXJlZCwgZXZlbiBpbiByZXBvcnQtb25seSBtb2RlLiBVbnRpbCB0aGUgQVBJIGNoYW5nZXMsIGNhdGNoIHRoZQogIC8vIGVycm9yIG5vdCB0byBicmVhayB0aGUgYXBwbGljYXRpb25zIGZ1bmN0aW9uYWxseS4gSW4gc3VjaCBjYXNlLCB0aGUgY29kZQogIC8vIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHJlZ3VsYXIgU2FmZSBUeXBlcy4KICAvLyBUT0RPKGtvdG8pOiBSZW1vdmUgY2F0Y2hpbmcgb25jZSBjcmVhdGVQb2xpY3kgQVBJIHN0b3BzIHRocm93aW5nLgogIHRyeSB7CiAgICBwb2xpY3kgPSBwb2xpY3lGYWN0b3J5LmNyZWF0ZVBvbGljeShuYW1lLCB7CiAgICAgIGNyZWF0ZUhUTUw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHQ6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHRVUkw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVVUkw6IGdvb2cuaWRlbnRpdHlfCiAgICB9KTsKICB9IGNhdGNoIChlKSB7CiAgICBnb29nLmxvZ1RvQ29uc29sZV8oZS5tZXNzYWdlKTsKICB9CiAgcmV0dXJuIHBvbGljeTsKfTsKCgovKiogQHByaXZhdGUgQGNvbnN0IHs/VHJ1c3RlZFR5cGVQb2xpY3l9ICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID0gZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FID8KICAgIGdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSArICcjYmFzZScpIDoKICAgIG51bGw7CgovLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUy1JUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgR2VuSnNEZXBzLCBwbGVhc2UgZG8gbm90IGVkaXQuCgovLyBEaXNhYmxlIENsYW5nIGZvcm1hdHRlciBmb3IgdGhpcyBmaWxlLgovLyBTZWUgaHR0cDovL2dvby5nbC9TZGl3WkgKLy8gY2xhbmctZm9ybWF0IG9mZgoKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xsZWN0aW9ucy9zZXRzLmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHMnXSwgWydnb29nLmxhYnMuY29sbGVjdGlvbnMuaXRlcmFibGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY29sbGVjdGlvbnMvc2V0c190ZXN0LmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHNUZXN0J10sIFsnZ29vZy5jb2xsZWN0aW9ucy5zZXRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWQuanMnLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3InLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxlZEVycm9yJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnLi4vLi4vdGhpcmRfcGFydHkvY2xvc3VyZS9nb29nL21vY2hpa2l0L2FzeW5jL2RlZmVycmVkX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuZGVmZXJyZWRBc3luY1Rlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRsaXN0LmpzJywgWydnb29nLmFzeW5jLkRlZmVycmVkTGlzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJy4uLy4uL3RoaXJkX3BhcnR5L2Nsb3N1cmUvZ29vZy9tb2NoaWtpdC9hc3luYy9kZWZlcnJlZGxpc3RfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZExpc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuYXN5bmMuRGVmZXJyZWRMaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90by9wcm90by5qcycsIFsnZ29vZy5wcm90byddLCBbJ2dvb2cucHJvdG8uU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8vc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90by5TZXJpYWxpemVyJ10sIFsnZ29vZy5qc29uLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvL3NlcmlhbGl6ZXJfdGVzdC5qcycsIFsnZ29vZy5wcm90b1Rlc3QnXSwgWydnb29nLnByb3RvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYW5ub3VuY2VyLmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2Fubm91bmNlcl90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQW5ub3VuY2VyJywgJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uaWZyYW1lJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hcmlhLmpzJywgWydnb29nLmExMXkuYXJpYSddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hMTF5LmFyaWEuZGF0YXRhYmxlcycsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYXJpYV90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hdHRyaWJ1dGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5BdXRvQ29tcGxldGVWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuQ2hlY2tlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Ecm9wRWZmZWN0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkV4cGFuZGVkVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkdyYWJiZWRWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuSW52YWxpZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuT3JpZW50YXRpb25WYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuUHJlc3NlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5SZWxldmFudFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5TZWxlY3RlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Tb3J0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2RhdGF0YWJsZXMuanMnLCBbJ2dvb2cuYTExeS5hcmlhLmRhdGF0YWJsZXMnXSwgWydnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL3JvbGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5Sb2xlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXJyYXkvYXJyYXkuanMnLCBbJ2dvb2cuYXJyYXknXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FycmF5L2FycmF5X3Rlc3QuanMnLCBbJ2dvb2cuYXJyYXlUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczcnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzLmpzJywgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJ10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRvbS5Ob2RlVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuYXNzZXJ0c1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9hbmltYXRpb25kZWxheS5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvYW5pbWF0aW9uZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9jb25kaXRpb25hbGRlbGF5LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3luYy5EZWxheSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvY29uZGl0aW9uYWxkZWxheV90ZXN0LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXlUZXN0J10sIFsnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlYm91bmNlci5qcycsIFsnZ29vZy5hc3luYy5EZWJvdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVib3VuY2VyX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRGVib3VuY2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWJvdW5jZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlbGF5LmpzJywgWydnb29nLkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5EZWxheVRlc3QnXSwgWydnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0LmpzJywgWydnb29nLmFzeW5jLkZyZWVMaXN0J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRnJlZUxpc3RUZXN0J10sIFsnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvbmV4dHRpY2suanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL25leHR0aWNrX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2tUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuLmpzJywgWydnb29nLmFzeW5jLnJ1biddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuX25leHRfdGlja190ZXN0LmpzJywgWydnb29nLmFzeW5jLnJ1bk5leHRUaWNrVGVzdCddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9ydW5fdGVzdC5qcycsIFsnZ29vZy5hc3luYy5ydW5UZXN0J10sIFsnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy90aHJvdHRsZS5qcycsIFsnZ29vZy5UaHJvdHRsZScsICdnb29nLmFzeW5jLlRocm90dGxlJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL3Rocm90dGxlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuVGhyb3R0bGVUZXN0J10sIFsnZ29vZy5hc3luYy5UaHJvdHRsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy93b3JrcXVldWUuanMnLCBbJ2dvb2cuYXN5bmMuV29ya0l0ZW0nLCAnZ29vZy5hc3luYy5Xb3JrUXVldWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvd29ya3F1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlVGVzdCddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlLmpzJywgWydnb29nJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYmFzZV9tb2R1bGVfdGVzdC5qcycsIFsnZ29vZy5iYXNlTW9kdWxlVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy50ZXN0X21vZHVsZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlX3Rlc3QuanMnLCBbJ2dvb2cuYmFzZVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdF9tb2R1bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9hbHBoYS5qcycsIFsnZ29vZy5jb2xvci5hbHBoYSddLCBbJ2dvb2cuY29sb3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NvbG9yL2FscGhhX3Rlc3QuanMnLCBbJ2dvb2cuY29sb3IuYWxwaGFUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNvbG9yLmFscGhhJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvci5qcycsIFsnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLkhzbCcsICdnb29nLmNvbG9yLkhzdicsICdnb29nLmNvbG9yLlJnYiddLCBbJ2dvb2cuY29sb3IubmFtZXMnLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvcl90ZXN0LmpzJywgWydnb29nLmNvbG9yVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLm5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9uYW1lcy5qcycsIFsnZ29vZy5jb2xvci5uYW1lcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Flcy5qcycsIFsnZ29vZy5jcnlwdC5BZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5CbG9ja0NpcGhlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYWVzX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuQWVzVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5BZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2FyYzQuanMnLCBbJ2dvb2cuY3J5cHQuQXJjNCddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYXJjNF90ZXN0LmpzJywgWydnb29nLmNyeXB0LkFyYzRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2U2NC5qcycsIFsnZ29vZy5jcnlwdC5iYXNlNjQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmFzZTY0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZTY0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5iYXNlNjQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuLmpzJywgWydnb29nLmNyeXB0LmJhc2VOJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZU5UZXN0J10sIFsnZ29vZy5jcnlwdC5iYXNlTicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlci5qcycsIFsnZ29vZy5jcnlwdC5CbG9iSGFzaGVyJywgJ2dvb2cuY3J5cHQuQmxvYkhhc2hlci5FdmVudFR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcycsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlcl90ZXN0LmpzJywgWydnb29nLmNyeXB0LkJsb2JIYXNoZXJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkJsb2JIYXNoZXInLCAnZ29vZy5jcnlwdC5NZDUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jsb2NrY2lwaGVyLmpzJywgWydnb29nLmNyeXB0LkJsb2NrQ2lwaGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYnl0ZXN0cmluZ19wZXJmLmpzJywgWydnb29nLmNyeXB0LmJ5dGVBcnJheVRvU3RyaW5nUGVyZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiYy5qcycsIFsnZ29vZy5jcnlwdC5DYmMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQmxvY2tDaXBoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiY190ZXN0LmpzJywgWydnb29nLmNyeXB0LkNiY1Rlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQWVzJywgJ2dvb2cuY3J5cHQuQ2JjJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdC5qcycsIFsnZ29vZy5jcnlwdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdF90ZXN0LmpzJywgWydnb29nLmNyeXB0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2N0ci5qcycsIFsnZ29vZy5jcnlwdC5DdHInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jdHJfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5DdHJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFlcycsICdnb29nLmNyeXB0LkN0cicsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaC5qcycsIFsnZ29vZy5jcnlwdC5IYXNoJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaDMyLmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMiddLCBbJ2dvb2cuY3J5cHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2gzMl90ZXN0LmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMlRlc3QnXSwgWydnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2h0ZXN0ZXIuanMnLCBbJ2dvb2cuY3J5cHQuaGFzaFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jcnlwdCcsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZScsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9obWFjLmpzJywgWydnb29nLmNyeXB0LkhtYWMnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2htYWNfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5IbWFjVGVzdCddLCBbJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnLCAnZ29vZy5jcnlwdC5oYXNoVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDUuanMnLCBbJ2dvb2cuY3J5cHQuTWQ1J10sIFsnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDVfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5NZDVUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0Lk1kNScsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMi5qcycsIFsnZ29vZy5jcnlwdC5wYmtkZjInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMl90ZXN0LmpzJywgWydnb29nLmNyeXB0LnBia2RmMlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQucGJrZGYyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGExLmpzJywgWydnb29nLmNyeXB0LlNoYTEnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTFfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGExVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMi5qcycsIFsnZ29vZy5jcnlwdC5TaGEyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjQuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMjI0J10sIFsnZ29vZy5jcnlwdC5TaGEyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjRfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyMjRUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LlNoYTIyNCcsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Ni5qcycsIFsnZ29vZy5jcnlwdC5TaGEyNTYnXSwgWydnb29nLmNyeXB0LlNoYTInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Nl90ZXN0LmpzJywgWydnb29nLmNyeXB0LlNoYTI1NlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMjU2JywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMl82NGJpdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyXzY0Yml0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJywgJ2dvb2cubWF0aC5Mb25nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyXzY0Yml0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdF90ZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMzg0JywgJ2dvb2cuY3J5cHQuU2hhNTEyJywgJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NicsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTM4NC5qcycsIFsnZ29vZy5jcnlwdC5TaGEzODQnXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMi5qcycsIFsnZ29vZy5jcnlwdC5TaGE1MTInXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMl8yNTYuanMnLCBbJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NiddLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb20uanMnLCBbJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb21fdGVzdC5qcycsIFsnZ29vZy5jc3NvbVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vaWZyYW1lL3N0eWxlLmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNzc29tJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Nzc29tL2lmcmFtZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZVRlc3QnXSwgWydnb29nLmNzc29tJywgJ2dvb2cuY3Nzb20uaWZyYW1lLnN0eWxlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFtYW5hZ2VyLmpzJywgWydnb29nLmRzLkRhdGFNYW5hZ2VyJ10sIFsnZ29vZy5kcy5CYXNpY05vZGVMaXN0JywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFzb3VyY2UuanMnLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuRGF0YU5vZGVMaXN0JywgJ2dvb2cuZHMuRW1wdHlOb2RlTGlzdCcsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuVXRpbCcsICdnb29nLmRzLmxvZ2dlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzRGF0YVNvdXJjZVRlc3QnXSwgWydnb29nLmRvbS54bWwnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkpzRGF0YVNvdXJjZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuWG1sRGF0YVNvdXJjZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS9leHByLmpzJywgWydnb29nLmRzLkV4cHInXSwgWydnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2V4cHJfdGVzdC5qcycsIFsnZ29vZy5kcy5FeHByVGVzdCddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuSnNEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZS5qcycsIFsnZ29vZy5kcy5BYnN0cmFjdEZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3RMaXN0Tm9kZScsICdnb29nLmRzLlByaW1pdGl2ZUZhc3REYXRhTm9kZSddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5EYXRhTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZV90ZXN0LmpzJywgWydnb29nLmRzLkZhc3REYXRhTm9kZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuRmFzdERhdGFOb2RlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Kc1Byb3BlcnR5RGF0YVNvdXJjZSddLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFNYW5hZ2VyJywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuZHMuTG9hZFN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzb25kYXRhc291cmNlLmpzJywgWydnb29nLmRzLkpzb25EYXRhU291cmNlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Mb2FkU3RhdGUnLCAnZ29vZy5kcy5sb2dnZXInLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLmxvZ2dlcicsICdnb29nLmV2ZW50cycsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzWG1sSHR0cERhdGFTb3VyY2VUZXN0J10sIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS94bWxkYXRhc291cmNlLmpzJywgWydnb29nLmRzLlhtbERhdGFTb3VyY2UnLCAnZ29vZy5kcy5YbWxIdHRwRGF0YVNvdXJjZSddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuTG9hZFN0YXRlJywgJ2dvb2cuZHMubG9nZ2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGUuanMnLCBbJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kYXRlX3Rlc3QuanMnLCBbJ2dvb2cuZGF0ZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZWxpa2UuanMnLCBbJ2dvb2cuZGF0ZS5EYXRlTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZXJhbmdlLmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UuSXRlcmF0b3InLCAnZ29vZy5kYXRlLkRhdGVSYW5nZS5TdGFuZGFyZERhdGVSYW5nZUtleXMnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuSW50ZXJ2YWwnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGVyYW5nZV90ZXN0LmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZHVyYXRpb24uanMnLCBbJ2dvb2cuZGF0ZS5kdXJhdGlvbiddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uTWVzc2FnZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kdXJhdGlvbl90ZXN0LmpzJywgWydnb29nLmRhdGUuZHVyYXRpb25UZXN0J10sIFsnZ29vZy5kYXRlLmR1cmF0aW9uJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlLmpzJywgWydnb29nLmRhdGUucmVsYXRpdmUnLCAnZ29vZy5kYXRlLnJlbGF0aXZlLlRpbWVEZWx0YUZvcm1hdHRlcicsICdnb29nLmRhdGUucmVsYXRpdmUuVW5pdCddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9yZWxhdGl2ZV90ZXN0LmpzJywgWydnb29nLmRhdGUucmVsYXRpdmVUZXN0J10sIFsnZ29vZy5kYXRlLnJlbGF0aXZlQ29tbW9uVGVzdHMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlY29tbW9udGVzdHMuanMnLCBbJ2dvb2cuZGF0ZS5yZWxhdGl2ZUNvbW1vblRlc3RzJ10sIFsnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5yZWxhdGl2ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3V0Y2RhdGV0aW1lLmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWUnXSwgWydnb29nLmRhdGUnLCAnZ29vZy5kYXRlLkRhdGUnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS91dGNkYXRldGltZV90ZXN0LmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWVUZXN0J10sIFsnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5VdGNEYXRlVGltZScsICdnb29nLmRhdGUubW9udGgnLCAnZ29vZy5kYXRlLndlZWtEYXknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RiL2N1cnNvci5qcycsIFsnZ29vZy5kYi5DdXJzb3InXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9kYi5qcycsIFsnZ29vZy5kYicsICdnb29nLmRiLkJsb2NrZWRDYWxsYmFjaycsICdnb29nLmRiLlVwZ3JhZGVOZWVkZWRDYWxsYmFjayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5UcmFuc2FjdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvZGJfdGVzdC5qcycsIFsnZ29vZy5kYlRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRiJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRiLlRyYW5zYWN0aW9uJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9lcnJvci5qcycsIFsnZ29vZy5kYi5Eb21FcnJvckxpa2UnLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkVycm9yLkVycm9yQ29kZScsICdnb29nLmRiLkVycm9yLkVycm9yTmFtZScsICdnb29nLmRiLkVycm9yLlZlcnNpb25DaGFuZ2VCbG9ja2VkRXJyb3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvaW5kZXguanMnLCBbJ2dvb2cuZGIuSW5kZXgnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9pbmRleGVkZGIuanMnLCBbJ2dvb2cuZGIuSW5kZXhlZERiJ10sIFsnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLk9iamVjdFN0b3JlJywgJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIva2V5cmFuZ2UuanMnLCBbJ2dvb2cuZGIuS2V5UmFuZ2UnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9vYmplY3RzdG9yZS5qcycsIFsnZ29vZy5kYi5PYmplY3RTdG9yZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kYi5DdXJzb3InLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkluZGV4JywgJ2dvb2cuZGIuS2V5UmFuZ2UnLCAnZ29vZy5kZWJ1ZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvdHJhbnNhY3Rpb24uanMnLCBbJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5kYi5UcmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1vZGUnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5PYmplY3RTdG9yZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuQ29uc29sZSddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGVfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Db25zb2xlVGVzdCddLCBbJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RlYnVnLmpzJywgWydnb29nLmRlYnVnJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWdfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Z1Rlc3QnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuZXJyb3Jjb250ZXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZWJ1Z3dpbmRvdy5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWd3aW5kb3dfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvd1Rlc3QnXSwgWydnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzLmpzJywgWydnb29nLmRlYnVnLkRldkNzcycsICdnb29nLmRlYnVnLkRldkNzcy5Vc2VyQWdlbnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jc3NvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRGV2Q3NzVGVzdCddLCBbJ2dvb2cuZGVidWcuRGV2Q3NzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RldmNzcy9kZXZjc3NydW5uZXIuanMnLCBbJ2dvb2cuZGVidWcuZGV2Q3NzUnVubmVyJ10sIFsnZ29vZy5kZWJ1Zy5EZXZDc3MnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RpdmNvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuRGl2Q29uc29sZSddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VuaGFuY2VlcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnRW5oYW5jZUVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VudHJ5cG9pbnRyZWdpc3RyeS5qcycsIFsnZ29vZy5kZWJ1Zy5FbnRyeVBvaW50TW9uaXRvcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZW50cnlwb2ludHJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5VGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvci5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3Jjb250ZXh0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Vycm9yY29udGV4dF90ZXN0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dFRlc3QnXSwgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLlRyYWNlJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyQXN5bmNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJ3ZWFrZGVwLmpzJywgWydnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcnJlcG9ydGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmxvZycsICdnb29nLm5ldC5YaHJJbycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVyaS51dGlscycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JyZXBvcnRlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5lcnJvcmNvbnRleHQnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZmFuY3l3aW5kb3cuanMnLCBbJ2dvb2cuZGVidWcuRmFuY3lXaW5kb3cnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Zvcm1hdHRlci5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXInLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuVGV4dEZvcm1hdHRlciddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9mb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheS5qcycsIFsnZ29vZy5kZWJ1Zy5GcHNEaXNwbGF5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheV90ZXN0LmpzJywgWydnb29nLmRlYnVnLkZwc0Rpc3BsYXlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRlYnVnLkZwc0Rpc3BsYXknLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXIuanMnLCBbJ2dvb2cuZGVidWcuTG9nQnVmZmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2xvZ2dlci5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2FibGUnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nQnVmZmVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dnZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dnZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmQuanMnLCBbJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvbG9ncmVjb3Jkc2VyaWFsaXplci5qcycsIFsnZ29vZy5kZWJ1Zy5sb2dSZWNvcmRTZXJpYWxpemVyJ10sIFsnZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmRzZXJpYWxpemVyX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcubG9nUmVjb3JkU2VyaWFsaXplclRlc3QnXSwgWydnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLmxvZ1JlY29yZFNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3JlbGF0aXZldGltZXByb3ZpZGVyLmpzJywgWydnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvdHJhY2VyLmpzJywgWydnb29nLmRlYnVnLlN0b3BUcmFjZURldGFpbCcsICdnb29nLmRlYnVnLlRyYWNlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5pdGVyJywgJ2dvb2cubG9nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3RyYWNlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLlRyYWNlVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5UcmFjZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlZmluZWNsYXNzX3Rlc3QuanMnLCBbJ2dvb2cuZGVmaW5lQ2xhc3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlbGVnYXRlL2RlbGVnYXRlcmVnaXN0cnkuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVsZWdhdGUvZGVsZWdhdGVzLmpzJywgWydnb29nLmRlbGVnYXRlLmRlbGVnYXRlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXNfdGVzdC5qcycsIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXNUZXN0J10sIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGUuanMnLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kaXNwb3NlQWxsJ10sIFsnZ29vZy5kaXNwb3NhYmxlLklEaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGVfdGVzdC5qcycsIFsnZ29vZy5EaXNwb3NhYmxlVGVzdCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Rpc3Bvc2FibGUvaWRpc3Bvc2FibGUuanMnLCBbJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdG11bHRpcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLkFic3RyYWN0TXVsdGlSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uUmFuZ2VUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYWJzdHJhY3RyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2FuaW1hdGlvbmZyYW1lL2FuaW1hdGlvbmZyYW1lLmpzJywgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLmRvbS5hbmltYXRpb25GcmFtZS5TcGVjJywgJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLlN0YXRlJ10sIFsnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUucG9seWZpbGwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbmltYXRpb25mcmFtZS9hbmltYXRpb25mcmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5BbmltYXRpb25GcmFtZVRlc3QnXSwgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYW5pbWF0aW9uZnJhbWUvcG9seWZpbGwuanMnLCBbJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLnBvbHlmaWxsJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZS5qcycsIFsnZ29vZy5kb20uYW5ub3RhdGUnLCAnZ29vZy5kb20uYW5ub3RhdGUuQW5ub3RhdGVGbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZV90ZXN0LmpzJywgWydnb29nLmRvbS5hbm5vdGF0ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmFubm90YXRlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Fzc2VydHMuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHMnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHNUZXN0J10sIFsnZ29vZy5kb20uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2F0dHIuanMnLCBbJ2dvb2cuZG9tLkF0dHInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VyZmVhdHVyZV90ZXN0LmpzJywgWydnb29nLmRvbS5Ccm93c2VyRmVhdHVyZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcnJhbmdlL2Jyb3dzZXJyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5FcnJvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5HZWNrb1JhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5JZVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5PcGVyYVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuV2ViS2l0UmFuZ2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvYnJvd3NlcnJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvZ2Vja29yYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkdlY2tvUmFuZ2UnXSwgWydnb29nLmRvbS5icm93c2VycmFuZ2UuVzNjUmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvaWVyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkllUmFuZ2UnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9vcGVyYXJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuT3BlcmFSYW5nZSddLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS93M2NyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2Uvd2Via2l0cmFuZ2UuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XZWJLaXRSYW5nZSddLCBbJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnVmZmVyZWR2aWV3cG9ydHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5CdWZmZXJlZFZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9idWZmZXJlZHZpZXdwb3J0c2l6ZW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uQnVmZmVyZWRWaWV3cG9ydFNpemVNb25pdG9yVGVzdCddLCBbJ2dvb2cuZG9tLkJ1ZmZlcmVkVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmRvbS5WaWV3cG9ydFNpemVNb25pdG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NsYXNzZXMuanMnLCBbJ2dvb2cuZG9tLmNsYXNzZXMnXSwgWydnb29nLmFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vY2xhc3Nlc190ZXN0LmpzJywgWydnb29nLmRvbS5jbGFzc2VzX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3QuanMnLCBbJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3RfdGVzdC5qcycsIFsnZ29vZy5kb20uY2xhc3NsaXN0X3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZS5qcycsIFsnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLkNvbnRyb2xSYW5nZUl0ZXJhdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdE11bHRpUmFuZ2UnLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5SYW5nZUl0ZXJhdG9yJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5Db250cm9sUmFuZ2VUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldC5qcycsIFsnZ29vZy5kb20uZGF0YXNldCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldF90ZXN0LmpzJywgWydnb29nLmRvbS5kYXRhc2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmRhdGFzZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9kb20uanMnLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFwcGVuZGFibGUnLCAnZ29vZy5kb20uRG9tSGVscGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV9jb21waWxlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkRvbUNvbXBpbGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV90ZXN0LmpzJywgWydnb29nLmRvbS5kb21fdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uRm9udFNpemVNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkZvbnRTaXplTW9uaXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXMuanMnLCBbJ2dvb2cuZG9tLmZvcm1zJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cud2luZG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXNfdGVzdC5qcycsIFsnZ29vZy5kb20uZm9ybXNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uZm9ybXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuLmpzJywgWydnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cuZG9tLmZ1bGxzY3JlZW4uRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmZ1bGxzY3JlZW5fdGVzdCddLCBbJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaHRtbGVsZW1lbnQuanMnLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lmcmFtZS5qcycsIFsnZ29vZy5kb20uaWZyYW1lJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9pZnJhbWVfdGVzdC5qcycsIFsnZ29vZy5kb20uaWZyYW1lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZS5qcycsIFsnZ29vZy5kb20uSW5wdXRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZV90ZXN0LmpzJywgWydnb29nLmRvbS5JbnB1dFR5cGVUZXN0J10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaXRlci5qcycsIFsnZ29vZy5kb20uaXRlci5BbmNlc3Rvckl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuQ2hpbGRJdGVyYXRvcicsICdnb29nLmRvbS5pdGVyLlNpYmxpbmdJdGVyYXRvciddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2l0ZXJfdGVzdC5qcycsIFsnZ29vZy5kb20uaXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5pdGVyLkFuY2VzdG9ySXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5DaGlsZEl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuU2libGluZ0l0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9tdWx0aXJhbmdlLmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RNdWx0aVJhbmdlJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbXVsdGlyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3InXSwgWydnb29nLmRvbS5UYWdJdGVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL25vZGVpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZUl0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0LmpzJywgWydnb29nLmRvbS5Ob2RlT2Zmc2V0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0X3Rlc3QuanMnLCBbJ2dvb2cuZG9tLk5vZGVPZmZzZXRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZXR5cGUuanMnLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vYWJzdHJhY3RwYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLkFic3RyYWN0UGF0dGVybiddLCBbJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9hbGxjaGlsZHJlbi5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5BbGxDaGlsZHJlbiddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9jYWxsYmFjay9jYWxsYmFjay5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svY291bnRlci5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5Db3VudGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svdGVzdC5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0J10sIFsnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2NoaWxkbWF0Y2hlcy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnXSwgWydnb29nLmRvbS5wYXR0ZXJuLkFsbENoaWxkcmVuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9lbmR0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRW5kVGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2Z1bGx0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRnVsbFRhZyddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uU3RhcnRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL21hdGNoZXIuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hlciddLCBbJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLm1hdGNoZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5wYXR0ZXJuLkVuZFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLkZ1bGxUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaGVyJywgJ2dvb2cuZG9tLnBhdHRlcm4uUmVwZWF0JywgJ2dvb2cuZG9tLnBhdHRlcm4uU2VxdWVuY2UnLCAnZ29vZy5kb20ucGF0dGVybi5TdGFydFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLmNhbGxiYWNrLkNvdW50ZXInLCAnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0JywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9ub2RldHlwZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5Ob2RlVHlwZSddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9wYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcGF0dGVybl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWxsQ2hpbGRyZW4nLCAnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnLCAnZ29vZy5kb20ucGF0dGVybi5FbmRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5GdWxsVGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTm9kZVR5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5SZXBlYXQnLCAnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZScsICdnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uVGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcmVwZWF0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlJlcGVhdCddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9zZXF1ZW5jZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZSddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5BYnN0cmFjdFBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3N0YXJ0dGFnLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3RhZy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi90ZXh0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlRleHQnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLlJhbmdlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uTXVsdGlSYW5nZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5SYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZWVuZHBvaW50LmpzJywgWydnb29nLmRvbS5SYW5nZUVuZHBvaW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhZmUuanMnLCBbJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbiddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2FmZV90ZXN0LmpzJywgWydnb29nLmRvbS5zYWZlVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkY2FyZXRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9zYXZlZGNhcmV0cmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2F2ZWRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NlbGVjdGlvbi5qcycsIFsnZ29vZy5kb20uc2VsZWN0aW9uJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2VsZWN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnNlbGVjdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvci5qcycsIFsnZ29vZy5kb20uVGFnSXRlcmF0b3InLCAnZ29vZy5kb20uVGFnV2Fsa1R5cGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdJdGVyYXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZS5qcycsIFsnZ29vZy5kb20uVGFnTmFtZSddLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdOYW1lVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzLmpzJywgWydnb29nLmRvbS50YWdzJ10sIFsnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnRhZ3NUZXN0J10sIFsnZ29vZy5kb20udGFncycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnQuanMnLCBbJ2dvb2cuZG9tLnRleHRBc3NlcnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnRfdGVzdC5qcycsIFsnZ29vZy5kb20udGV4dGFzc2VydF90ZXN0J10sIFsnZ29vZy5kb20udGV4dEFzc2VydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZS5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlRleHRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGV4dFJhbmdlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlaXRlcmF0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdXJpLmpzJywgWydnb29nLmRvbS51cmknXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3VyaV90ZXN0LmpzJywgWydnb29nLmRvbS51cmlUZXN0J10sIFsnZ29vZy5kb20udXJpJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92ZW5kb3IuanMnLCBbJ2dvb2cuZG9tLnZlbmRvciddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdmVuZG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnZlbmRvclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3ZpZXdwb3J0c2l6ZW1vbml0b3IuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92aWV3cG9ydHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20uVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3htbC5qcycsIFsnZ29vZy5kb20ueG1sJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS94bWxfdGVzdC5qcycsIFsnZ29vZy5kb20ueG1sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20ueG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy5lZGl0b3IuZGVmaW5lcycsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2Jyb3dzZXJmZWF0dXJlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXIuanMnLCBbJ2dvb2cuZWRpdG9yLkNsaWNrVG9FZGl0V3JhcHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyJywgJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvY29tbWFuZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29tbWFuZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29udGVudEVkaXRhYmxlRmllbGQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZCcsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9kZWZpbmVzLmpzJywgWydnb29nLmVkaXRvci5kZWZpbmVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ZpZWxkLmpzJywgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5GaWVsZC5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvZmllbGRfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuZmllbGRfdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1cy5qcycsIFsnZ29vZy5lZGl0b3IuZm9jdXMnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1c190ZXN0LmpzJywgWydnb29nLmVkaXRvci5mb2N1c1Rlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9pY29udGVudC5qcycsIFsnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ljb250ZW50X3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLmljb250ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvbGluay5qcycsIFsnZ29vZy5lZGl0b3IuTGluayddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2xpbmtfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuTGlua1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlLmpzJywgWydnb29nLmVkaXRvci5ub2RlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pdGVyLkNoaWxkSXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5TaWJsaW5nSXRlcmF0b3InLCAnZ29vZy5pdGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLm5vZGVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5QbHVnaW4nXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW5JbXBsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luX2ltcGwuanMnLCBbJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuUGx1Z2luVGVzdCddLCBbJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW4uanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdEJ1YmJsZVBsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdGRpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0RGlhbG9nUGx1Z2luLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmV2ZW50cycsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9iYXNpY3RleHRmb3JtYXR0ZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyLkNPTU1BTkQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Jhc2ljdGV4dGZvcm1hdHRlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CYXNpY1RleHRGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJsb2NrcXVvdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Vtb3RpY29ucy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnMnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbW90aWNvbnNfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnNUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW1vdGljb25zJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2VudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlT2Zmc2V0JywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmcuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5pMThuLmJpZGknLCAnZ29vZy5pMThuLnVDaGFyJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmdfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5GaXJzdFN0cm9uZ1Rlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvaGVhZGVyZm9ybWF0dGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlciddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9oZWFkZXJmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5IZWFkZXJGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlcicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGUuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUuQWN0aW9uJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0QnViYmxlUGx1Z2luJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rQnViYmxlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua2RpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nUGx1Z2luJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3REaWFsb2dQbHVnaW4nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtEaWFsb2dQbHVnaW4nLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua3Nob3J0Y3V0cGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtTaG9ydGN1dFBsdWdpbiddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9saW5rc2hvcnRjdXRwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW5UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW4nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpc3R0YWJoYW5kbGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpc3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlzdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaXN0VGFiSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlzdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbG9yZW1pcHN1bS5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9sb3JlbWlwc3VtX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5SZW1vdmVGb3JtYXR0aW5nJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZ190ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0VGFiSGFuZGxlcicsICdnb29nLmVkaXRvci5yYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlNwYWNlc1RhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3RhYmxlZWRpdG9yLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5UYWJsZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWJsZWVkaXRvcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWJsZUVkaXRvcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWdvbmVudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdGFnb25lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLlRhZ09uRW50ZXJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9NYW5hZ2VyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9TdGF0ZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5icm93c2VycmFuZ2UnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG8nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvbWFuYWdlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb21hbmFnZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb3N0YXRlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdW5kb3JlZG9zdGF0ZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGVUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcmFuZ2UuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnJhbmdlLlBvaW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3JhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5lZGl0b3IucmFuZ2UuUG9pbnQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3NlYW1sZXNzZmllbGQuanMnLCBbJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnXSwgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnN0eWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc2VhbWxlc3NmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5zZWFtbGVzc2ZpZWxkX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5TZWFtbGVzc0ZpZWxkJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tSYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3N0eWxlLmpzJywgWydnb29nLmVkaXRvci5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc3R5bGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3Iuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvdGFibGUuanMnLCBbJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cuZWRpdG9yLlRhYmxlQ2VsbCcsICdnb29nLmVkaXRvci5UYWJsZVJvdyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci90YWJsZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5UYWJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2FjdGlvbmhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkFjdGlvbkV2ZW50JywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQWN0aW9uSGFuZGxlci5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuQmVmb3JlQWN0aW9uRXZlbnQnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5BY3Rpb25IYW5kbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJldmVudC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9icm93c2VyZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJmZWF0dXJlLmpzJywgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnQuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50TGlrZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cy5FdmVudElkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlclRlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRpZC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHMuanMnLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkNhcHR1cmVTaW11bGF0aW9uTW9kZScsICdnb29nLmV2ZW50cy5LZXknLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuTGlzdGVuZXJNYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHNUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5DYXB0dXJlU2ltdWxhdGlvbk1vZGUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0X3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHRhcmdldF92aWFfZ29vZ2V2ZW50c190ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldEdvb2dFdmVudHNUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0YXJnZXRfdmlhX3czY2ludGVyZmFjZV90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldFczQ1Rlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0dGVzdGVyLmpzJywgWydnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLk1vdXNlRXZlbnRzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc1RvdWNoRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyVG91Y2hGYWxsYmFja0V2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZVRlc3QnXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuUG9pbnRlckZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJUb3VjaEZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFdyYXBwZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZmlsZWRyb3BoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5GaWxlRHJvcEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9maWxlZHJvcGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZm9jdXNoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Gb2N1c0hhbmRsZXInLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2ltZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW1lSGFuZGxlci5FdmVudCcsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9pbWVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlci5FdmVudFR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2tleWNvZGVzLmpzJywgWydnb29nLmV2ZW50cy5LZXlDb2RlcyddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5Y29kZXNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuS2V5Q29kZXNUZXN0J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXloYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLktleUV2ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXluYW1lcy5qcycsIFsnZ29vZy5ldmVudHMuS2V5TmFtZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5cy5qcycsIFsnZ29vZy5ldmVudHMuS2V5cyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuYWJsZS5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlS2V5J10sIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmFibGVfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVRlc3QnXSwgWydnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJ10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZUtleSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmVybWFwLmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuTGlzdGVuZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9saXN0ZW5lcm1hcF90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL21vdXNld2hlZWxoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Nb3VzZVdoZWVsRXZlbnQnLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXInLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubWF0aCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbW91c2V3aGVlbGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5Nb3VzZVdoZWVsSGFuZGxlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuT25saW5lSGFuZGxlcicsICdnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL29ubGluZWxpc3RlbmVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9wYXN0ZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLmV2ZW50cy5QYXN0ZUhhbmRsZXIuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlci5TdGF0ZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubG9nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvcGFzdGVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxldmVudC5qcycsIFsnZ29vZy5ldmVudHMuV2hlZWxFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy93aGVlbGhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLldoZWVsRXZlbnQnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5XaGVlbEhhbmRsZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2VtYWlsYWRkcmVzcy5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9lbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0LmpzJywgWydnb29nLmZvcm1hdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mb3JtYXQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlci5qcycsIFsnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXInLCAnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXIuQnVmZmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlcl90ZXN0LmpzJywgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlclRlc3QnXSwgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3MuanMnLCBbJ2dvb2cuZm9ybWF0LkludGVybmF0aW9uYWxpemVkRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuSW50ZXJuYXRpb25hbGl6ZWRFbWFpbEFkZHJlc3NUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmZvcm1hdC5JbnRlcm5hdGlvbmFsaXplZEVtYWlsQWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyLmpzJywgWydnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlcicsICdnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlci5TYWZlSHRtbERlbGltaXRlcnMnLCAnZ29vZy5mb3JtYXQuSnNvblByZXR0eVByaW50ZXIuVGV4dERlbGltaXRlcnMnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLmZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyX3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyVGVzdCddLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeS5qcycsIFsnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5LkJlaGF2aW9yJywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5GaWxlRW50cnknXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeWltcGwuanMnLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZUVudHJ5SW1wbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVFbnRyeScsICdnb29nLmZzLkZpbGVXcml0ZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2Vycm9yLmpzJywgWydnb29nLmZzLkRPTUVycm9yTGlrZScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRXJyb3IuRXJyb3JDb2RlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2ZpbGVyZWFkZXIuanMnLCBbJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVSZWFkZXIuRXZlbnRUeXBlJywgJ2dvb2cuZnMuRmlsZVJlYWRlci5SZWFkeVN0YXRlJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXNhdmVyLmpzJywgWydnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLmZzLkZpbGVTYXZlci5FdmVudFR5cGUnLCAnZ29vZy5mcy5GaWxlU2F2ZXIuUmVhZHlTdGF0ZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtLmpzJywgWydnb29nLmZzLkZpbGVTeXN0ZW0nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtaW1wbC5qcycsIFsnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCddLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZVN5c3RlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXdyaXRlci5qcycsIFsnZ29vZy5mcy5GaWxlV3JpdGVyJ10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnMuanMnLCBbJ2dvb2cuZnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCcsICdnb29nLmZzLnVybCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnNfdGVzdC5qcycsIFsnZ29vZy5mc1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvcHJvZ3Jlc3NldmVudC5qcycsIFsnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL3VybC5qcycsIFsnZ29vZy5mcy51cmwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvdXJsX3Rlc3QuanMnLCBbJ2dvb2cudXJsVGVzdCddLCBbJ2dvb2cuZnMudXJsJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zLmpzJywgWydnb29nLmZ1bmN0aW9ucyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zX3Rlc3QuanMnLCBbJ2dvb2cuZnVuY3Rpb25zVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ0Ryb3BFdmVudCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3BfdGVzdC5qcycsIFsnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wJywgJ2dvb2cuZnguRHJhZ0Ryb3BJdGVtJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW0vYW5pbS5qcycsIFsnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCBbJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbS9hbmltX3Rlc3QuanMnLCBbJ2dvb2cuZnguYW5pbVRlc3QnXSwgWydnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5hbmltJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9hbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguQW5pbWF0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LkFuaW1hdGlvbi5TdGF0ZScsICdnb29nLmZ4LkFuaW1hdGlvbkV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbWF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlLmpzJywgWydnb29nLmZ4LkFuaW1hdGlvblBhcmFsbGVsUXVldWUnLCAnZ29vZy5meC5BbmltYXRpb25RdWV1ZScsICdnb29nLmZ4LkFuaW1hdGlvblNlcmlhbFF1ZXVlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uUXVldWVUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb25QYXJhbGxlbFF1ZXVlJywgJ2dvb2cuZnguQW5pbWF0aW9uU2VyaWFsUXVldWUnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguYW5pbScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3MzL2Z4LmpzJywgWydnb29nLmZ4LmNzczMnXSwgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvY3NzMy90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2NzczMvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvblRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5jc3MzLlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZS50cmFuc2l0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3NzcHJpdGVhbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQ3NzU3ByaXRlQW5pbWF0aW9uJ10sIFsnZ29vZy5meC5BbmltYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Nzc3Nwcml0ZWFuaW1hdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvblRlc3QnXSwgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvbicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RvbS5qcycsIFsnZ29vZy5meC5kb20nLCAnZ29vZy5meC5kb20uQmdDb2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5Db2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5GYWRlJywgJ2dvb2cuZnguZG9tLkZhZGVJbicsICdnb29nLmZ4LmRvbS5GYWRlSW5BbmRTaG93JywgJ2dvb2cuZnguZG9tLkZhZGVPdXQnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5meC5kb20uUHJlZGVmaW5lZEVmZmVjdCcsICdnb29nLmZ4LmRvbS5SZXNpemUnLCAnZ29vZy5meC5kb20uUmVzaXplSGVpZ2h0JywgJ2dvb2cuZnguZG9tLlJlc2l6ZVdpZHRoJywgJ2dvb2cuZnguZG9tLlNjcm9sbCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLmZ4LmRvbS5TbGlkZUZyb20nLCAnZ29vZy5meC5kb20uU3dpcGUnXSwgWydnb29nLmNvbG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3AnXSwgWydnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AnLCAnZ29vZy5meC5EcmFnRHJvcEl0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdkcm9wZ3JvdXAuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3BHcm91cCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3Bncm91cF90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdEcm9wR3JvdXBUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5EcmFnRHJvcEdyb3VwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnZ2VyLmpzJywgWydnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2dlcl90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdnZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2xpc3Rncm91cC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdERpcmVjdGlvbicsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXAnLCAnZ29vZy5meC5EcmFnTGlzdEdyb3VwLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXBFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdsaXN0Z3JvdXBfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdEdyb3VwVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0RGlyZWN0aW9uJywgJ2dvb2cuZnguRHJhZ0xpc3RHcm91cCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbicsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnc2Nyb2xsc3VwcG9ydC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ3Njcm9sbHN1cHBvcnRfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydFRlc3QnXSwgWydnb29nLmZ4LkRyYWdTY3JvbGxTdXBwb3J0JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZWFzaW5nLmpzJywgWydnb29nLmZ4LmVhc2luZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Vhc2luZ190ZXN0LmpzJywgWydnb29nLmZ4LmVhc2luZ1Rlc3QnXSwgWydnb29nLmZ4LmVhc2luZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnguanMnLCBbJ2dvb2cuZngnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb24uRXZlbnRUeXBlJywgJ2dvb2cuZnguQW5pbWF0aW9uLlN0YXRlJywgJ2dvb2cuZnguQW5pbWF0aW9uRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LmVhc2luZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnhfdGVzdC5qcycsIFsnZ29vZy5meFRlc3QnXSwgWydnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L3RyYW5zaXRpb25iYXNlLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb25CYXNlJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UuU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ4LlRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dvb2cuanMnLCBbXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9hYnN0cmFjdGdyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLkVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkZpbGwnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdHJva2UnLCAnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2FmZmluZXRyYW5zZm9ybS5qcycsIFsnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQWZmaW5lVHJhbnNmb3JtVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5QYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkNhbnZhc0dyYXBoaWNzJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ncmFwaGljcy5BYnN0cmFjdEdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGVtZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9lbGxpcHNlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9jb29yZGluYXRlcy5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2Nvb3JkaW5hdGVzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LmNvb3JkaW5hdGVzVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50X3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnRUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dCcsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2VsbGlwc2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsbGlwc2UnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2V4dC5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5FbGxpcHNlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LlJlY3RhbmdsZScsICdnb29nLmdyYXBoaWNzLmV4dC5TaGFwZScsICdnb29nLmdyYXBoaWNzLmV4dC5jb29yZGluYXRlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5HcmFwaGljcyddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvZ3JvdXAuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvaW1hZ2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3BhdGguanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGgnXSwgWydnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5tYXRoLlJlY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9wYXRoX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGhUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dC5QYXRoJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3JlY3RhbmdsZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuUmVjdGFuZ2xlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9zaGFwZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuU2hhcGUnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3N0cm9rZWFuZGZpbGxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZpbGwuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZvbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRm9udCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlN2Z0dyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyb3VwZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5Hcm91cEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ltYWdlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5JbWFnZUVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2xpbmVhcmdyYWRpZW50LmpzJywgWydnb29nLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuUGF0aC5TZWdtZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9wYXRocy5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRocyddLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aHNfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRoc1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MucGF0aHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3JlY3RlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50J10sIFsnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsLmpzJywgWydnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCddLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdHJva2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc3Ryb2tlYW5kZmlsbGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5SZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdmdncmFwaGljcy5qcycsIFsnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvdGV4dGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy92bWxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlZtbEVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxSZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFRleHRFbGVtZW50J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5UZXh0RWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvdm1sZ3JhcGhpY3MuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZ3JhcGhpY3MuQWJzdHJhY3RHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLkZvbnQnLCAnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5WbWxFbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxUZXh0RWxlbWVudCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50LmpzJywgWydnb29nLmhpc3RvcnkuRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmhpc3RvcnkuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaGlzdG9yeS5qcycsIFsnZ29vZy5IaXN0b3J5JywgJ2dvb2cuSGlzdG9yeS5FdmVudCcsICdnb29nLkhpc3RvcnkuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5kZXZpY2UnLCAnZ29vZy5tZW1vaXplJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2hpc3RvcnlfdGVzdC5qcycsIFsnZ29vZy5IaXN0b3J5VGVzdCddLCBbJ2dvb2cuSGlzdG9yeScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaGlzdG9yeS9odG1sNWhpc3RvcnkuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnknLCAnZ29vZy5oaXN0b3J5Lkh0bWw1SGlzdG9yeS5Ub2tlblRyYW5zZm9ybWVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaHRtbDVoaXN0b3J5X3Rlc3QuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuSHRtbDVIaXN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9jc3NzcGVjaWZpY2l0eS5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5J10sIFsnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvY3Nzc3BlY2lmaWNpdHlfdGVzdC5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5VGVzdCddLCBbJ2dvb2cuaHRtbC5Dc3NTcGVjaWZpY2l0eScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoLmpzJywgWydnb29nLmh0bWwuZmxhc2gnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5mbGFzaFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuZmxhc2gnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvbGVnYWN5Y29udmVyc2lvbnMuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2xlZ2FjeWNvbnZlcnNpb25zX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9uc1Rlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZycsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlaHRtbF90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZUh0bWxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVodG1sZm9ybWF0dGVyLmpzJywgWydnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWxmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVIdG1sRm9ybWF0dGVyVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXNjcmlwdC5qcycsIFsnZ29vZy5odG1sLlNhZmVTY3JpcHQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlc2NyaXB0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYWZlU2NyaXB0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlLmpzJywgWydnb29nLmh0bWwuU2FmZVN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVzdHlsZV90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZVN0eWxlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXQuanMnLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXRfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVTdHlsZVNoZWV0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlVXJsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnMudXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmxfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2FmZVVybFRlc3RWZWN0b3JzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZldXJsX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0VmVjdG9ycyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2F0dHJpYnV0ZXdoaXRlbGlzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVTYW5pdGl6ZWRXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVXaGl0ZWxpc3QnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3Nwcm9wZXJ0eXNhbml0aXplci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Byb3BlcnR5c2FuaXRpemVyX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXJUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3NzYW5pdGl6ZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Nhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuQ3NzU2FuaXRpemVyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9lbGVtZW50d2Vha21hcC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcCddLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvZWxlbWVudHdlYWttYXBfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcFRlc3QnXSwgWydnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLmh0bWxUZXN0VmVjdG9ycyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyLmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyQXR0cmlidXRlUG9saWN5JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXJQb2xpY3lDb250ZXh0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeUhpbnRzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclVybFBvbGljeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlU2FuaXRpemVkV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3InLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdCbGFja2xpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvaHRtbHNhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuSHRtbFNhbml0aXplclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyX3VuaWZpZWRfdGVzdC5qcycsIFsnZ29vZy5odG1sLkh0bWxTYW5pdGl6ZXJVbmlmaWVkVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuaHRtbFRlc3RWZWN0b3JzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplci5CdWlsZGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXJUZXN0J10sIFsnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9zYWZlZG9tdHJlZXByb2Nlc3Nvci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3NhZmVkb210cmVlcHJvY2Vzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3JUZXN0J10sIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci90YWdibGFja2xpc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuVGFnQmxhY2tsaXN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvdGFnd2hpdGVsaXN0LmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLlRhZ1doaXRlbGlzdCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZS5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZV90ZXN0LmpzJywgWydnb29nLmh0bWwuVW5zYWZlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkF0dHJpYnV0ZVdoaXRlbGlzdCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zaWx2ZXJsaWdodC5qcycsIFsnZ29vZy5odG1sLnNpbHZlcmxpZ2h0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NpbHZlcmxpZ2h0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zaWx2ZXJsaWdodFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2lsdmVybGlnaHQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGVzdGluZy5qcycsIFsnZ29vZy5odG1sLnRlc3RpbmcnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkFyZ3VtZW50TWF0Y2hlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90ZXh0ZXh0cmFjdG9yLmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGV4dGV4dHJhY3Rvcl90ZXN0LmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvclRlc3QnXSwgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkcmVzb3VyY2V1cmwuanMnLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdHJ1c3RlZHJlc291cmNldXJsX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkUmVzb3VyY2VVcmxUZXN0J10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudHJ1c3RlZHR5cGVzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkdHlwZXMuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3VuY2hlY2tlZGNvbnZlcnNpb25zLmpzJywgWydnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdW5jaGVja2VkY29udmVyc2lvbnNfdGVzdC5qcycsIFsnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdXRpbHMuanMnLCBbJ2dvb2cuaHRtbC51dGlscyddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3V0aWxzX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5VdGlsc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnV0aWxzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGkuanMnLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5EaXJlY3Rpb25hbFN0cmluZycsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5iaWRpVGVzdCddLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpZm9ybWF0dGVyLmpzJywgWydnb29nLmkxOG4uQmlkaUZvcm1hdHRlciddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmkxOG4uYmlkaScsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRm9ybWF0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGlmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuaTE4bi5CaWRpRm9ybWF0dGVyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcmxpc3RkZWNvbXByZXNzb3IuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5pMThuLnVDaGFyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2NoYXJsaXN0ZGVjb21wcmVzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvclRlc3QnXSwgWydnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcnBpY2tlcmRhdGEuanMnLCBbJ2dvb2cuaTE4bi5DaGFyUGlja2VyRGF0YSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uLmpzJywgWydnb29nLmkxOG4uY29sbGF0aW9uJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5jb2xsYXRpb25UZXN0J10sIFsnZ29vZy5pMThuLmNvbGxhdGlvbicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jb21wYWN0bnVtYmVyZm9ybWF0c3ltYm9scy5qcycsIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYW0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jeScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19odScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ub19OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9QVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poX1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29tcGFjdG51bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc0V4dCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZ3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FrX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9BRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9QUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9YQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc19JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JlbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jlel9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibV9NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWJ1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lZV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbF9HUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0ZKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0tOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01IJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01TJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01XJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05GJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1ZHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1dTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19BUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19CWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19DUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19HVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19OSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19TVicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldF9FRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZmJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX01SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZvX0ZPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0JJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dQJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01DJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01VJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1BGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ2QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3VfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYXdfVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHJfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hzYl9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pYScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19paScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWlfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXRfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamFfSlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19qbWMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2p2X0lEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYWJfRFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZGUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZWFfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ra2onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsX0dMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa21fS0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29fS1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXNfTVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXVhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tem4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmVfTlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfQlEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfU1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25tZ19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubmgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19udXNfU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX255bicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vcl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vc19SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0FPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X1RMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3F1X0VDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JtX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ybicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JvX01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb19STycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb2ZfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfS1onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfVUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcndrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2FoX1JVJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2JwJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZF9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZV9OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VoX01aJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9UZm5nX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NsX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc24nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fREonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3FfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3ZfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3dfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGFfTEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGhfVEgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGlfRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdG8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHJfVFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHdxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHptX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VrX1VBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmxfVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192YWlfVmFpaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192dW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193YWVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hvZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195b19CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnRfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dV9aQSddLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jdXJyZW5jeS5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5pMThuLmN1cnJlbmN5LkN1cnJlbmN5SW5mb1RpZXIyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3lfdGVzdC5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5VGVzdCddLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3ljb2RlbWFwLmpzJywgWydnb29nLmkxOG4uY3VycmVuY3lDb2RlTWFwJywgJ2dvb2cuaTE4bi5jdXJyZW5jeUNvZGVNYXBUaWVyMiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsZm9ybWF0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlLkRhdGVMaWtlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzVHlwZScsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0VGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFBhdHRlcm5zJywgJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbHBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsUGF0dGVybnMnXSwgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9scyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFscGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJuc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJucyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsc3ltYm9scy5qcycsIFsnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRlaW50ZXJ2YWxzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9sc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuX1hBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3N2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGVfSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvX1JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGFyc2UuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGF0ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhcnNlX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19heicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ibicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jaHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXNfNDE5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX01YJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaGF3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ttJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25iJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3J1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZ3FfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYW1fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXJfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0JIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0pPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX09NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1FBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1REJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1ROJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hc2FfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzdF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXpfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iYXNfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVfQlknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JlbV9aTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnX0JHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyeCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icnhfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ic19DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JzX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9BRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jY3AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NjcF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2ViX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZ2dfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2hyX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ja2JfSVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2tiX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2N5X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kYXZfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGplJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHlvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19keicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kel9CVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lbl8xNTAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRksnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1onLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVE8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW9fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0hOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0lDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1ZFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V3bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfSFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfV0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2Z1cl9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meV9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYV9JRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZF9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3N3X0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2dzd19MSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2X0lNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oZV9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oaV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9IUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1X0hVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5X0FNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZF9JRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZ19ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pc19JUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9TTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9WQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qZ28nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfamdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qbWNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FfR0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rYW0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FtX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rZGVfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2VhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19raHEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2hxX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trX0taJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ra2pfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tsbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa29rX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NmJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzZl9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NoX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xhZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sYWdfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGt0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xrdF9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sb19MQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19scmMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xyY19JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdF9MVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdV9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x1eScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdXlfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWFzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21hc19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21lcl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWZlX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21naCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZ2hfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ta19NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tcl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19CTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdF9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbXVhX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215X01NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tem5fSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmFxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9TSicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZF9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25kc19OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9BVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9DVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubmhfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnVzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ueW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnluX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX0dFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0FyYWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGxfUEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ1YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfU1QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfUEUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fUk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9mJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9CWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9NRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd19SVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcndrX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2FxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhcV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2JwX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX1NFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2VzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Nlc19NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZ19DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG5fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2lfTEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2tfU0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Ntbl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbl9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9BTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9MYXRuX01FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9BWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190Z19USicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190a19UTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190b19UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dF9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHdxX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3R6bScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWdfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZpX1ZOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc192dW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfd2FlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aF9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194b2cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195YXZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWlfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3l1ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196Z2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemdoX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFudF9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNUeXBlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jeScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhdycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hZl9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9PTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9UTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfTGF0bl9BWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JlX0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbF9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMTUwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0pFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0tJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0xDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01QJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VvXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19DTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19ETycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19JQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19WRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9CRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZvX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0dOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0hUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1JFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1dGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXJfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2FfSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2xfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1el9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYV9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGlfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oeV9BTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWRfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfVkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2p2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocV9NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ra19LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa29fS1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tva19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXNfQk4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXRfTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19teV9NTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251cycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bl9VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vc19HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BhX0FyYWJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsX1BMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0xVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1NUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3F1X0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JuX0JJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yb19STycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfS0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcndfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXFfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXNfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoaV9UZm5nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NrX1NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc29fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3FfTUsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX1hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9MYXRuX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3ZfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3dfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGdfVEonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGlfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGtfVE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHJfQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHRfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VnX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VyX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9MYXRuX1VaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192YWlfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aV9WTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfd29fU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2X0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeXVlX0hhbnQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaF9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFuc19ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudF9UVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrLmpzJywgWydnb29nLmkxOG4uR3JhcGhlbWVCcmVhayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrVGVzdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9sb2NhbGVmZWF0dXJlLmpzJywgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZSddLCBbXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2xvY2FsZWZlYXR1cmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmVUZXN0J10sIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbWVzc2FnZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLk1lc3NhZ2VGb3JtYXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9scycsICdnb29nLmkxOG4ub3JkaW5hbFJ1bGVzJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9tZXNzYWdlZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0VGVzdCddLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lLmpzJywgWydnb29nLmkxOG4ubWltZScsICdnb29nLmkxOG4ubWltZS5lbmNvZGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaTE4bi51Q2hhciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5taW1lLmVuY29kZVRlc3QnXSwgWydnb29nLmkxOG4ubWltZS5lbmNvZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0LmpzJywgWydnb29nLmkxOG4uTnVtYmVyRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQuQ3VycmVuY3lTdHlsZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0LkZvcm1hdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5jdXJyZW5jeScsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRUZXN0J10sIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUdfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3VfbnVfbGF0bicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHMuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FtJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19heicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2N5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0FUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19NWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oYXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa24nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa28nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm9fTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfUFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190bCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREpfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1dfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT01fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0FfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TT191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1NfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfVE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWEInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUVfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzYV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc3QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXpfQ3lybF9BWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0xhdG5fQVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmFzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZW0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JleicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZXpfVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm1fTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icngnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnNfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfQUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfSVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2ViJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2dnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jeV9HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYXYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0RFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHNiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHVhX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R6X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpbF9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19GTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ESicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9IVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ORScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9UTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9XRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ZVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZnVyX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsX0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndXpfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGF3X1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hpX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hzYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oc2JfREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHlfQU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lkX0lEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpX0NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1ZBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2phX0pQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfam1jJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdl9JRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2FiX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYW1fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rZWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2VhX0NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19raHFfTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tfS1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tqJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbF9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2xuX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ttX0tIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rb2tfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzaF9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sYWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xrdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG9fTEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVfQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sdXknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21hcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21lcicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21mZV9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWtfTUsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX0JOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210X01UJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX211YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU1fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXpuX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25hcScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRfWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZHNfTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NlaF9NWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VzX01MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NoaScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZ19NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19za19TSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbF9TSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc21uX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX1NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX01LJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9DeXJsX01FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9YSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bl9SUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X1NFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0xLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdGVvX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnX1RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RoX1RIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrX1RNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX1RSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0X1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R3cScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdHptJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R6bV9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191Z19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191a19VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL29yZGluYWxydWxlcy5qcycsIFsnZ29vZy5pMThuLm9yZGluYWxSdWxlcyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3BsdXJhbHJ1bGVzLmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9wbHVyYWxydWxlc190ZXN0LmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXNUZXN0J10sIFsnZ29vZy5pMThuLnBsdXJhbFJ1bGVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVmb3JtYXQuanMnLCBbJ2dvb2cuaTE4bi5SZWxhdGl2ZURhdGVUaW1lRm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaTE4bi5Mb2NhbGVGZWF0dXJlJywgJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5yZWxhdGl2ZURhdGVUaW1lU3ltYm9scyddLCB7J2xhbmcnOiAnZXM1JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vcmVsYXRpdmVkYXRldGltZWZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9yZWxhdGl2ZWRhdGV0aW1lc3ltYm9sc2V4dC5qcycsIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0J10sIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJ10sIHsnbGFuZyc6ICdlczUnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi90aW1lem9uZS5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdGltZXpvbmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lVGVzdCddLCBbJ2dvb2cuaTE4bi5UaW1lWm9uZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci5qcycsIFsnZ29vZy5pMThuLnVDaGFyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlci5qcycsIFsnZ29vZy5pMThuLnVDaGFyLkxvY2FsTmFtZUZldGNoZXInXSwgWydnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5pMThuLnVDaGFyTmFtZXMnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlciddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvcmVtb3RlbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5SZW1vdGVOYW1lRmV0Y2hlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlVyaScsICdnb29nLmV2ZW50cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5pMThuLnVDaGFyLk5hbWVGZXRjaGVyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci9yZW1vdGVuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuUmVtb3RlTmFtZUZldGNoZXJUZXN0J10sIFsnZ29vZy5pMThuLnVDaGFyLlJlbW90ZU5hbWVGZXRjaGVyJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3VjaGFyX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi51Q2hhclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lcy5qcycsIFsnZ29vZy5pMThuLnVDaGFyTmFtZXMnXSwgWydnb29nLmkxOG4udUNoYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lc190ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXJOYW1lc1Rlc3QnXSwgWydnb29nLmkxOG4udUNoYXJOYW1lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczYuanMnLCBbJ2dvb2cuaXRlci5lczYnXSwgWydnb29nLml0ZXIuSXRlcmFibGUnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczZfdGVzdC5qcycsIFsnZ29vZy5pdGVyLmVzNlRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLmVzNicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyLmpzJywgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhYmxlJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubWF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyX3Rlc3QuanMnLCBbJ2dvb2cuaXRlclRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2h5YnJpZC5qcycsIFsnZ29vZy5qc29uLmh5YnJpZCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vaHlicmlkX3Rlc3QuanMnLCBbJ2dvb2cuanNvbi5oeWJyaWRUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb24uanMnLCBbJ2dvb2cuanNvbicsICdnb29nLmpzb24uUmVwbGFjZXInLCAnZ29vZy5qc29uLlJldml2ZXInLCAnZ29vZy5qc29uLlNlcmlhbGl6ZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9qc29uX3BlcmYuanMnLCBbJ2dvb2cuanNvblBlcmYnXSwgWydnb29nLmRvbScsICdnb29nLmpzb24nLCAnZ29vZy5tYXRoJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRhYmxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vanNvbl90ZXN0LmpzJywgWydnb29nLmpzb25UZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb25hYmxlLmpzJywgWydnb29nLmpzb24uSnNvbmFibGUnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9uYXRpdmVqc29ucHJvY2Vzc29yLmpzJywgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24uUHJvY2Vzc29yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL3Byb2Nlc3Nvci5qcycsIFsnZ29vZy5qc29uLlByb2Nlc3NvciddLCBbJ2dvb2cuc3RyaW5nLlBhcnNlcicsICdnb29nLnN0cmluZy5TdHJpbmdpZmllciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9wcm9jZXNzb3JfdGVzdC5qcycsIFsnZ29vZy5qc29uLnByb2Nlc3NvclRlc3QnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXMuanMnLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXNfdGVzdC5qcycsIFsnZ29vZy5sYWJzLml0ZXJhYmxlVGVzdCddLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2RvbS9wYWdldmlzaWJpbGl0eW1vbml0b3IuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlFdmVudCcsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5TW9uaXRvcicsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5U3RhdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS52ZW5kb3InLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWVtb2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9kb20vcGFnZXZpc2liaWxpdHltb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL25vbmRpc3Bvc2FibGVldmVudHRhcmdldC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyTWFwJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy9ub25kaXNwb3NhYmxlZXZlbnR0YXJnZXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXRUZXN0J10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9ldmVudHMvbm9uZGlzcG9zYWJsZWV2ZW50dGFyZ2V0X3ZpYV9nb29nZXZlbnRzX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5ldmVudHMuTm9uRGlzcG9zYWJsZUV2ZW50VGFyZ2V0R29vZ0V2ZW50c1Rlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL3RvdWNoLmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoJywgJ2dvb2cubGFicy5ldmVudHMudG91Y2guVG91Y2hEYXRhJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy90b3VjaF90ZXN0LmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoVGVzdCddLCBbJ2dvb2cubGFicy5ldmVudHMudG91Y2gnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdi5qcycsIFsnZ29vZy5sYWJzLmZvcm1hdC5jc3YnLCAnZ29vZy5sYWJzLmZvcm1hdC5jc3YuUGFyc2VFcnJvcicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5Ub2tlbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdl90ZXN0LmpzJywgWydnb29nLmxhYnMuZm9ybWF0LmNzdlRlc3QnXSwgWydnb29nLmxhYnMuZm9ybWF0LmNzdicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5QYXJzZUVycm9yJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdC5qcycsIFsnZ29vZy5sYWJzLmkxOG4uR2VuZGVySW5mbycsICdnb29nLmxhYnMuaTE4bi5HZW5kZXJJbmZvLkdlbmRlcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0VGVzdCddLCBbJ2dvb2cubGFicy5pMThuLkdlbmRlckluZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196dScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9pMThuL2xpc3RzeW1ib2xzLmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hbScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19heicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ibicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX01YJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcl9DQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2luJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2phJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ttJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21rJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25lJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X1BUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NoJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0JIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01SJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1FBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1REJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1hCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1lFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXN0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzdF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXpfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JhcycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iYXNfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JlbV9aTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmV6X1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JnX0JHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0NOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyX0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyeCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ic19DeXJsX0JBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9BRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9GUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2NwX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NnZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZ2dfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NrYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ja2JfSVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NzX0NaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2N5X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0dMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTEknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RqZV9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R1YScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kdWFfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R5b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19keicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maWxfUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fRk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfREonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfS00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUEYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfWVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meV9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZF9HQicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3N3X0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2X0lNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhd19VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oZV9JTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9IUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1X0hVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZ19ORycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paV9DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pc19JUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9TTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qYV9KUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qZ28nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ptYycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qbWNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanZfSUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FfR0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thYl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rYW0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tkZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rZGVfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tlYV9DVicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19raHEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2traicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ra2pfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xfR0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbV9LSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2JfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NmJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NoX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1X1RSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5X0tHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xhZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGdfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGt0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9BTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sb19MQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHJjX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdV9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x1eScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHZfTFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWFzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tYXNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZmUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWZlX01VJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nX01HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21naCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWdvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nb19DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taV9OWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ta19NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbl9NTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tcl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdWEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbXVhX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25hcV9OQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9OTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZF9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmRzX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25kc19OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9OUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX1NFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZWhfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2VzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZ19DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG5fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2lfTEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2xfU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbl9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19ESicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19TTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9BTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsX1JTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9MYXRuX01FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9BWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9TRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9MSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Rlb19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aF9USCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190b19UTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9UUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190d3EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHdxX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190em1fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWtfVUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbW9jay9tb2NrLmpzJywgWydnb29nLmxhYnMubW9jaycsICdnb29nLmxhYnMubW9jay5UaW1lb3V0RXJyb3InLCAnZ29vZy5sYWJzLm1vY2suVmVyaWZpY2F0aW9uRXJyb3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dCcsICdnb29nLmxhYnMubW9jay50aW1lb3V0LlRpbWVvdXRNb2RlJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uQmFzZVZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svbW9ja190ZXN0LmpzJywgWydnb29nLmxhYnMubW9ja1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy5tb2NrJywgJ2dvb2cubGFicy5tb2NrLlRpbWVvdXRFcnJvcicsICdnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25FcnJvcicsICdnb29nLmxhYnMubW9jay50aW1lb3V0JywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdGltZW91dG1vZGUuanMnLCBbJ2dvb2cubGFicy5tb2NrLnRpbWVvdXQnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dC5UaW1lb3V0TW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZS5qcycsIFsnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbi5CYXNlVmVyaWZpY2F0aW9uTW9kZScsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZV90ZXN0LmpzJywgWydnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25Nb2RlVGVzdCddLCBbJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2UuanMnLCBbJ2dvb2cubGFicy5uZXQuaW1hZ2UnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC5pbWFnZVRlc3QnXSwgWydnb29nLmxhYnMubmV0LmltYWdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LldlYkNoYW5uZWwnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cubmV0LlhtbEh0dHBGYWN0b3J5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Jhc2V0ZXN0Y2hhbm5lbC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkJhc2VUZXN0Q2hhbm5lbCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuV2ViQ2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jaGFubmVsLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2NoYW5uZWxyZXF1ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXN5bmMuVGhyb3R0bGUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsRGVidWcnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmVudmlyb25tZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvY2hhbm5lbHJlcXVlc3RfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jb25uZWN0aW9uc3RhdGUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Vudmlyb25tZW50LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuZW52aXJvbm1lbnQnXSwgWydnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvZW52aXJvbm1lbnRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkVudmlyb25tZW50VGVzdCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5lbnZpcm9ubWVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9mb3J3YXJkY2hhbm5lbHJlcXVlc3Rwb29sLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuRm9yd2FyZENoYW5uZWxSZXF1ZXN0UG9vbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2ZvcndhcmRjaGFubmVscmVxdWVzdHBvb2xfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2xUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Gb3J3YXJkQ2hhbm5lbFJlcXVlc3RQb29sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL25ldHV0aWxzLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwubmV0VXRpbHMnXSwgWydnb29nLlVyaScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3JlcXVlc3RzdGF0cy5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzLkV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TdGF0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdEV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuVGltaW5nRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZS5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5CYXNlVGVzdENoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxEZWJ1ZycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQucnBjLkh0dHBDb3JzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZV90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGJhc2V0cmFuc3BvcnQuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmpzb24nLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxvZycsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LldlYkNoYW5uZWxUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcucGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZXRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUcmFuc3BvcnRUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbEJhc2UnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3dpcmUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4X3Rlc3QuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlVjhUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldpcmVWOCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQuV2ViQ2hhbm5lbFRyYW5zcG9ydCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWx0cmFuc3BvcnRmYWN0b3J5LmpzJywgWydnb29nLm5ldC5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHIuanMnLCBbJ2dvb2cubGFicy5uZXQueGhyJywgJ2dvb2cubGFicy5uZXQueGhyLkVycm9yJywgJ2dvb2cubGFicy5uZXQueGhyLkh0dHBFcnJvcicsICdnb29nLmxhYnMubmV0Lnhoci5PcHRpb25zJywgJ2dvb2cubGFicy5uZXQueGhyLlBvc3REYXRhJywgJ2dvb2cubGFicy5uZXQueGhyLlJlc3BvbnNlVHlwZScsICdnb29nLmxhYnMubmV0Lnhoci5UaW1lb3V0RXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC54aHJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxhYnMubmV0LnhocicsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3B1YnN1Yi9icm9hZGNhc3RwdWJzdWIuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cubWF0aCcsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9wdWJzdWIvYnJvYWRjYXN0cHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0b3JhZ2UvYm91bmRlZGNvbGxlY3RhYmxlc3RvcmFnZS5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdG9yYWdlL2JvdW5kZWRjb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLmxhYnMuc3RvcmFnZS5Cb3VuZGVkQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0cnVjdHMvbXVsdGltYXAuanMnLCBbJ2dvb2cubGFicy5zdHJ1Y3RzLk11bHRpbWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvc3RydWN0cy9tdWx0aW1hcF90ZXN0LmpzJywgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcFRlc3QnXSwgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdHlsZS9waXhlbGRlbnNpdHltb25pdG9yLmpzJywgWydnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvcicsICdnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvci5EZW5zaXR5JywgJ2dvb2cubGFicy5zdHlsZS5QaXhlbERlbnNpdHlNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0eWxlL3BpeGVsZGVuc2l0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXQuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdFRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyRXJyb3InLCAnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kZWNvcmF0b3JtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3RpbmcvZGVjb3JhdG9ybWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kZWNvcmF0b3JNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFueXRoaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cmllc01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cnlNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkhhc0tleU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzVmFsdWVNYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kaWN0aW9uYXJ5TWF0Y2hlclRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5IYXNFbnRyeU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnXSwgWydnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudF90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5lbnZpcm9ubWVudFRlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Vudmlyb25tZW50X3VzYWdlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLmVudmlyb25tZW50VXNhZ2VUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9qc29uX2Z1enppbmcuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2pzb25fZnV6emluZ190ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Kc29uRnV6emluZ1Rlc3QnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sYWJzLnRlc3RpbmcuSnNvbkZ1enppbmcnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXIuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5BbnlPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOb3RNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmxvZ2ljTWF0Y2hlcnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcubG9naWNNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9tYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlOdW1iZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNsb3NlVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkVxdWFsVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkdyZWF0ZXJUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkxlc3NUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLm51bWJlck1hdGNoZXJUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuQW55T2JqZWN0TWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5IYXNQcm9wZXJ0eU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSW5zdGFuY2VPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOdWxsTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5Jc051bGxPclVuZGVmaW5lZE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNVbmRlZmluZWRNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk9iamVjdEVxdWFsc01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5vYmplY3RNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5PYmplY3RFcXVhbHNNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9zdHJpbmdtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlTdHJpbmdNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNvbnRhaW5zU3RyaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5FbmRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxUb0lnbm9yaW5nV2hpdGVzcGFjZU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxzTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5SZWdleE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RhcnRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RyaW5nQ29udGFpbnNJbk9yZGVyTWF0Y2hlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvc3RyaW5nbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5zdHJpbmdNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5TdHJpbmdDb250YWluc0luT3JkZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2Jyb3dzZXIuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9icm93c2VyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmRldmljZSddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcycsIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZW5naW5lX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2V4dHJhLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9leHRyYV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdGVzdF9hZ2VudHMuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC91dGlsLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWwnXSwgWydnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdXRpbF90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWxUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXIuanMnLCBbJ2dvb2cubGFicy51c2VyYWdlbnQudmVyaWZpZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9hZGVyL2Fic3RyYWN0bW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlci5DYWxsYmFja1R5cGUnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvYWRlci9hY3RpdmVtb2R1bGVtYW5hZ2VyLmpzJywgWydnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJpZXMuanMnLCBbJ2dvb2cubG9jYWxlLmNvdW50cmllcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJ5bGFuZ3VhZ2VuYW1lc190ZXN0LmpzJywgWydnb29nLmxvY2FsZS5jb3VudHJ5TGFuZ3VhZ2VOYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2RlZmF1bHRsb2NhbGVuYW1lY29uc3RhbnRzLmpzJywgWydnb29nLmxvY2FsZS5kZWZhdWx0TG9jYWxlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9nZW5lcmljZm9udG5hbWVzLmpzJywgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2dlbmVyaWNmb250bmFtZXNfdGVzdC5qcycsIFsnZ29vZy5sb2NhbGUuZ2VuZXJpY0ZvbnROYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvZ2VuZXJpY2ZvbnRuYW1lc2RhdGEuanMnLCBbJ2dvb2cubG9jYWxlLmdlbmVyaWNGb250TmFtZXNEYXRhJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2xvY2FsZS5qcycsIFsnZ29vZy5sb2NhbGUnXSwgWydnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvbmF0aXZlbmFtZWNvbnN0YW50cy5qcycsIFsnZ29vZy5sb2NhbGUubmF0aXZlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9zY3JpcHRUb0xhbmd1YWdlcy5qcycsIFsnZ29vZy5sb2NhbGUuc2NyaXB0VG9MYW5ndWFnZXMnXSwgWydnb29nLmxvY2FsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZGV0ZWN0aW9uLmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbiddLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS90aW1lem9uZWRldGVjdGlvbl90ZXN0LmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvblRlc3QnXSwgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZmluZ2VycHJpbnQuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0LmpzJywgWydnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVBbGxMb25nTmFtZXMnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcycsICdnb29nLmxvY2FsZS5nZXRUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyddLCBbJ2dvb2cubG9jYWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lTGlzdFRlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvZy9sb2cuanMnLCBbJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubG9nLkxvZ1JlY29yZCcsICdnb29nLmxvZy5Mb2dnZXInXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9nL2xvZ190ZXN0LmpzJywgWydnb29nLmxvZ1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtLmpzJywgWydnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5BZmZpbmVUcmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkFmZmluZVRyYW5zZm9ybScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9iZXppZXIuanMnLCBbJ2dvb2cubWF0aC5CZXppZXInXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYmV6aWVyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5CZXppZXJUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5CZXppZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYm94LmpzJywgWydnb29nLm1hdGguQm94J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2JveF90ZXN0LmpzJywgWydnb29nLm1hdGguQm94VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZS5qcycsIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwgWydnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZTMuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlMyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2Nvb3JkaW5hdGUzX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZV90ZXN0LmpzJywgWydnb29nLm1hdGguQ29vcmRpbmF0ZVRlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmYnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmZUZXN0J10sIFsnZ29vZy5tYXRoLkV4cG9uZW50aWFsQmFja29mZicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyLmpzJywgWydnb29nLm1hdGguSW50ZWdlciddLCBbJ2dvb2cucmVmbGVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5JbnRlZ2VyVGVzdCddLCBbJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9pbnRlcnBvbGF0b3IxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5JbnRlcnBvbGF0b3IxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuTGluZWFyMVRlc3QnXSwgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3BjaGlwMS5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9wY2hpcDFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDFUZXN0J10sIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTEuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnLCAnZ29vZy5tYXRoLnRkbWEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxVGVzdCddLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pcmVjdC5qcycsIFsnZ29vZy5tYXRoLklSZWN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lLmpzJywgWydnb29nLm1hdGguTGluZSddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5MaW5lVGVzdCddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5MaW5lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2xvbmcuanMnLCBbJ2dvb2cubWF0aC5Mb25nJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucmVmbGVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbG9uZ190ZXN0LmpzJywgWydnb29nLm1hdGguTG9uZ1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoLkxvbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aC5qcycsIFsnZ29vZy5tYXRoJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aF90ZXN0LmpzJywgWydnb29nLm1hdGhUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL21hdHJpeC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9tYXRyaXhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeFRlc3QnXSwgWydnb29nLm1hdGguTWF0cml4JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGguanMnLCBbJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cubWF0aC5QYXRoLlNlZ21lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlBhdGhUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJywgJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhzLmpzJywgWydnb29nLm1hdGgucGF0aHMnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9wYXRoc190ZXN0LmpzJywgWydnb29nLm1hdGgucGF0aHNUZXN0J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLnBhdGhzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3JhbmdlLmpzJywgWydnb29nLm1hdGguUmFuZ2UnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlVGVzdCddLCBbJ2dvb2cubWF0aC5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yYW5nZXNldC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlU2V0J10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5tYXRoLlJhbmdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3Jhbmdlc2V0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SYW5nZVNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5tYXRoLlJhbmdlJywgJ2dvb2cubWF0aC5SYW5nZVNldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0LmpzJywgWydnb29nLm1hdGguUmVjdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5JUmVjdCcsICdnb29nLm1hdGguU2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SZWN0VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvc2l6ZS5qcycsIFsnZ29vZy5tYXRoLlNpemUnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9zaXplX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5TaXplVGVzdCddLCBbJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3RkbWEuanMnLCBbJ2dvb2cubWF0aC50ZG1hJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdGRtYV90ZXN0LmpzJywgWydnb29nLm1hdGgudGRtYVRlc3QnXSwgWydnb29nLm1hdGgudGRtYScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMyLmpzJywgWydnb29nLm1hdGguVmVjMiddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjMl90ZXN0LmpzJywgWydnb29nLm1hdGguVmVjMlRlc3QnXSwgWydnb29nLm1hdGguVmVjMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMzLmpzJywgWydnb29nLm1hdGguVmVjMyddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZTMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjM190ZXN0LmpzJywgWydnb29nLm1hdGguVmVjM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy5tYXRoLlZlYzMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZS5qcycsIFsnZ29vZy5tZW1vaXplJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZV90ZXN0LmpzJywgWydnb29nLm1lbW9pemVUZXN0J10sIFsnZ29vZy5tZW1vaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbFRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2J1ZmZlcmVkY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuQnVmZmVyZWRDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYnVmZmVyZWRjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkJ1ZmZlcmVkQ2hhbm5lbFRlc3QnXSwgWydnb29nLmRlYnVnLkNvbnNvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5CdWZmZXJlZENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmFzeW5jLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvZGVmZXJyZWRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5EZWZlcnJlZENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9kZWZlcnJlZGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJjbGllbnQuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkxvZ2dlckNsaWVudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2xvZ2dlcmNsaWVudF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnRUZXN0J10sIFsnZ29vZy5kZWJ1ZycsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbG9nZ2Vyc2VydmVyLmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJzZXJ2ZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTG9nZ2VyU2VydmVyVGVzdCddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL21lc3NhZ2luZy5qcycsIFsnZ29vZy5tZXNzYWdpbmcnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnaW5nX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsVGVzdCddLCBbJ2dvb2cubWVzc2FnaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLk11bHRpQ2hhbm5lbC5WaXJ0dWFsQ2hhbm5lbCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWxUZXN0J10sIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNhbGxlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cubWVzc2FnaW5nLkRlZmVycmVkQ2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjYWxsZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuanNvbicsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWxUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRuZXR3b3JrX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnRPcGVyYXRvclRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcmVzcG9uZGluZ2NoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlJlc3BvbmRpbmdDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9yZXNwb25kaW5nY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5SZXNwb25kaW5nQ2hhbm5lbFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5tZXNzYWdpbmcuUmVzcG9uZGluZ0NoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRjaGFubmVsX3dvcmtlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcudGVzdGRhdGEucG9ydGNoYW5uZWxfd29ya2VyJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy90ZXN0ZGF0YS9wb3J0bmV0d29ya193b3JrZXIxLmpzJywgWydnb29nLm1lc3NhZ2luZy50ZXN0ZGF0YS5wb3J0bmV0d29ya193b3JrZXIxJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRuZXR3b3JrX3dvcmtlcjIuanMnLCBbJ2dvb2cubWVzc2FnaW5nLnRlc3RkYXRhLnBvcnRuZXR3b3JrX3dvcmtlcjInXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvYWJzdHJhY3Rtb2R1bGVsb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkFic3RyYWN0TW9kdWxlTG9hZGVyJ10sIFsnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL2Jhc2Vtb2R1bGUuanMnLCBbJ2dvb2cubW9kdWxlLkJhc2VNb2R1bGUnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tb2R1bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9sb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkxvYWRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLm1vZHVsZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL21vZHVsZS5qcycsIFsnZ29vZy5tb2R1bGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlaW5mby5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVpbmZvX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUluZm9UZXN0J10sIFsnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkY2FsbGJhY2suanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFjayddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cubW9kdWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGNhbGxiYWNrX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFja1Rlc3QnXSwgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGVyLmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVMb2FkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SWQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5uZXQuQnVsa0xvYWRlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTG9hZGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkNhbGxiYWNrVHlwZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLlRyYWNlJywgJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2VBbGwnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLmFjdGl2ZU1vZHVsZU1hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlcl90ZXN0LmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8xJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMi5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8yJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEJfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQl8xJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Jyb3dzZXJjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvcicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FdmVudCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuVGltaW5nRXZlbnQnXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5OYXRpdmVKc29uUHJvY2Vzc29yJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcmNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWxUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcnRlc3RjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvcicsICdnb29nLm5ldC50bXBuZXR3b3JrJywgJ2dvb2cuc3RyaW5nLlBhcnNlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2J1bGtsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXInXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuQnVsa0xvYWRlckhlbHBlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXJUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyaGVscGVyLmpzJywgWydnb29nLm5ldC5CdWxrTG9hZGVySGVscGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLm5ldC5DaGFubmVsRGVidWcnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbHJlcXVlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LkVycm9yJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NoYW5uZWxyZXF1ZXN0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsJywgJ2dvb2cubmV0LkNoYW5uZWxEZWJ1ZycsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY29va2llcy5qcycsIFsnZ29vZy5uZXQuQ29va2llcycsICdnb29nLm5ldC5jb29raWVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nvb2tpZXNfdGVzdC5qcycsIFsnZ29vZy5uZXQuY29va2llc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubmV0LkNvb2tpZXMnLCAnZ29vZy5uZXQuY29va2llcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInXSwgWydnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5Db3JzWG1sSHR0cEZhY3RvcnlUZXN0J10sIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9jcm9zc2RvbWFpbnJwYy5qcycsIFsnZ29vZy5uZXQuQ3Jvc3NEb21haW5ScGMnXSwgWydnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nyb3NzZG9tYWlucnBjX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNyb3NzRG9tYWluUnBjVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm5ldC5Dcm9zc0RvbWFpblJwYycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Vycm9yY29kZS5qcycsIFsnZ29vZy5uZXQuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5uZXQuRXZlbnRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZldGNoeG1saHR0cGZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmV0Y2h4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5VGVzdCddLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZpbGVkb3dubG9hZGVyLmpzJywgWydnb29nLm5ldC5GaWxlRG93bmxvYWRlcicsICdnb29nLm5ldC5GaWxlRG93bmxvYWRlci5FcnJvciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmZzJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmlsZWRvd25sb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuRmlsZURvd25sb2FkZXJUZXN0J10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRmlsZURvd25sb2FkZXInLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcubmV0LlhocklvUG9vbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2h0dHBzdGF0dXMuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaHR0cHN0YXR1c25hbWUuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXNOYW1lJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLm5ldC5JZnJhbWVJby5JbmNyZW1lbnRhbERhdGFFdmVudCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklmcmFtZUlvVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuSWZyYW1lTG9hZE1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5JZnJhbWVMb2FkTW9uaXRvclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkltYWdlTG9hZGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuSW1hZ2VMb2FkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5JbWFnZUxvYWRlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzLmpzJywgWydnb29nLm5ldC5JcEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NkFkZHJlc3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklwQWRkcmVzc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cubmV0LklwQWRkcmVzcycsICdnb29nLm5ldC5JcHY0QWRkcmVzcycsICdnb29nLm5ldC5JcHY2QWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzbG9hZGVyLmpzJywgWydnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvckNvZGUnLCAnZ29vZy5uZXQuanNsb2FkZXIuT3B0aW9ucyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuanNsb2FkZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy5uZXQuanNsb2FkZXIuRXJyb3JDb2RlJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNvbnAuanMnLCBbJ2dvb2cubmV0Lkpzb25wJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzb25wX3Rlc3QuanMnLCBbJ2dvb2cubmV0Lkpzb25wVGVzdCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuSnNvbnAnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5Nb2NrSUZyYW1lSW8nXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LklmcmFtZUlvJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5NdWx0aUlmcmFtZUxvYWRNb25pdG9yVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L25ldHdvcmtzdGF0dXNtb25pdG9yLmpzJywgWydnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9uZXR3b3JrdGVzdGVyLmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbmV0d29ya3Rlc3Rlcl90ZXN0LmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyVGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cubmV0Lk5ldHdvcmtUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3JwYy9odHRwY29ycy5qcycsIFsnZ29vZy5uZXQucnBjLkh0dHBDb3JzJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvcnBjL2h0dHBjb3JzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LnJwYy5IdHRwQ29yc1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLm5ldC5ycGMuSHR0cENvcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHBic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvYmFzZTY0cGJzdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRQYlN0cmVhbVBhcnNlclRlc3QnXSwgWydnb29nLmNyeXB0LmJhc2U2NCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9iYXNlNjRzdHJlYW1kZWNvZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFN0cmVhbURlY29kZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5iYXNlNjQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHN0cmVhbWRlY29kZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRTdHJlYW1EZWNvZGVyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvanNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlci5PcHRpb25zJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2pzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvbm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3BianNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYmpzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXJUZXN0J10sIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3Bic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYnN0cmVhbXBhcnNlcl90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuUGJTdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3N0cmVhbWZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuY3JlYXRlWGhyTm9kZVJlYWRhYmxlU3RyZWFtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyTm9kZVJlYWRhYmxlU3RyZWFtJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9zdHJlYW1wYXJzZXIuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvdXRpbHMuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgW10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhybm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuc3RyZWFtcy5Ob2RlUmVhZGFibGVTdHJlYW0nLCAnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3hocm5vZGVyZWFkYWJsZXN0cmVhbV90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbVRlc3QnXSwgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhyc3RyZWFtcmVhZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmxvZycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy94aHJzdHJlYW1yZWFkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXJUZXN0J10sIFsnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0MS5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdGVzdGRhdGEvanNsb2FkZXJfdGVzdDIuanMnLCBbJ2dvb2cubmV0LnRlc3RkYXRhLmpzbG9hZGVyX3Rlc3QyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3Rlc3RkYXRhL2pzbG9hZGVyX3Rlc3QzLmpzJywgWydnb29nLm5ldC50ZXN0ZGF0YS5qc2xvYWRlcl90ZXN0MyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0NC5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdG1wbmV0d29yay5qcycsIFsnZ29vZy5uZXQudG1wbmV0d29yayddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5uZXQuQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0LmpzJywgWydnb29nLm5ldC5XZWJTb2NrZXQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkVycm9yRXZlbnQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJTb2NrZXQuTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LldlYlNvY2tldFRlc3QnXSwgWydnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LldlYlNvY2tldCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3dyYXBwZXJ4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hocmlvLmpzJywgWydnb29nLm5ldC5YaHJJbycsICdnb29nLm5ldC5YaHJJby5SZXNwb25zZVR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLm5ldC5YaHJJb1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cubmV0LlhocklvUG9vbCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2xfdGVzdC5qcycsIFsnZ29vZy5uZXQuWGhySW9Qb29sVGVzdCddLCBbJ2dvb2cubmV0LlhocklvUG9vbCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveGhybGlrZS5qcycsIFsnZ29vZy5uZXQuWGhyTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyLmpzJywgWydnb29nLm5ldC5YaHJNYW5hZ2VyJywgJ2dvb2cubmV0Llhock1hbmFnZXIuRXZlbnQnLCAnZ29vZy5uZXQuWGhyTWFuYWdlci5SZXF1ZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubmV0Llhock1hbmFnZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cubmV0Llhock1hbmFnZXInLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJb1Bvb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveG1saHR0cC5qcycsIFsnZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZScsICdnb29nLm5ldC5YbWxIdHRwRGVmaW5lcyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgWydnb29nLm5ldC5YaHJMaWtlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ2hhbm5lbFN0YXRlcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcycsICdnb29nLm5ldC54cGMuVXJpQ2ZnRmllbGRzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxUZXN0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuVXJpJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxyb2xlLmpzJywgWydnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5DZmdGaWVsZHMnLCAnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxSb2xlJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnQnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuRGlyZWN0VHJhbnNwb3J0VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9pZnJhbWVwb2xsaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5SZWNlaXZlcicsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5TZW5kZXInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvaWZyYW1lcG9sbGluZ3RyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLklmcmFtZVBvbGxpbmdUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvbmF0aXZlbWVzc2FnaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9uYXRpdmVtZXNzYWdpbmd0cmFuc3BvcnRfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9yZWxheS5qcycsIFsnZ29vZy5uZXQueHBjLnJlbGF5J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvdHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuVHJhbnNwb3J0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy94cGMuanMnLCBbJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5DaGFubmVsU3RhdGVzJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcycsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5uZXQueHBjLlVyaUNmZ0ZpZWxkcyddLCBbJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0LmpzJywgWydnb29nLm9iamVjdCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0X3Rlc3QuanMnLCBbJ2dvb2cub2JqZWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9hYnNvbHV0ZXBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzdHJhY3RQb3NpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYWJzdHJhY3Rwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYW5jaG9yZWRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uJ10sIFsnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkcG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQm94JywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5jbGllbnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvbWVudWFuY2hvcmVkcG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9tZW51YW5jaG9yZWRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5NZW51QW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvcG9zaXRpb25pbmcuanMnLCBbJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nX3Rlc3QuanMnLCBbJ2dvb2cucG9zaXRpb25pbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy92aWV3cG9ydGNsaWVudHBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0Y2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbiddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvbmF0aXZlcmVzb2x2ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlciddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL25hdGl2ZXJlc29sdmVyX3Rlc3QuanMnLCBbJ2dvb2cucHJvbWlzZS5uYXRpdmVSZXNvbHZlclRlc3QnXSwgWydnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvcHJvbWlzZS5qcycsIFsnZ29vZy5Qcm9taXNlJ10sIFsnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Byb21pc2VfdGVzdC5qcycsIFsnZ29vZy5Qcm9taXNlVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Jlc29sdmVyLmpzJywgWydnb29nLnByb21pc2UuUmVzb2x2ZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Rlc3RzdWl0ZWFkYXB0ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS50ZXN0U3VpdGVBZGFwdGVyJ10sIFsnZ29vZy5Qcm9taXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3RoZW5hYmxlLmpzJywgWydnb29nLlRoZW5hYmxlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkRlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTWV0YWRhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3JfdGVzdC5qcycsIFsnZ29vZy5wcm90bzIuRGVzY3JpcHRvclRlc3QnXSwgWydnb29nLnByb3RvMi5EZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9maWVsZGRlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2ZpZWxkZGVzY3JpcHRvcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3JUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9sYXp5ZGVzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5MYXp5RGVzZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL21lc3NhZ2UuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9tZXNzYWdlX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2VUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9vYmplY3RzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvb2JqZWN0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLk9iamVjdFNlcmlhbGl6ZXInLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGFja2FnZV90ZXN0LnBiLmpzJywgWydzb21lcHJvdG9wYWNrYWdlLlRlc3RQYWNrYWdlVHlwZXMnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90bzIuUGJMaXRlU2VyaWFsaXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTGF6eURlc2VyaWFsaXplcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5QYkxpdGVTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLlBiTGl0ZVNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3Byb3RvX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLm1lc3NhZ2VUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcycsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnLCAnc29tZXByb3RvcGFja2FnZS5UZXN0UGFja2FnZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3NlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXN0LnBiLmpzJywgWydwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcsICdwcm90bzIuVGVzdERlZmF1bHRDaGlsZCcsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvdGV4dGZvcm1hdHNlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5NZXNzYWdlJywgJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXh0Zm9ybWF0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5UZXh0Rm9ybWF0U2VyaWFsaXplclRlc3QnXSwgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJywgJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi91dGlsLmpzJywgWydnb29nLnByb3RvMi5VdGlsJ10sIFsnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvcHVic3ViLmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1biddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3B1YnN1Yl90ZXN0LmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3RvcGljaWQuanMnLCBbJ2dvb2cucHVic3ViLlRvcGljSWQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvdHlwZWRwdWJzdWIuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cucHVic3ViLlB1YlN1YiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3R5cGVkcHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5wdWJzdWIuVG9waWNJZCcsICdnb29nLnB1YnN1Yi5UeXBlZFB1YlN1YicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0LmpzJywgWydnb29nLnJlZmxlY3QnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0X3Rlc3QuanMnLCBbJ2dvb2cucmVmbGVjdFRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9jaGFpbl90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jaGFpblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvY29tYmluZV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jb21iaW5lVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L2RlZmVycmVkYWRhcHRvci5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5SZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZWZlcnJlZGFkYXB0b3JfdGVzdC5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5yZXN1bHQnLCAnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJywgJ2dvb2cucmVzdWx0LlNpbXBsZVJlc3VsdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZXBlbmRlbnRyZXN1bHQuanMnLCBbJ2dvb2cucmVzdWx0LkRlcGVuZGVudFJlc3VsdCddLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3Jlc3VsdF9pbnRlcmZhY2UuanMnLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCBbJ2dvb2cuVGhlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsLmpzJywgWydnb29nLnJlc3VsdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5yZXN1bHQuRGVwZW5kZW50UmVzdWx0JywgJ2dvb2cucmVzdWx0LlJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsX3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0VGVzdCddLCBbJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvc2ltcGxlcmVzdWx0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy5yZXN1bHQuU2ltcGxlUmVzdWx0LlN0YXRlRXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3NpbXBsZXJlc3VsdF90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHRUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC50cmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC93YWl0X3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0LndhaXRUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9kYXRhLmpzJywgWydnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENzcycsICdnb29nLnNveS5kYXRhLlNhbml0aXplZEh0bWwnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkSnMnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRUcnVzdGVkUmVzb3VyY2VVcmknLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRVcmknXSwgWydnb29nLlVyaScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnN0cmluZy5Db25zdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L2RhdGFfdGVzdC5qcycsIFsnZ29vZy5zb3kuZGF0YVRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zb3kudGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyLmpzJywgWydnb29nLnNveS5JbmplY3RlZERhdGFTdXBwbGllcicsICdnb29nLnNveS5SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLnNveScsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cuc295LlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnNveS5SZW5kZXJlcicsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzb3kvc295LmpzJywgWydnb29nLnNveSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3NveV90ZXN0LmpzJywgWydnb29nLnNveVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc295JywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9zb3lfdGVzdGhlbHBlci5qcycsIFsnZ29vZy5zb3kudGVzdEhlbHBlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ3NzJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkVHJ1c3RlZFJlc291cmNlVXJpJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3BlbGwvc3BlbGxjaGVjay5qcycsIFsnZ29vZy5zcGVsbC5TcGVsbENoZWNrJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjay5Xb3JkQ2hhbmdlZEV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzcGVsbC9zcGVsbGNoZWNrX3Rlc3QuanMnLCBbJ2dvb2cuc3BlbGwuU3BlbGxDaGVja1Rlc3QnXSwgWydnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0YXRzL2Jhc2ljc3RhdC5qcycsIFsnZ29vZy5zdGF0cy5CYXNpY1N0YXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RhdHMvYmFzaWNzdGF0X3Rlc3QuanMnLCBbJ2dvb2cuc3RhdHMuQmFzaWNTdGF0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5zdGF0cy5CYXNpY1N0YXQnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy5Qc2V1ZG9SYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvY29sbGVjdGFibGVzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXInLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuRXhwaXJpbmdTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9jb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkNvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2NvbGxlY3RhYmxlc3RvcmFnZXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLmNvbGxlY3RhYmxlU3RvcmFnZVRlc3RlciddLCBbJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuYmFzZTY0JywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uU2VyaWFsaXplcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkVuY3J5cHRlZFN0b3JhZ2VUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXJyb3Jjb2RlLmpzJywgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9leHBpcmluZ3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXhwaXJpbmdzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2Vycm9yY29kZS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9lcnJvcmhhbmRsaW5nbWVjaGFuaXNtLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vZXJyb3JoYW5kbGluZ21lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc21UZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckhhbmRsaW5nTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXNlc3Npb25zdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVzZXNzaW9uc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVNlc3Npb25TdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVXZWJTdG9yYWdlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2lldXNlcmRhdGEuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pZXVzZXJkYXRhX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TZXBhcmF0aW9uVGVzdGVyJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2hhcmluZ1Rlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pdGVyYWJsZW1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaXRlcmFibGVtZWNoYW5pc210ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uaXRlcmFibGVNZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5NZWNoYW5pc20nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21mYWN0b3J5LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnknXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVTZXNzaW9uU3RvcmFnZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vbWVjaGFuaXNtZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnlUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21mYWN0b3J5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zZXBhcmF0aW9udGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zaGFyaW5ndGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc210ZXN0ZGVmaW5pdGlvbi5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLlByZWZpeGVkTWVjaGFuaXNtVGVzdCddLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TaGFyaW5nVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlLldyYXBwZXInXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2Uvc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2Uuc3RvcmFnZV90ZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2V0ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5zdG9yYWdlVGVzdGVyJ10sIFsnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9kZWZpbmVzLmpzJywgWydnb29nLnN0cmVhbXMuZGVmaW5lcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsJ10sIFsnZ29vZy5zdHJlYW1zLmRlZmluZXMnLCAnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCcsICdnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsSW1wbCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy5zdHJlYW1zLmZ1bGxUeXBlcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfaW1wbF90ZXN0LmpzJywgWydnb29nLnN0cmVhbXMuZnVsbEltcGxUZXN0J10sIFsnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsVGVzdENhc2VzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfbmF0aXZlX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMuZnVsbE5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmZ1bGxUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvZnVsbF90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJ10sIHsnbGFuZyc6ICdlczknLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX3R5cGVzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZS5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGUnXSwgWydnb29nLnN0cmVhbXMuZGVmaW5lcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJywgJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2xpdGVfaW1wbC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlcicsICdnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX2ltcGxfdGVzdC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsVGVzdCddLCBbJ2dvb2cuc3RyZWFtcy5saXRlSW1wbCcsICdnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnXSwgWydnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5saXRlTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90eXBlcy5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3QuanMnLCBbJ2dvb2cuc3RyaW5nLkNvbnN0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3RfdGVzdC5qcycsIFsnZ29vZy5zdHJpbmcuY29uc3RUZXN0J10sIFsnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9pbnRlcm5hbC5qcycsIFsnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL2xpbmtpZnkuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnknXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9saW5raWZ5X3Rlc3QuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5saW5raWZ5JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lcy5qcycsIFsnZ29vZy5zdHJpbmcubmV3bGluZXMnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMuTGluZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lc190ZXN0LmpzJywgWydnb29nLnN0cmluZy5uZXdsaW5lc1Rlc3QnXSwgWydnb29nLnN0cmluZy5uZXdsaW5lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhcnNlci5qcycsIFsnZ29vZy5zdHJpbmcuUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhdGguanMnLCBbJ2dvb2cuc3RyaW5nLnBhdGgnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvcGF0aF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5wYXRoVGVzdCddLCBbJ2dvb2cuc3RyaW5nLnBhdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9zdHJpbmcuanMnLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnXSwgWydnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ190ZXN0LmpzJywgWydnb29nLnN0cmluZ1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nYnVmZmVyLmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2J1ZmZlcl90ZXN0LmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXJUZXN0J10sIFsnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nZm9ybWF0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXQnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2Zvcm1hdF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXRUZXN0J10sIFsnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5naWZpZXIuanMnLCBbJ2dvb2cuc3RyaW5nLlN0cmluZ2lmaWVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3R5cGVkc3RyaW5nLmpzJywgWydnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvYXZsdHJlZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2F2bHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jaXJjdWxhcmJ1ZmZlci5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY2lyY3VsYXJidWZmZXJfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jb2xsZWN0aW9uLmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY29sbGVjdGlvbl90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvblRlc3QnXSwgWydnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2hlYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMuTm9kZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9oZWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuSGVhcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXBfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcFRlc3QnXSwgWydnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2xpbmtlZG1hcC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbGlua2VkbWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5MaW5rZWRNYXBUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbWFwLmpzJywgWydnb29nLnN0cnVjdHMuTWFwJ10sIFsnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL21hcF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuTWFwVGVzdCddLCBbJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9ub2RlLmpzJywgWydnb29nLnN0cnVjdHMuTm9kZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5zdHJ1Y3RzLlF1ZXVlJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUG9vbFRlc3QnXSwgWydnb29nLnN0cnVjdHMuUG9vbCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UG9vbCddLCBbJ2dvb2cuc3RydWN0cy5Qb29sJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlQb29sVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9wcmlvcml0eXF1ZXVlLmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlRdWV1ZSddLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UXVldWVUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3F1YWR0cmVlLmpzJywgWydnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLk5vZGUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLlBvaW50J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVhZHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWUuanMnLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1ZXVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXQuanMnLCBbJ2dvb2cuc3RydWN0cy5TZXQnXSwgWydnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc2ltcGxlcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RyaW5nc2V0LmpzJywgWydnb29nLnN0cnVjdHMuU3RyaW5nU2V0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zdHJpbmdzZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlN0cmluZ1NldFRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMuU3RyaW5nU2V0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3N0cnVjdHMuanMnLCBbJ2dvb2cuc3RydWN0cyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RydWN0c190ZXN0LmpzJywgWydnb29nLnN0cnVjdHNUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJlZW5vZGUuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RydWN0cy5Ob2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3RyZWVub2RlX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZVRlc3QnXSwgWydnb29nLnN0cnVjdHMuVHJlZU5vZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZV90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuVHJpZVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2JpZGkuanMnLCBbJ2dvb2cuc3R5bGUuYmlkaSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvYmlkaV90ZXN0LmpzJywgWydnb29nLnN0eWxlLmJpZGlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2N1cnNvci5qcycsIFsnZ29vZy5zdHlsZS5jdXJzb3InXSwgWydnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvY3Vyc29yX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuY3Vyc29yVGVzdCddLCBbJ2dvb2cuc3R5bGUuY3Vyc29yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZS5qcycsIFsnZ29vZy5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udmVuZG9yJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnN0eWxlX3Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbC5Vc2VyQWdlbnRzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfd2Via2l0X3Njcm9sbGJhcnNfdGVzdC5qcycsIFsnZ29vZy5zdHlsZS53ZWJraXRTY3JvbGxiYXJzVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGVTY3JvbGxiYXJUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3N0eWxlc2Nyb2xsYmFydGVzdGVyLmpzJywgWydnb29nLnN0eWxlU2Nyb2xsYmFyVGVzdGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS90cmFuc2Zvcm0uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNmb3JtJ10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zZm9ybVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy5zdHlsZS50cmFuc2Zvcm0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zaXRpb24uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNpdGlvbicsICdnb29nLnN0eWxlLnRyYW5zaXRpb24uQ3NzM1Byb3BlcnR5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zaXRpb25UZXN0J10sIFsnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RfbW9kdWxlLmpzJywgWydnb29nLnRlc3RfbW9kdWxlJ10sIFsnZ29vZy50ZXN0X21vZHVsZV9kZXAnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0X21vZHVsZV9kZXAuanMnLCBbJ2dvb2cudGVzdF9tb2R1bGVfZGVwJ10sIFtdLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0aW9uZmFpbHVyZS5qcycsIFsnZ29vZy50ZXN0aW5nLnNhZmUuYXNzZXJ0aW9uRmFpbHVyZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Fzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRvbScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sLmpzJywgWydnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbFRlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UuQ29udHJvbEJyZWFraW5nRXhjZXB0aW9uJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9hc3luY3Rlc3RjYXNlX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlQXN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jdGVzdGNhc2Vfbm9hc3luY190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVRlc3QnXSwgWydnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2JlbmNobWFyay5qcycsIFsnZ29vZy50ZXN0aW5nLmJlbmNobWFyayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2NvbnRpbnVhdGlvbnRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuQ29udGludWF0aW9uVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLkNvbnRpbnVhdGlvblRlc3QnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLlN0ZXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvY29udGludWF0aW9udGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Db250aW51YXRpb25UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kZWZlcnJlZHRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RlZmVycmVkdGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkRlZmVycmVkVGVzdENhc2VUZXN0J10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLk5vZGVJdGVyYXRvcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLml0ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nXSwgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvZG9tX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuZG9tVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2ZpZWxkbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL3Rlc3RoZWxwZXIuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy50ZXN0aW5nLmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvdGVzdGhlbHBlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50cy5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50c190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL21hdGNoZXJzLmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2V2ZW50cy9tYXRjaGVyc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL29ubGluZWhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0Lk5ldHdvcmtTdGF0dXNNb25pdG9yJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnRPYnNlcnZlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlcy5qcycsIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlc1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2Jsb2IuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LmJhc2U2NCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9ibG9iX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2RpcmVjdG9yeWVudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9lbnRyeS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cudGVzdGluZy5mcy5FbnRyeScsICdnb29nLnRlc3RpbmcuZnMuRmlsZUVudHJ5J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeUltcGwnLCAnZ29vZy5mcy5FbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZUVudHJ5JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2VudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5FbnRyeVRlc3QnXSwgWydnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGUnXSwgWydnb29nLnRlc3RpbmcuZnMuQmxvYiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxlZW50cnlfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVFbnRyeVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlRW50cnknLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZXJlYWRlci5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVyZWFkZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVzeXN0ZW0uanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJ10sIFsnZ29vZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyLmpzJywgWydnb29nLnRlc3RpbmcuZnMuRmlsZVdyaXRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcuZnMuRmlsZScsICdnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlU2F2ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnMuanMnLCBbJ2dvb2cudGVzdGluZy5mcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzVGVzdCddLCBbJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9pbnRlZ3JhdGlvbl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZnMuaW50ZWdyYXRpb25UZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVNhdmVyJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9wcm9ncmVzc2V2ZW50LmpzJywgWydnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Z1bmN0aW9ubW9jay5qcycsIFsnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2snLCAnZ29vZy50ZXN0aW5nLkdsb2JhbEZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTWV0aG9kTW9jayddLCBbJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnVuY3Rpb25tb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2dyYXBoaWNzLmpzJywgWydnb29nLnRlc3RpbmcuZ3JhcGhpY3MnXSwgWydnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzLmpzJywgWydnb29nLnRlc3RpbmcuaTE4bi5hc3NlcnRzJ10sIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5pMThuLmFzc2VydHNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmkxOG4uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkYXN5bmN3cmFwcGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZEFzeW5jV3JhcHBlciddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkdGVzdGNhc2VhZGFwdGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZFRlc3RDYXNlQWRhcHRlciddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Kc1RkQXN5bmNXcmFwcGVyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdC5qcycsIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdGV4Y2VwdGlvbi5qcycsIFsnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbiddLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2xvb3NlbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLkxvb3NlRXhwZWN0YXRpb25Db2xsZWN0aW9uJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbG9vc2Vtb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Mb29zZU1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJ10sIFsnZ29vZy5tZXNzYWdpbmcuQWJzdHJhY3RDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tZXNzYWdpbmcvbW9ja21lc3NhZ2VldmVudC5qcycsIFsnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZXBvcnQuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja1BvcnROZXR3b3JrJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydE5ldHdvcmsnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tFeHBlY3RhdGlvbiddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnByb21pc2UuUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZScsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Nb2NrRXhwZWN0YXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NsYXNzZmFjdG9yeS5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc1JlY29yZCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xhc3NmYWN0b3J5X3Rlc3QuanMnLCBbJ2Zha2UuQmFzZUNsYXNzJywgJ2Zha2UuQ2hpbGRDbGFzcycsICdnb29nLnRlc3RpbmcuTW9ja0NsYXNzRmFjdG9yeVRlc3QnXSwgWydnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2Nsb2NrLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xvY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbG9ja1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY29udHJvbC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NraW50ZXJmYWNlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZSddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrbWF0Y2hlcnMuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5JZ25vcmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkluc3RhbmNlT2YnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5PYmplY3RFcXVhbHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5SZWdleHBNYXRjaCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlNhdmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlR5cGVPZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja21hdGNoZXJzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb20uanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb21UZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3JhbmdlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlJ10sIFsnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5nZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2UuanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZSddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tTdG9yYWdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrdXNlcmFnZW50LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3VzZXJhZ2VudF90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbXVsdGl0ZXN0cnVubmVyLmpzJywgWydnb29nLnRlc3RpbmcuTXVsdGlUZXN0UnVubmVyJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXIuVGVzdEZyYW1lJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tdWx0aXRlc3RydW5uZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLnRlc3RpbmcubmV0Lk1vY2tJRnJhbWVJbyddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSWZyYW1lSW8nLCAnZ29vZy50ZXN0aW5nLlRlc3RRdWV1ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQveGhyaW8uanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuVGVzdFF1ZXVlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcubmV0LlhocklvVGVzdCddLCBbJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuSW5zdGFuY2VPZicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW9Qb29sJ10sIFsnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvb2JqZWN0cHJvcGVydHlzdHJpbmcuanMnLCBbJ2dvb2cudGVzdGluZy5PYmplY3RQcm9wZXJ0eVN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlLmpzJywgWydnb29nLnRlc3RpbmcucGFyYWxsZWxDbG9zdXJlVGVzdFN1aXRlJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cycsICdnb29nLmpzb24nLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wYXJhbGxlbENsb3N1cmVUZXN0U3VpdGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnBhcmFsbGVsQ2xvc3VyZVRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRhYmxlLmpzJywgWydnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BlcmZvcm1hbmNldGltZXIuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyLlRhc2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tYXRoJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRpbWVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlci5qcycsIFsnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvdG8yL3Byb3RvMi5qcycsIFsnZ29vZy50ZXN0aW5nLnByb3RvMiddLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuT2JqZWN0U2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wcm90bzIvcHJvdG8yX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wcm90bzJUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnByb3RvMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BzZXVkb3JhbmRvbS5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCBbJ2dvb2cuRGlzcG9zYWJsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wc2V1ZG9yYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbVRlc3QnXSwgWydnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uLmpzJywgWydnb29nLnRlc3RpbmcuRnVuY3Rpb25DYWxsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRDb25zdHJ1Y3RvcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvblRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkQ29uc3RydWN0b3InLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3NoYXJkaW5ndGVzdGNhc2UuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaGFyZGluZ3Rlc3RjYXNlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b24uanMnLCBbJ2dvb2cudGVzdGluZy5zaW5nbGV0b24nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b25fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnNpbmdsZXRvblRlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc2luZ2xldG9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0YWNrdHJhY2UuanMnLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJywgJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlLkZyYW1lJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RhY2t0cmFjZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZVRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZScsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZS5GcmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdG9yYWdlL2Zha2VtZWNoYW5pc20uanMnLCBbJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RyaWN0bW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5Nb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0cmljdG1vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3R5bGUvbGF5b3V0YXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlLmxheW91dGFzc2VydHMnXSwgWydnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9sYXlvdXRhc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5zdHlsZS5sYXlvdXRhc3NlcnRzVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3Rpbmcuc3R5bGUubGF5b3V0YXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZS5FcnJvcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuT3JkZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlLlJlc3VsdCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdENhc2VUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy5NZXRob2RNb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0cXVldWUuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RydW5uZXIuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuanNvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHJ1bm5lcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHN1aXRlLmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RzdWl0ZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHMuanMnLCBbJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnJlbmRlcmVyYXNzZXJ0c1Rlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3JlbmRlcmVyaGFybmVzcy5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3N0eWxlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy51aS5zdHlsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3RpbWVyL3RpbWVyLmpzJywgWydnb29nLlRpbWVyJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0aW1lci90aW1lcl90ZXN0LmpzJywgWydnb29nLlRpbWVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXMuanMnLCBbJ2dvb2cudHdlYWsuQmFzZUVudHJ5JywgJ2dvb2cudHdlYWsuQmFzZVByaW1pdGl2ZVNldHRpbmcnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXNfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5CYXNlRW50cnlUZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2Vhay50ZXN0aGVscGVycyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5LmpzJywgWydnb29nLnR3ZWFrLlJlZ2lzdHJ5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50d2Vhay5CYXNlUHJpbWl0aXZlU2V0dGluZycsICdnb29nLnR3ZWFrLkJhc2VTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cudHdlYWsuUmVnaXN0cnlUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdGVzdGhlbHBlcnMuanMnLCBbJ2dvb2cudHdlYWsudGVzdGhlbHBlcnMnXSwgWydnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuQm9vbGVhbkdyb3VwJywgJ2dvb2cudHdlYWsuQm9vbGVhbkluR3JvdXBTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5CdXR0b25BY3Rpb24nLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlJlZ2lzdHJ5JywgJ2dvb2cudHdlYWsuU3RyaW5nU2V0dGluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdHdlYWsuanMnLCBbJ2dvb2cudHdlYWsnLCAnZ29vZy50d2Vhay5Db25maWdQYXJhbXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5SZWdpc3RyeScsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWkuanMnLCBbJ2dvb2cudHdlYWsuRW50cmllc1BhbmVsJywgJ2dvb2cudHdlYWsuVHdlYWtVaSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLkJhc2VFbnRyeScsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWlfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5Ud2Vha1VpVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuVHdlYWtVaScsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWJzdHJhY3RzcGVsbGNoZWNrZXIuanMnLCBbJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlci5Bc3luY1Jlc3VsdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FjLmpzJywgWydnb29nLnVpLmFjJ10sIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5JbnB1dEhhbmRsZXInLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYWNfdGVzdC5qcycsIFsnZ29vZy51aS5hY1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNlbGVjdGlvbicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FycmF5bWF0Y2hlci5qcycsIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9hdXRvY29tcGxldGUuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlJywgJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXV0b2NvbXBsZXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbmRlck9wdGlvbnMnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2NhY2hpbmdtYXRjaGVyLmpzJywgWydnb29nLnVpLmFjLkNhY2hpbmdNYXRjaGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyJywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvY2FjaGluZ21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy51aS5hYy5DYWNoaW5nTWF0Y2hlclRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuQ2FjaGluZ01hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9pbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLnVpLmFjLklucHV0SGFuZGxlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2VsZWN0aW9uJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbW90ZS5qcycsIFsnZ29vZy51aS5hYy5SZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbW90ZUFycmF5TWF0Y2hlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvcmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5SZW1vdGVBcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW5kZXJlci5qcycsIFsnZ29vZy51aS5hYy5SZW5kZXJlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyLkN1c3RvbVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguZG9tLkZhZGVJbkFuZFNob3cnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5kb20uRmFkZUluQW5kU2hvdycsICdnb29nLmZ4LmRvbS5GYWRlT3V0QW5kSGlkZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcm9wdGlvbnMuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hpbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlciddLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlLmpzJywgWydnb29nLnVpLmFjLlJpY2hSZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLlJlbW90ZScsICdnb29nLnVpLmFjLlJlbmRlcmVyJywgJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJpY2hSZW1vdGVBcnJheU1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hyZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlclRlc3QnXSwgWydnb29nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjdGl2aXR5bW9uaXRvci5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FkdmFuY2VkdG9vbHRpcC5qcycsIFsnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWR2YW5jZWR0b29sdGlwX3Rlc3QuanMnLCBbJ2dvb2cudWkuQWR2YW5jZWRUb29sdGlwVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFkdmFuY2VkVG9vbHRpcCcsICdnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5LmpzJywgWydnb29nLnVpLkFuaW1hdGVkWmlwcHknXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZWFzaW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuQW5pbWF0ZWRaaXBweVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFuaW1hdGVkWmlwcHknLCAnZ29vZy51aS5aaXBweSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2F0dGFjaGFibGVtZW51LmpzJywgWydnb29nLnVpLkF0dGFjaGFibGVNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JdGVtRXZlbnQnLCAnZ29vZy51aS5NZW51QmFzZScsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0LmpzJywgWydnb29nLnVpLkJpZGlJbnB1dCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0X3Rlc3QuanMnLCBbJ2dvb2cudWkuQmlkaUlucHV0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5CaWRpSW5wdXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idWJibGUuanMnLCBbJ2dvb2cudWkuQnViYmxlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzb2x1dGVQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b24uanMnLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uLlNpZGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25fdGVzdC5qcycsIFsnZ29vZy51aS5CdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk5hdGl2ZUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2J1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25zaWRlLmpzJywgWydnb29nLnVpLkJ1dHRvblNpZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jaGFyY291bnRlci5qcycsIFsnZ29vZy51aS5DaGFyQ291bnRlcicsICdnb29nLnVpLkNoYXJDb3VudGVyLkRpc3BsYXknXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJjb3VudGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hhckNvdW50ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNoYXJDb3VudGVyJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hhcnBpY2tlci5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5zdHJ1Y3RzLlNldCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInLCAnZ29vZy51aS5GbGF0QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Ib3ZlckNhcmQnLCAnZ29vZy51aS5MYWJlbElucHV0JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRvb2x0aXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGFyUGlja2VyJywgJ2dvb2cudWkuRmxhdEJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3guanMnLCBbJ2dvb2cudWkuQ2hlY2tib3gnLCAnZ29vZy51aS5DaGVja2JveC5TdGF0ZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hlY2tib3hUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGVja2JveCcsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51aS5kZWNvcmF0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94bWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuQ2hlY2tCb3hNZW51SXRlbSddLCBbJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3hyZW5kZXJlci5qcycsIFsnZ29vZy51aS5DaGVja2JveFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JNZW51QnV0dG9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuUmVuZGVyZXJIYXJuZXNzJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b24nLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ycGFsZXR0ZS5qcycsIFsnZ29vZy51aS5Db2xvclBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuUGFsZXR0ZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29sb3JQYWxldHRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuQ29sb3JQaWNrZXInLCAnZ29vZy51aS5Db2xvclBpY2tlci5FdmVudFR5cGUnXSwgWydnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tYm9ib3guanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3gnLCAnZ29vZy51aS5Db21ib0JveEl0ZW0nXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubG9nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkl0ZW1FdmVudCcsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbWJvYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3hUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21ib0JveCcsICdnb29nLnVpLkNvbWJvQm94SXRlbScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnQuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50LkVycm9yJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tcG9uZW50X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnR1dGlsLmpzJywgWydnb29nLnVpLkNvbXBvbmVudFV0aWwnXSwgWydnb29nLmV2ZW50cy5Nb3VzZUFzTW91c2VFdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VFdmVudHMnLCAnZ29vZy5ldmVudHMuUG9pbnRlckFzTW91c2VFdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbXBvbmVudHV0aWxfdGVzdC5qcycsIFsnZ29vZy51aS5Db21wb25lbnRVdGlsVGVzdCddLCBbJ2dvb2cuZXZlbnRzLk1vdXNlQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRhaW5lci5qcycsIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Db250YWluZXIuRXZlbnRUeXBlJywgJ2dvb2cudWkuQ29udGFpbmVyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db21wb25lbnRVdGlsJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51aS5Db250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUV2ZW50JywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRyb2wnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udGFpbmVycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJTY3JvbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRhaW5lclNjcm9sbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9sLmpzJywgWydnb29nLnVpLkNvbnRyb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2xDb250ZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS5Db250cm9sVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udHJvbGNvbnRlbnQuanMnLCBbJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9scmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRyb2xSZW5kZXJlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb29raWVlZGl0b3IuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LmNvb2tpZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29va2llZWRpdG9yX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5jb29raWVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvb2tpZUVkaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NzczNidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3NzM21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Nzc25hbWVzLmpzJywgWydnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b24uanMnLCBbJ2dvb2cudWkuQ3VzdG9tQnV0dG9uJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21jb2xvcnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlJ10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3VzdG9tY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DdXN0b21Db2xvclBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyLmpzJywgWydnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5EYXRlUGlja2VyLkV2ZW50cycsICdnb29nLnVpLkRhdGVQaWNrZXJFdmVudCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuRGVmYXVsdERhdGVQaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLklkR2VuZXJhdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuRGF0ZVBpY2tlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGF0ZVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RhdGVwaWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EYXRlUGlja2VyUmVuZGVyZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWNvcmF0ZS5qcycsIFsnZ29vZy51aS5kZWNvcmF0ZSddLCBbJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RlY29yYXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZGVjb3JhdGVUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmRlY29yYXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWZhdWx0ZGF0ZXBpY2tlcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkRlZmF1bHREYXRlUGlja2VyUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuRGF0ZVBpY2tlclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2cuanMnLCBbJ2dvb2cudWkuRGlhbG9nJywgJ2dvb2cudWkuRGlhbG9nLkJ1dHRvblNldCcsICdnb29nLnVpLkRpYWxvZy5CdXR0b25TZXQuRGVmYXVsdEJ1dHRvbnMnLCAnZ29vZy51aS5EaWFsb2cuRGVmYXVsdEJ1dHRvbkNhcHRpb25zJywgJ2dvb2cudWkuRGlhbG9nLkRlZmF1bHRCdXR0b25LZXlzJywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50JywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50VHlwZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Nb2RhbFBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2dfdGVzdC5qcycsIFsnZ29vZy51aS5EaWFsb2dUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5jc3MzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RpbWVuc2lvbnBpY2tlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXInXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLkFubm91bmNlcicsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkRpbWVuc2lvblBpY2tlclJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmFycmF5JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kcmFnZHJvcGRldGVjdG9yLmpzJywgWydnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3InLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkV2ZW50VHlwZScsICdnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3IuSW1hZ2VEcm9wRXZlbnQnLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkxpbmtEcm9wRXZlbnQnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RyaWxsZG93bnJvdy5qcycsIFsnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZHJpbGxkb3ducm93X3Rlc3QuanMnLCBbJ2dvb2cudWkuRHJpbGxkb3duUm93VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYWJzdHJhY3RkaWFsb2cuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nLkJ1aWxkZXInLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cuRXZlbnRUeXBlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cmluZycsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL2Fic3RyYWN0ZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9idWJibGUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm9iamVjdCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvd1N0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYnViYmxlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9kZWZhdWx0dG9vbGJhci5qcycsIFsnZ29vZy51aS5lZGl0b3IuQnV0dG9uRGVzY3JpcHRvcicsICdnb29nLnVpLmVkaXRvci5EZWZhdWx0VG9vbGJhciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nLmpzJywgWydnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cuQmVmb3JlVGVzdExpbmtFdmVudCcsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLkV2ZW50VHlwZScsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLk9rRXZlbnQnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTGlua0J1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2dUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLm1lc3NhZ2VzJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL21lc3NhZ2VzLmpzJywgWydnb29nLnVpLmVkaXRvci5tZXNzYWdlcyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyY29udHJvbGxlci5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckNvbnRyb2xsZXInXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyZmFjdG9yeS5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuT3B0aW9uJywgJ2dvb2cudWkuVG9vbGJhcicsICdnb29nLnVpLlRvb2xiYXJCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyQ29sb3JNZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInLCAnZ29vZy51aS5Ub29sYmFyU2VsZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvdG9vbGJhcmZhY3RvcnlfdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Vtb2ppcGFsZXR0ZS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSW1hZ2VMb2FkZXInLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuZW1vamkuRW1vamknLCAnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuRW1vamlQYWxldHRlUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLmVtb2ppLkVtb2ppJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaXBpY2tlci5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYlBhbmUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJywgJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Zhc3Rfbm9ucHJvZ3Jlc3NpdmVfZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5GYXN0Tm9uUHJvZ3Jlc3NpdmVFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudWkuZW1vamkuRW1vamlQaWNrZXInLCAnZ29vZy51aS5lbW9qaS5TcHJpdGVJbmZvJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZmFzdF9wcm9ncmVzc2l2ZV9lbW9qaXBpY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLkZhc3RQcm9ncmVzc2l2ZUVtb2ppUGlja2VyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3BvcHVwZW1vamlwaWNrZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9wb3B1cGVtb2ppcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3Byb2dyZXNzaXZlZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9zcHJpdGVpbmZvLmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvc3ByaXRlaW5mb190ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm9UZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnUuanMnLCBbJ2dvb2cudWkuRmlsdGVyZWRNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkZpbHRlck9ic2VydmluZ01lbnVJdGVtJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5GaWx0ZXJlZE1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRmlsdGVyZWRNZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJvYnNlcnZpbmdtZW51aXRlbS5qcycsIFsnZ29vZy51aS5GaWx0ZXJPYnNlcnZpbmdNZW51SXRlbSddLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZpbHRlcm9ic2VydmluZ21lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlciddLCBbJ2dvb2cudWkuTWVudUl0ZW1SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZmxhdGJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZsYXRtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmxhdE1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9mb3JtcG9zdC5qcycsIFsnZ29vZy51aS5Gb3JtUG9zdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Zvcm1wb3N0X3Rlc3QuanMnLCBbJ2dvb2cudWkuRm9ybVBvc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Gb3JtUG9zdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2UuanMnLCBbJ2dvb2cudWkuR2F1Z2UnLCAnZ29vZy51aS5HYXVnZUNvbG9yZWRSYW5nZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmVhc2luZycsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5tYXRoJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuR2F1Z2VUaGVtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2V0aGVtZS5qcycsIFsnZ29vZy51aS5HYXVnZVRoZW1lJ10sIFsnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaG92ZXJjYXJkLmpzJywgWydnb29nLnVpLkhvdmVyQ2FyZCcsICdnb29nLnVpLkhvdmVyQ2FyZC5FdmVudFR5cGUnLCAnZ29vZy51aS5Ib3ZlckNhcmQuVHJpZ2dlckV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51aS5Ub29sdGlwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9ob3ZlcmNhcmRfdGVzdC5qcycsIFsnZ29vZy51aS5Ib3ZlckNhcmRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSG92ZXJDYXJkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2YXBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3IuYWxwaGEnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkhzdlBhbGV0dGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdmFwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvci5hbHBoYScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Ic3ZhUGFsZXR0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2UGFsZXR0ZSddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2cGFsZXR0ZV90ZXN0LmpzJywgWydnb29nLnVpLkhzdlBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Ic3ZQYWxldHRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWRnZW5lcmF0b3IuanMnLCBbJ2dvb2cudWkuSWRHZW5lcmF0b3InXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXIuanMnLCBbJ2dvb2cudWkuSWRsZVRpbWVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXJfdGVzdC5qcycsIFsnZ29vZy51aS5JZGxlVGltZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSWRsZVRpbWVyJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lmcmFtZW1hc2suanMnLCBbJ2dvb2cudWkuSWZyYW1lTWFzayddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWZyYW1lbWFza190ZXN0LmpzJywgWydnb29nLnVpLklmcmFtZU1hc2tUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pZnJhbWUnLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5JZnJhbWVNYXNrJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pbWFnZWxlc3NidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ltYWdlbGVzc21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lucHV0ZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5JbnB1dERhdGVQaWNrZXInXSwgWydnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGFyc2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVpLlBvcHVwRGF0ZVBpY2tlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaW5wdXRkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaXRlbWV2ZW50LmpzJywgWydnb29nLnVpLkl0ZW1FdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZGV2ZW50ZGF0YS5qcycsIFsnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZHNob3J0Y3V0aGFuZGxlci5qcycsIFsnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0RXZlbnQnLCAnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0SGFuZGxlcicsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLkV2ZW50VHlwZScsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLk1vZGlmaWVycyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleU5hbWVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YScsICdnb29nLnVpLlN5bnRoZXRpY0tleWJvYXJkRXZlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2tleWJvYXJkc2hvcnRjdXRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9sYWJlbGlucHV0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbGFiZWxpbnB1dF90ZXN0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXRUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2xpbmtidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5MaW5rQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9mbGFzaG9iamVjdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0LlNjcmlwdEFjY2Vzc0xldmVsJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cubG9nJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxhc2hvYmplY3RfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyLmpzJywgWydnb29nLnVpLm1lZGlhLkZsaWNrclNldCcsICdnb29nLnVpLm1lZGlhLkZsaWNrclNldE1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0TW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvLmpzJywgWydnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvJywgJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9Nb2RlbCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5Hb29nbGVWaWRlbycsICdnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYV90ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYW1vZGVsLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNhdGVnb3J5JywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNyZWRpdC5Sb2xlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQuU2NoZW1lJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5NZWRpdW0nLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLk1pbWVUeXBlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5QbGF5ZXInLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLlN1YlRpdGxlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5UaHVtYm5haWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvbXAzLmpzJywgWydnb29nLnVpLm1lZGlhLk1wMyddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21wM190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1wM1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1wMyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3Bob3RvLmpzJywgWydnb29nLnVpLm1lZGlhLlBob3RvJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGhvdG9fdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5QaG90b1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuUGhvdG8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9waWNhc2EuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhQWxidW0nLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bU1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGljYXNhX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bScsICdnb29nLnVpLm1lZGlhLlBpY2FzYUFsYnVtTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lby5qcycsIFsnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgWydnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lb190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLlZpbWVvVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS95b3V0dWJlLmpzJywgWydnb29nLnVpLm1lZGlhLllvdXR1YmUnLCAnZ29vZy51aS5tZWRpYS5Zb3V0dWJlTW9kZWwnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3lvdXR1YmVfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5Zb3V0dWJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuWW91dHViZScsICdnb29nLnVpLm1lZGlhLllvdXR1YmVNb2RlbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnUuanMnLCBbJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnUuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLk1lbnVIZWFkZXInLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YmFyLmpzJywgWydnb29nLnVpLm1lbnVCYXInXSwgWydnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLk1lbnVCYXJSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWJhcmRlY29yYXRvci5qcycsIFsnZ29vZy51aS5tZW51QmFyRGVjb3JhdG9yJ10sIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInLCAnZ29vZy51aS5tZW51QmFyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXNlLmpzJywgWydnb29nLnVpLk1lbnVCYXNlJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b24uanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklkR2VuZXJhdG9yJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuU3ViTWVudScsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9uX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlN1Yk1lbnUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9ucmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVoZWFkZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlciddLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLk1lbnVIZWFkZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aGVhZGVycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlclJlbmRlcmVyJ10sIFsnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtLmpzJywgWydnb29nLnVpLk1lbnVJdGVtJ10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUl0ZW1UZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aXRlbXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWl0ZW1yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5Db250YWluZXJSZW5kZXJlcicsICdnb29nLnVpLlNlcGFyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yJ10sIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51c2VwYXJhdG9ycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2NrYWN0aXZpdHltb25pdG9yLmpzJywgWydnb29nLnVpLk1vY2tBY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vY2thY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5Nb2NrQWN0aXZpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFsYXJpYXZpc2liaWxpdHloZWxwZXIuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2RhbGFyaWF2aXNpYmlsaXR5aGVscGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFscG9wdXAuanMnLCBbJ2dvb2cudWkuTW9kYWxQb3B1cCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlcicsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbW9kYWxwb3B1cF90ZXN0LmpzJywgWydnb29nLnVpLk1vZGFsUG9wdXBUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kaXNwb3NlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1vZGFsUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9uYXRpdmVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL25hdGl2ZWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTmF0aXZlQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL29wdGlvbi5qcycsIFsnZ29vZy51aS5PcHRpb24nXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BhbGV0dGUuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlSXRlcmF0b3InLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uZGF0YXNldCcsICdnb29nLml0ZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGFsZXR0ZXJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGxhaW50ZXh0c3BlbGxjaGVja2VyLmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BsYWludGV4dHNwZWxsY2hlY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwLmpzJywgWydnb29nLnVpLlBvcHVwJ10sIFsnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cFRlc3QnXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wb3B1cGJhc2UuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBCYXNlLkV2ZW50VHlwZScsICdnb29nLnVpLlBvcHVwQmFzZS5UeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cENvbG9yUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5Qb3B1cERhdGVQaWNrZXInXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51LmpzJywgWydnb29nLnVpLlBvcHVwTWVudSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuTW91c2VCdXR0b24nLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51X3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBNZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wcm9ncmVzc2Jhci5qcycsIFsnZ29vZy51aS5Qcm9ncmVzc0JhcicsICdnb29nLnVpLlByb2dyZXNzQmFyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlJhbmdlTW9kZWwnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdC5qcycsIFsnZ29vZy51aS5Qcm9tcHQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdF90ZXN0LmpzJywgWydnb29nLnVpLlByb21wdFRlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJpZGlJbnB1dCcsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlByb21wdCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmFuZ2Vtb2RlbC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JhbmdlbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmF0aW5ncy5qcycsIFsnZ29vZy51aS5SYXRpbmdzJywgJ2dvb2cudWkuUmF0aW5ncy5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JlZ2lzdHJ5LmpzJywgWydnb29nLnVpLnJlZ2lzdHJ5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmVnaXN0cnlfdGVzdC5qcycsIFsnZ29vZy51aS5yZWdpc3RyeVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yaWNodGV4dHNwZWxsY2hlY2tlci5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwTWVudSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmljaHRleHRzcGVsbGNoZWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLm9iamVjdCcsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JvdW5kZWRwYW5lbC5qcycsIFsnZ29vZy51aS5CYXNlUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuQ3NzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuR3JhcGhpY3NSb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwuQ29ybmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yb3VuZGVkcGFuZWxfdGVzdC5qcycsIFsnZ29vZy51aS5Sb3VuZGVkUGFuZWxUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNzc1JvdW5kZWRQYW5lbCcsICdnb29nLnVpLkdyYXBoaWNzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuUm91bmRlZFBhbmVsJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcm91bmRlZHRhYnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlJvdW5kZWRUYWJSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyLmpzJywgWydnb29nLnVpLlNjcm9sbEZsb2F0ZXInLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2Nyb2xsRmxvYXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0LmpzJywgWydnb29nLnVpLlNlbGVjdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdF90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdFRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TZWxlY3QnLCAnZ29vZy51aS5TZXBhcmF0b3InXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZWxlY3Rpb25tZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b24nLCAnZ29vZy51aS5TZWxlY3Rpb25NZW51QnV0dG9uLlNlbGVjdGlvblN0YXRlJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0aW9ubWVudWJ1dHRvbl90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VsZWN0aW9uTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2VsZWN0aW9uTW9kZWxUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VwYXJhdG9yLmpzJywgWydnb29nLnVpLlNlcGFyYXRvciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VydmVyY2hhcnQuanMnLCBbJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5DaGFydFR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCcsICdnb29nLnVpLlNlcnZlckNoYXJ0LkxlZ2VuZFBvc2l0aW9uJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZScsICdnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuVXJpVG9vTG9uZ0V2ZW50J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZXJ2ZXJjaGFydF90ZXN0LmpzJywgWydnb29nLnVpLlNlcnZlckNoYXJ0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NsaWRlci5qcycsIFsnZ29vZy51aS5TbGlkZXInLCAnZ29vZy51aS5TbGlkZXIuT3JpZW50YXRpb24nXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5TbGlkZXJCYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlLmpzJywgWydnb29nLnVpLlNsaWRlckJhc2UnLCAnZ29vZy51aS5TbGlkZXJCYXNlLkFuaW1hdGlvbkZhY3RvcnknLCAnZ29vZy51aS5TbGlkZXJCYXNlLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuZnguQW5pbWF0aW9uUGFyYWxsZWxRdWV1ZScsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZG9tLlJlc2l6ZUhlaWdodCcsICdnb29nLmZ4LmRvbS5SZXNpemVXaWR0aCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2xpZGVyQmFzZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NwbGl0cGFuZS5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmUnLCAnZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zcGxpdHBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU3BsaXRQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL2J1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9tZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuc3R5bGUuYXBwLkJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zdHlsZS9hcHAvbWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5zdHlsZS5hcHAuTWVudUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5QcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuc3R5bGUnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudS5qcycsIFsnZ29vZy51aS5TdWJNZW51J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51UmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudV90ZXN0LmpzJywgWydnb29nLnVpLlN1Yk1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51JywgJ2dvb2cudWkuU3ViTWVudVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLlN1Yk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N5bnRoZXRpY2tleWJvYXJkZXZlbnQuanMnLCBbJ2dvb2cudWkuU3ludGhldGljS2V5Ym9hcmRFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudWkuS2V5Ym9hcmRFdmVudERhdGEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYi5qcycsIFsnZ29vZy51aS5UYWInXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYlJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFyLmpzJywgWydnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhci5Mb2NhdGlvbiddLCBbJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYkJhclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJCYXJSZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyLmpzJywgWydnb29nLnVpLlRhYmxlU29ydGVyJywgJ2dvb2cudWkuVGFibGVTb3J0ZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFibGVTb3J0ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuVGFiUGFuZScsICdnb29nLnVpLlRhYlBhbmUuRXZlbnRzJywgJ2dvb2cudWkuVGFiUGFuZS5UYWJMb2NhdGlvbicsICdnb29nLnVpLlRhYlBhbmUuVGFiUGFnZScsICdnb29nLnVpLlRhYlBhbmVFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJQYW5lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFicmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVGFiJywgJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90ZXh0YXJlYS5qcycsIFsnZ29vZy51aS5UZXh0YXJlYScsICdnb29nLnVpLlRleHRhcmVhLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFfdGVzdC5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRleHRhcmVhJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFyZW5kZXJlci5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVJlbmRlcmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhci5qcycsIFsnZ29vZy51aS5Ub29sYmFyJ10sIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ub29sYmFyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRvb2xiYXInLCAnZ29vZy51aS5Ub29sYmFyTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b24uanMnLCBbJ2dvb2cudWkuVG9vbGJhckJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhckJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Ub29sYmFyQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkN1c3RvbUJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b24nXSwgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcmNvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcycsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uJ10sIFsnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lclJlbmRlcmVyJywgJ2dvb2cudWkuU2VwYXJhdG9yJywgJ2dvb2cudWkuVG9vbGJhclNlcGFyYXRvclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyc2VsZWN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZWxlY3QnXSwgWydnb29nLnVpLlNlbGVjdCcsICdnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yJ10sIFsnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJzZXBhcmF0b3JyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuSU5MSU5FX0JMT0NLX0NMQVNTTkFNRScsICdnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFydG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJUb2dnbGVCdXR0b24nXSwgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sdGlwLmpzJywgWydnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51aS5Ub29sdGlwLkN1cnNvclRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuRWxlbWVudFRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuU3RhdGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbHRpcF90ZXN0LmpzJywgWydnb29nLnVpLlRvb2x0aXBUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvYmFzZW5vZGUuanMnLCBbJ2dvb2cudWkudHJlZS5CYXNlTm9kZScsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS9iYXNlbm9kZV90ZXN0LmpzJywgWydnb29nLnVpLnRyZWUuQmFzZU5vZGVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJywgJ2dvb2cudWkudHJlZS5UcmVlTm9kZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2wuanMnLCBbJ2dvb2cudWkudHJlZS5UcmVlQ29udHJvbCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVOb2RlJywgJ2dvb2cudWkudHJlZS5UeXBlQWhlYWQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVDb250cm9sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS90cmVlbm9kZS5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVOb2RlJ10sIFsnZ29vZy51aS50cmVlLkJhc2VOb2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmVlL3R5cGVhaGVhZC5qcycsIFsnZ29vZy51aS50cmVlLlR5cGVBaGVhZCcsICdnb29nLnVpLnRyZWUuVHlwZUFoZWFkLk9mZnNldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHlwZWFoZWFkX3Rlc3QuanMnLCBbJ2dvb2cudWkudHJlZS5UeXBlQWhlYWRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLnRyZWUuVHJlZUNvbnRyb2wnLCAnZ29vZy51aS50cmVlLlR5cGVBaGVhZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyaXN0YXRlbWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW0uU3RhdGUnXSwgWydnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmlzdGF0ZW1lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbVJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3R3b3RodW1ic2xpZGVyLmpzJywgWydnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuU2xpZGVyQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHdvdGh1bWJzbGlkZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ud29UaHVtYlNsaWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvemlwcHkuanMnLCBbJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweS5FdmVudHMnLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3ppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuWmlwcHlUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuWmlwcHknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXJpLmpzJywgWydnb29nLlVyaScsICdnb29nLlVyaS5RdWVyeURhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCcsICdnb29nLnVyaS51dGlscy5TdGFuZGFyZFF1ZXJ5UGFyYW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91cmlfdGVzdC5qcycsIFsnZ29vZy5VcmlUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91dGlscy5qcycsIFsnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXgnLCAnZ29vZy51cmkudXRpbHMuUXVlcnlBcnJheScsICdnb29nLnVyaS51dGlscy5RdWVyeVZhbHVlJywgJ2dvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXRpbHNfdGVzdC5qcycsIFsnZ29vZy51cmkudXRpbHNUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVyaS51dGlscyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlci5qcycsIFsnZ29vZy51c2VyQWdlbnQuYWRvYmVSZWFkZXInXSwgWydnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlcl90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5hZG9iZVJlYWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmFkb2JlUmVhZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L2ZsYXNoLmpzJywgWydnb29nLnVzZXJBZ2VudC5mbGFzaCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvZmxhc2hfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuZmxhc2hUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9pcGhvdG8uanMnLCBbJ2dvb2cudXNlckFnZW50LmlwaG90byddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5qc2NyaXB0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9rZXlib2FyZC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmQnXSwgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQva2V5Ym9hcmRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmRUZXN0J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcGxhdGZvcm0uanMnLCBbJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdC5qcycsIFsnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF9pc3ZlcnNpb24uanMnLCBbJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wcm9kdWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnQuanMnLCBbJ2dvb2cudXNlckFnZW50J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudF9xdWlya3NfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRRdWlya3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudHRlc3R1dGlsLmpzJywgWydnb29nLnVzZXJBZ2VudFRlc3RVdGlsJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwuVXNlckFnZW50cyddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDMyYXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQzMmFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDY0YXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQ2NGFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzLmpzJywgWydnb29nLnZlYy5NYXQzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLk1hdDNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5NYXQzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkLmpzJywgWydnb29nLnZlYy5tYXQzZCcsICdnb29nLnZlYy5tYXQzZC5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMudmVjM2QuVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDNkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMubWF0M2QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2YuanMnLCBbJ2dvb2cudmVjLm1hdDNmJywgJ2dvb2cudmVjLm1hdDNmLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2ZfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0M2ZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5tYXQzZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQ0LmpzJywgWydnb29nLnZlYy5NYXQ0J10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuVmVjMycsICdnb29nLnZlYy5WZWM0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NF90ZXN0LmpzJywgWydnb29nLnZlYy5NYXQ0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5WZWMzJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGQuanMnLCBbJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLm1hdDRkLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGRfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0NGRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmLmpzJywgWydnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy5tYXQ0Zi5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9xdWF0ZXJuaW9uLmpzJywgWydnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlF1YXRlcm5pb24uQW55VHlwZSddLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMuVmVjNCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3F1YXRlcm5pb25fdGVzdC5qcycsIFsnZ29vZy52ZWMuUXVhdGVybmlvblRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLk1hdDMnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMudmVjM2YnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5LmpzJywgWydnb29nLnZlYy5SYXknXSwgWydnb29nLnZlYy5WZWMzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLlJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMuanMnLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLkFueVR5cGUnLCAnZ29vZy52ZWMuQXJyYXlUeXBlJywgJ2dvb2cudmVjLkZsb2F0MzInLCAnZ29vZy52ZWMuRmxvYXQ2NCcsICdnb29nLnZlYy5OdW1iZXInXSwgWydnb29nLnZlYy5GbG9hdDMyQXJyYXknLCAnZ29vZy52ZWMuRmxvYXQ2NEFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMi5qcycsIFsnZ29vZy52ZWMuVmVjMiddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMl90ZXN0LmpzJywgWydnb29nLnZlYy5WZWMyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuVmVjMiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZC5qcycsIFsnZ29vZy52ZWMudmVjMmQnLCAnZ29vZy52ZWMudmVjMmQuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmRfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZi5qcycsIFsnZ29vZy52ZWMudmVjMmYnLCAnZ29vZy52ZWMudmVjMmYuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmZfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzLmpzJywgWydnb29nLnZlYy5WZWMzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLlZlYzNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5WZWMzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNkLmpzJywgWydnb29nLnZlYy52ZWMzZCcsICdnb29nLnZlYy52ZWMzZC5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZF90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNmLmpzJywgWydnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZl90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZlRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNmJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzQuanMnLCBbJ2dvb2cudmVjLlZlYzQnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRfdGVzdC5qcycsIFsnZ29vZy52ZWMuVmVjNFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGQuanMnLCBbJ2dvb2cudmVjLnZlYzRkJywgJ2dvb2cudmVjLnZlYzRkLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGYuanMnLCBbJ2dvb2cudmVjLnZlYzRmJywgJ2dvb2cudmVjLnZlYzRmLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGYnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3ZWJnbC93ZWJnbC5qcycsIFsnZ29vZy53ZWJnbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3dpbmRvdy93aW5kb3cuanMnLCBbJ2dvb2cud2luZG93J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3aW5kb3cvd2luZG93X3Rlc3QuanMnLCBbJ2dvb2cud2luZG93VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cud2luZG93J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9iYXNlLmpzCmZ1bmN0aW9uIHdhKGIpe3ZhciBkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQ8Yi5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6YltkKytdfTp7ZG9uZTohMH19fWZ1bmN0aW9uIGdiKGIpe3JldHVybntuZXh0OndhKGIpfX1mdW5jdGlvbiBsYihiKXt2YXIgZD0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZiW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGQ/ZC5jYWxsKGIpOmdiKGIpfXZhciB3Yj1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09Yj9iOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmJ9KHRoaXMpLFJiPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2IhPUFycmF5LnByb3RvdHlwZSYmYiE9T2JqZWN0LnByb3RvdHlwZSYmKGJbZF09Zi52YWx1ZSl9OwpmdW5jdGlvbiBVYihiLGQpe2lmKGQpe3ZhciBmPXdiO2I9Yi5zcGxpdCgiLiIpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGgtMTtoKyspe3ZhciBrPWJbaF07ayBpbiBmfHwoZltrXT17fSk7Zj1mW2tdfWI9YltiLmxlbmd0aC0xXTtoPWZbYl07ZD1kKGgpO2QhPWgmJm51bGwhPWQmJlJiKGYsYix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmR9KX19ClViKCJQcm9taXNlIixmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHApe3RoaXMuc3RhdGVfPTA7dGhpcy5yZXN1bHRfPXZvaWQgMDt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189W107dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwKG0ucmVzb2x2ZSxtLnJlamVjdCl9Y2F0Y2gobil7bS5yZWplY3Qobil9fWZ1bmN0aW9uIGYoKXt0aGlzLmJhdGNoXz1udWxsfWZ1bmN0aW9uIGgocCl7c3dpdGNoKHR5cGVvZiBwKXtjYXNlICJvYmplY3QiOnJldHVybiBudWxsIT1wO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBrKHApe3JldHVybiBwIGluc3RhbmNlb2YgZD9wOm5ldyBkKGZ1bmN0aW9uKG0pe20ocCl9KX1pZihiKXJldHVybiBiO2YucHJvdG90eXBlLmFzeW5jRXhlY3V0ZT1mdW5jdGlvbihwKXtpZihudWxsPT10aGlzLmJhdGNoXyl7dGhpcy5iYXRjaF89W107dmFyIG09dGhpczt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7bS5leGVjdXRlQmF0Y2hfKCl9KX10aGlzLmJhdGNoXy5wdXNoKHApfTsKdmFyIHQ9d2Iuc2V0VGltZW91dDtmLnByb3RvdHlwZS5hc3luY0V4ZWN1dGVGdW5jdGlvbj1mdW5jdGlvbihwKXt0KHAsMCl9O2YucHJvdG90eXBlLmV4ZWN1dGVCYXRjaF89ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYmF0Y2hfJiZ0aGlzLmJhdGNoXy5sZW5ndGg7KXt2YXIgcD10aGlzLmJhdGNoXzt0aGlzLmJhdGNoXz1bXTtmb3IodmFyIG09MDttPHAubGVuZ3RoOysrbSl7dmFyIG49cFttXTtwW21dPW51bGw7dHJ5e24oKX1jYXRjaChxKXt0aGlzLmFzeW5jVGhyb3dfKHEpfX19dGhpcy5iYXRjaF89bnVsbH07Zi5wcm90b3R5cGUuYXN5bmNUaHJvd189ZnVuY3Rpb24ocCl7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3Rocm93IHA7fSl9O2QucHJvdG90eXBlLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChxKXtyZXR1cm4gZnVuY3Rpb24odSl7bnx8KG49ITAscS5jYWxsKG0sdSkpfX12YXIgbT10aGlzLG49ITE7cmV0dXJue3Jlc29sdmU6cCh0aGlzLnJlc29sdmVUb18pLApyZWplY3Q6cCh0aGlzLnJlamVjdF8pfX07ZC5wcm90b3R5cGUucmVzb2x2ZVRvXz1mdW5jdGlvbihwKXtwPT09dGhpcz90aGlzLnJlamVjdF8obmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTpwIGluc3RhbmNlb2YgZD90aGlzLnNldHRsZVNhbWVBc1Byb21pc2VfKHApOmgocCk/dGhpcy5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXyhwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXz1mdW5jdGlvbihwKXt2YXIgbT12b2lkIDA7dHJ5e209cC50aGVufWNhdGNoKG4pe3RoaXMucmVqZWN0XyhuKTtyZXR1cm59ImZ1bmN0aW9uIj09dHlwZW9mIG0/dGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8obSxwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZWplY3RfPWZ1bmN0aW9uKHApe3RoaXMuc2V0dGxlXygyLHApfTtkLnByb3RvdHlwZS5mdWxmaWxsXz1mdW5jdGlvbihwKXt0aGlzLnNldHRsZV8oMSwKcCl9O2QucHJvdG90eXBlLnNldHRsZV89ZnVuY3Rpb24ocCxtKXtpZigwIT10aGlzLnN0YXRlXyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3ArIiwgIittKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5zdGF0ZV8pO3RoaXMuc3RhdGVfPXA7dGhpcy5yZXN1bHRfPW07dGhpcy5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXygpfTtkLnByb3RvdHlwZS5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXz1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXyl7Zm9yKHZhciBwPTA7cDx0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ubGVuZ3RoOysrcClsLmFzeW5jRXhlY3V0ZSh0aGlzLm9uU2V0dGxlZENhbGxiYWNrc19bcF0pO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1udWxsfX07dmFyIGw9bmV3IGY7ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzUHJvbWlzZV89ZnVuY3Rpb24ocCl7dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwpwLmNhbGxXaGVuU2V0dGxlZF8obS5yZXNvbHZlLG0ucmVqZWN0KX07ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzVGhlbmFibGVfPWZ1bmN0aW9uKHAsbSl7dmFyIG49dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwLmNhbGwobSxuLnJlc29sdmUsbi5yZWplY3QpfWNhdGNoKHEpe24ucmVqZWN0KHEpfX07ZC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oQSx5KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgQT9mdW5jdGlvbih3KXt0cnl7cShBKHcpKX1jYXRjaChDKXt1KEMpfX06eX12YXIgcSx1LHg9bmV3IGQoZnVuY3Rpb24oQSx5KXtxPUE7dT15fSk7dGhpcy5jYWxsV2hlblNldHRsZWRfKG4ocCxxKSxuKG0sdSkpO3JldHVybiB4fTtkLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxwKX07ZC5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXz1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXtzd2l0Y2gocS5zdGF0ZV8pe2Nhc2UgMTpwKHEucmVzdWx0Xyk7CmJyZWFrO2Nhc2UgMjptKHEucmVzdWx0Xyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIitxLnN0YXRlXyk7fX12YXIgcT10aGlzO251bGw9PXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz9sLmFzeW5jRXhlY3V0ZShuKTp0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ucHVzaChuKX07ZC5yZXNvbHZlPWs7ZC5yZWplY3Q9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7bihwKX0pfTtkLnJhY2U9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7Zm9yKHZhciBxPWxiKHApLHU9cS5uZXh0KCk7IXUuZG9uZTt1PXEubmV4dCgpKWsodS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhtLG4pfSl9O2QuYWxsPWZ1bmN0aW9uKHApe3ZhciBtPWxiKHApLG49bS5uZXh0KCk7cmV0dXJuIG4uZG9uZT9rKFtdKTpuZXcgZChmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIGZ1bmN0aW9uKEMpe0Fbd109Qzt5LS07MD09CnkmJnEoQSl9fXZhciBBPVtdLHk9MDtkbyBBLnB1c2godm9pZCAwKSx5KyssayhuLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHgoQS5sZW5ndGgtMSksdSksbj1tLm5leHQoKTt3aGlsZSghbi5kb25lKX0pfTtyZXR1cm4gZH0pO2Z1bmN0aW9uIGFjKGIpe2Z1bmN0aW9uIGQoaCl7cmV0dXJuIGIubmV4dChoKX1mdW5jdGlvbiBmKGgpe3JldHVybiBiLnRocm93KGgpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihoLGspe2Z1bmN0aW9uIHQobCl7bC5kb25lP2gobC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4oZCxmKS50aGVuKHQsayl9dChiLm5leHQoKSl9KX1mdW5jdGlvbiBoYyhiKXtyZXR1cm4gYWMoYigpKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHcsQyl7dmFyIEc9IiI7aWYodylpZih3PXcudG9Mb3dlckNhc2UoKSwiICI9PT13fHxBLnRlc3QodykpRz0ic3BhY2UiO2Vsc2UgaWYoeS50ZXN0KHcpKUc9ImVzYyI7ZWxzZSBpZigxPT13Lmxlbmd0aCl7aWYoIUN8fHEudGVzdCh3KSlHPXd9ZWxzZSBHPXgudGVzdCh3KT93LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09dz8iKiI6dztyZXR1cm4gR31mdW5jdGlvbiBkKHcpe3ZhciBDPSIiO3cmJih3IGluIHA/Qz1wW3ddOnUudGVzdCh3KT8odz1wYXJzZUludCh3LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHcpLnRvTG93ZXJDYXNlKCkpOkM9dy50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHcpe3ZhciBDPSIiO051bWJlcih3KSYmKEM9NjU8PXcmJjkwPj13P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIrdyk6MTEyPD13JiYxMjM+PXc/ImYiKyh3LTExMisxKTo0ODw9dyYmNTc+PXc/ClN0cmluZyh3LTQ4KTo5Njw9dyYmMTA1Pj13P1N0cmluZyh3LTk2KTptW3ddKTtyZXR1cm4gQ31mdW5jdGlvbiBoKHcsQyl7cmV0dXJuIHcua2V5P2Iody5rZXksQyk6dy5kZXRhaWwmJncuZGV0YWlsLmtleT9iKHcuZGV0YWlsLmtleSxDKTpkKHcua2V5SWRlbnRpZmllcil8fGYody5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gayh3LEMpe3JldHVybiBoKEMsdy5oYXNNb2RpZmllcnMpPT09dy5rZXkmJighdy5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEhdy5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXcuY3RybEtleSYmISFDLmFsdEtleT09PSEhdy5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF3Lm1ldGFLZXkpfWZ1bmN0aW9uIHQodyl7cmV0dXJuIDE9PT13Lmxlbmd0aD97Y29tYm86dyxrZXk6dyxldmVudDoia2V5ZG93biJ9Oncuc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxHKXt2YXIgRD1HLnNwbGl0KCI6Iik7Rz1EWzBdO0Q9RFsxXTtHIGluIG4/KENbbltHXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RyxDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp3LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGwodyl7cmV0dXJuIHcudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB0KEMpfSl9dmFyIHA9eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LG09ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0sbj17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHE9L1thLXowLTkqXS8sdT0vVVwrLyx4PS9eYXJyb3cvLApBPS9ec3BhY2UoYmFyKT8vLHk9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3Nbd109Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHcsQyl7Qz1sKEMpO2Zvcih2YXIgRz0wO0c8Qy5sZW5ndGg7KytHKWlmKGsoQ1tHXSx3KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB3PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09dy5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ3LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHd9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihHKXtmb3IodmFyIEQgaW4gRyl0aGlzLl9hZGRLZXlCaW5kaW5nKEQsR1tEXSl9LHRoaXMpO2Zvcih2YXIgdyBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh3LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t3XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRyxEKXtHPUdbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBHPT09RFswXS5oYXNNb2RpZmllcnM/MDpHPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXtsKHcpLmZvckVhY2goZnVuY3Rpb24oRyl7dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0cuZXZlbnRdLnB1c2goW0csCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3ddKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQsdyxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHcsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgdyxDLEc7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXc9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz13WzBdLEc9d1sxXSx3PXdbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEcsdyl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih3LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRz0wO0c8dy5sZW5ndGg7RysrKXt2YXIgRD13W0ddWzBdLEI9d1tHXVsxXTtpZihrKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih3LEMsRyl7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh3KTtELmtleWJvYXJkRXZlbnQ9Rzt3PW5ldyBDdXN0b21FdmVudCh3LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMsdyk7dy5kZWZhdWx0UHJldmVudGVkJiZHLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGIpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1iLnR5cGUpO2Vsc2UgaWYoYi50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWIudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8dGhpcy5maXJlKGIudHlwZSx7c291cmNlRXZlbnQ6Yn0se25vZGU6dGhpcyxidWJibGVzOmIuYnViYmxlcyxjYW5jZWxhYmxlOmIuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYj8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1iPyJub25lIjoiIjtiPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGIpO2J8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZiKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihiKXt0aGlzLmFjdGl2ZSE9PQpiJiYodGhpcy5hY3RpdmU9Yix0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihiKXtiPWIuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8KGIucHJldmVudERlZmF1bHQoKSxiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYi5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChiKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZkIT1iJiZ0aGlzLmhhc0F0dHJpYnV0ZShkKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoZCl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYj8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJpcHBsZS9wYXBlci1yaXBwbGUuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGg7dGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0O3RoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBkKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMuY29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaCkuY29sb3I7dGhpcy53YXZlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMud2F2ZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuY29sb3I7dGhpcy53YXZlLmNsYXNzTGlzdC5hZGQoIndhdmUiKTt0aGlzLndhdmVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgid2F2ZS1jb250YWluZXIiKTtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIpLmFwcGVuZENoaWxkKHRoaXMud2F2ZSk7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKX0KdmFyIGY9e2Rpc3RhbmNlOmZ1bmN0aW9uKGgsayx0LGwpe2gtPXQ7ay09bDtyZXR1cm4gTWF0aC5zcXJ0KGgqaCtrKmspfSxub3c6d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93fTtiLnByb3RvdHlwZT17Z2V0IGJvdW5kaW5nUmVjdCgpe3JldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LGZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tOmZ1bmN0aW9uKGgsayl7dmFyIHQ9Zi5kaXN0YW5jZShoLGssMCwwKSxsPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsMCkscD1mLmRpc3RhbmNlKGgsaywwLHRoaXMuaGVpZ2h0KTtoPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heCh0LGwscCxoKX19O2QuTUFYX1JBRElVUz0zMDA7ZC5wcm90b3R5cGU9e2dldCByZWNlbnRlcnMoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnJlY2VudGVyc30sCmdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcn0sZ2V0IG1vdXNlRG93bkVsYXBzZWQoKXtpZighdGhpcy5tb3VzZURvd25TdGFydClyZXR1cm4gMDt2YXIgaD1mLm5vdygpLXRoaXMubW91c2VEb3duU3RhcnQ7dGhpcy5tb3VzZVVwU3RhcnQmJihoLT10aGlzLm1vdXNlVXBFbGFwc2VkKTtyZXR1cm4gaH0sZ2V0IG1vdXNlVXBFbGFwc2VkKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P2Yubm93KCktdGhpcy5tb3VzZVVwU3RhcnQ6MH0sZ2V0IG1vdXNlRG93bkVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZC8xRTN9LGdldCBtb3VzZVVwRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZVVwRWxhcHNlZC8xRTN9LGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWRTZWNvbmRzK3RoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzfSxnZXQgaW5pdGlhbE9wYWNpdHkoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmluaXRpYWxPcGFjaXR5fSwKZ2V0IG9wYWNpdHlEZWNheVZlbG9jaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eX0sZ2V0IHJhZGl1cygpe3ZhciBoPTEuMSpNYXRoLm1pbihNYXRoLnNxcnQodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoKnRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCt0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQpLGQuTUFYX1JBRElVUykrNTtyZXR1cm4gTWF0aC5hYnMoaCooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS1oL2QuTUFYX1JBRElVUyouMikpKSkpfSxnZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9NYXRoLm1heCgwLHRoaXMuaW5pdGlhbE9wYWNpdHktdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMqdGhpcy5vcGFjaXR5RGVjYXlWZWxvY2l0eSk6dGhpcy5pbml0aWFsT3BhY2l0eX0sZ2V0IG91dGVyT3BhY2l0eSgpe3JldHVybiBNYXRoLm1heCgwLApNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybi4wMT50aGlzLm9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxkLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsZC5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD8KdGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlRGlzdGFuY2U9dGhpcy55RW5kPXRoaXMueEVuZD10aGlzLnlTdGFydD10aGlzLnhTdGFydD10aGlzLm1vdXNlVXBTdGFydD10aGlzLm1vdXNlRG93blN0YXJ0PXRoaXMubWF4UmFkaXVzPTA7dGhpcy5jb250YWluZXJNZXRyaWNzPW5ldyBiKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGg9dGhpcy5yYWRpdXMvCih0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZS8yKTt2YXIgaz10aGlzLnhOb3ctdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzI7dmFyIHQ9dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitrKyJweCwgIit0KyJweCkiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIraysicHgsICIrdCsicHgsIDApIjt0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK2grIiwiK2grIikiO3RoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIitoKyIsIitoKyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7dGhpcy5tb3VzZURvd25TdGFydD0KZi5ub3coKTt0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9ayx0aGlzLnlTdGFydD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9aD9oLmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD1oP2guZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKTt0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1rLHRoaXMueUVuZD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKTt0aGlzLm1heFJhZGl1cz10aGlzLmNvbnRhaW5lck1ldHJpY3MuZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb20odGhpcy54U3RhcnQsCnRoaXMueVN0YXJ0KTt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLmlzTW91c2VEb3duJiYodGhpcy5tb3VzZVVwU3RhcnQ9Zi5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMud2F2ZUNvbnRhaW5lci5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX07UG9seW1lcih7aXM6InBhcGVyLXJpcHBsZSIsCmJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl0scHJvcGVydGllczp7aW5pdGlhbE9wYWNpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi4yNX0sb3BhY2l0eURlY2F5VmVsb2NpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi44fSxyZWNlbnRlcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJpcHBsZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGFuaW1hdGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0saG9sZERvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvbGREb3duQ2hhbmdlZCJ9LG5vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hbmltYXRpbmc6e3R5cGU6Qm9vbGVhbn0sX2JvdW5kQW5pbWF0ZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKX19fSwKZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgaD10aGlzLmtleUV2ZW50VGFyZ2V0PTExPT10aGlzLnBhcmVudE5vZGUubm9kZVR5cGU/UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDp0aGlzLnBhcmVudE5vZGU7dGhpcy5saXN0ZW4oaCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy5saXN0ZW4oaCwiZG93biIsInVpRG93bkFjdGlvbiIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJkb3duIiwidWlEb3duQWN0aW9uIik7dGhpcy5rZXlFdmVudFRhcmdldD0KbnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKWlmKCF0aGlzLnJpcHBsZXNbaF0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLnVwQWN0aW9uKCl9LDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKGgpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3RoaXMuaG9sZERvd24mJjA8dGhpcy5yaXBwbGVzLmxlbmd0aHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbihoKSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKGgpfSx1cEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLmhvbGREb3dufHwKKHRoaXMucmlwcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKGspe2sudXBBY3Rpb24oaCl9KSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMuZmlyZSgidHJhbnNpdGlvbmVuZCIpfSxhZGRSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgaD1uZXcgZCh0aGlzKTtQb2x5bWVyLmRvbSh0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKGgud2F2ZUNvbnRhaW5lcik7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWguY29sb3I7dGhpcy5yaXBwbGVzLnB1c2goaCk7dGhpcy5fc2V0QW5pbWF0aW5nKCEwKTtyZXR1cm4gaH0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMucmlwcGxlcy5pbmRleE9mKGgpOzA+a3x8KHRoaXMucmlwcGxlcy5zcGxpY2UoaywxKSxoLnJlbW92ZSgpLAp0aGlzLnJpcHBsZXMubGVuZ3RofHx0aGlzLl9zZXRBbmltYXRpbmcoITEpKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2FuaW1hdGluZyl7dmFyIGg7Zm9yKGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKXt2YXIgaz10aGlzLnJpcHBsZXNbaF07ay5kcmF3KCk7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUub3BhY2l0eT1rLm91dGVyT3BhY2l0eTtrLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCYmIWsuaXNSZXN0aW5nQXRNYXhSYWRpdXMmJnRoaXMucmVtb3ZlUmlwcGxlKGspfWlmKHRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZ3x8MCE9PXRoaXMucmlwcGxlcy5sZW5ndGgpd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpO2Vsc2UgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpO3RoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSwKX29uU3BhY2VLZXl1cDpmdW5jdGlvbigpe3RoaXMudWlVcEFjdGlvbigpfSxfaG9sZERvd25DaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dm9pZCAwIT09ayYmKGg/dGhpcy5kb3duQWN0aW9uKCk6dGhpcy51cEFjdGlvbigpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLXJpcHBsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcj17cHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LF9yaXBwbGVDb250YWluZXI6e3R5cGU6T2JqZWN0fX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZm9jdXNlZCYmdGhpcy5lbnN1cmVSaXBwbGUoKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUoYil9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbihiKXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpO3RoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBkPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2QmJlBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSk7aWYoYil7ZD0KUG9seW1lci5kb20odGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKTt2YXIgZj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QuZGVlcENvbnRhaW5zKGYpJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKGIpfX19LGdldFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZW5zdXJlUmlwcGxlKCk7cmV0dXJuIHRoaXMuX3JpcHBsZX0saGFzUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9yaXBwbGV9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItcmlwcGxlIil9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ub2luaz1iKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1idXR0b24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH19LG9ic2VydmVyczpbIl9jYWxjdWxhdGVFbGV2YXRpb24oZm9jdXNlZCwgZGlzYWJsZWQsIGFjdGl2ZSwgcHJlc3NlZCwgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiLCJfY29tcHV0ZUtleWJvYXJkQ2xhc3MocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCIsYW5pbWF0ZWQ6ITB9LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt2YXIgYj0xO3RoaXMuZGlzYWJsZWQ/Yj0wOnRoaXMuYWN0aXZlfHx0aGlzLnByZXNzZWQ/Yj00OnRoaXMucmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCYmKGI9Myk7dGhpcy5fc2V0RWxldmF0aW9uKGIpfSxfY29tcHV0ZUtleWJvYXJkQ2xhc3M6ZnVuY3Rpb24oYil7dGhpcy50b2dnbGVDbGFzcygia2V5Ym9hcmQtZm9jdXMiLApiKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsLl9zcGFjZUtleURvd25IYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmhhc1JpcHBsZSgpJiYxPnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGgmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlVcEhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuaGFzUmlwcGxlKCkmJnRoaXMuX3JpcHBsZS51aVVwQWN0aW9uKCl9fTtQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYnV0dG9uL3BhcGVyLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGwuX2NhbGN1bGF0ZUVsZXZhdGlvbi5hcHBseSh0aGlzKTp0aGlzLl9zZXRFbGV2YXRpb24oMCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZXRhL2lyb24tbWV0YS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk1ldGE9ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uTWV0YVsiICJdKGQpO3RoaXMudHlwZT1kJiZkLnR5cGV8fCJkZWZhdWx0Ijt0aGlzLmtleT1kJiZkLmtleTtkJiYidmFsdWUiaW4gZCYmKHRoaXMudmFsdWU9ZC52YWx1ZSl9O1BvbHltZXIuSXJvbk1ldGFbIiAiXT1mdW5jdGlvbigpe307UG9seW1lci5Jcm9uTWV0YS50eXBlcz17fTtQb2x5bWVyLklyb25NZXRhLnByb3RvdHlwZT17Z2V0IHZhbHVlKCl7dmFyIGQ9dGhpcy50eXBlLGY9dGhpcy5rZXk7aWYoZCYmZilyZXR1cm4gUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXSYmUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXVtmXX0sc2V0IHZhbHVlKGQpe3ZhciBmPXRoaXMudHlwZSxoPXRoaXMua2V5O2YmJmgmJihmPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZl09UG9seW1lci5Jcm9uTWV0YS50eXBlc1tmXXx8e30sbnVsbD09ZD9kZWxldGUgZltoXTpmW2hdPWQpfSxnZXQgbGlzdCgpe2lmKHRoaXMudHlwZSl7dmFyIGQ9ClBvbHltZXIuSXJvbk1ldGEudHlwZXNbdGhpcy50eXBlXTtyZXR1cm4gZD9PYmplY3Qua2V5cyhkKS5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGJbdGhpcy50eXBlXVtmXX0sdGhpcyk6W119fSxieUtleTpmdW5jdGlvbihkKXt0aGlzLmtleT1kO3JldHVybiB0aGlzLnZhbHVlfX07dmFyIGI9UG9seW1lci5Jcm9uTWV0YS50eXBlcztQb2x5bWVyKHtpczoiaXJvbi1tZXRhIixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LGtleTp7dHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGY6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX3NlbGZDaGFuZ2VkIn0sX19tZXRhOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9fY29tcHV0ZU1ldGEodHlwZSwga2V5LCB2YWx1ZSkifX0saG9zdEF0dHJpYnV0ZXM6e2hpZGRlbjohMH0sX19jb21wdXRlTWV0YTpmdW5jdGlvbihkLGYsaCl7ZD1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTpkLAprZXk6Zn0pO3ZvaWQgMCE9PWgmJmghPT1kLnZhbHVlP2QudmFsdWU9aDp0aGlzLnZhbHVlIT09ZC52YWx1ZSYmKHRoaXMudmFsdWU9ZC52YWx1ZSk7cmV0dXJuIGR9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24oZCl7ZCYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKGQpe3JldHVybihuZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTp0aGlzLnR5cGUsa2V5OmR9KSkudmFsdWV9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IvaXJvbi12YWxpZGF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW51bGw7ClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGludmFsaWQ6e25vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaW52YWxpZENoYW5nZWQifX0scmVnaXN0ZXJlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IifSl9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWludmFsaWQiKX0sZ2V0IF92YWxpZGF0b3IoKXtyZXR1cm4gUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEmJlBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhLmJ5S2V5KHRoaXMudmFsaWRhdG9yKX0saGFzVmFsaWRhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPQp0aGlzLl92YWxpZGF0b3J9LHZhbGlkYXRlOmZ1bmN0aW9uKGIpe3RoaXMuaW52YWxpZD12b2lkIDA9PT1iJiZ2b2lkIDAhPT10aGlzLnZhbHVlPyF0aGlzLl9nZXRWYWxpZGl0eSh0aGlzLnZhbHVlKTohdGhpcy5fZ2V0VmFsaWRpdHkoYik7cmV0dXJuIXRoaXMuaW52YWxpZH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmhhc1ZhbGlkYXRvcigpP3RoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShiKTohMH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcj17cHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wYXJlbnRGb3JtOnt0eXBlOk9iamVjdH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50fHx0aGlzLmZpcmUoImlyb24tZm9ybS1lbGVtZW50LXJlZ2lzdGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7IVBvbHltZXIuRWxlbWVudCYmdGhpcy5fcGFyZW50Rm9ybSYmdGhpcy5fcGFyZW50Rm9ybS5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC11bnJlZ2lzdGVyIix7dGFyZ2V0OnRoaXN9KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLmNoZWNrZWR9LF9yZXF1aXJlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlcXVpcmVkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwKInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQ7dGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52YWx1ZXx8bnVsbD09PXRoaXMudmFsdWUpdGhpcy52YWx1ZT0ib24ifX07UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj1bUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItaW5reS1mb2N1cy1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGw9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249Yil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpO2IuaWQ9ImluayI7Yi5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpO2IuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIik7cmV0dXJuIGJ9fTtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbD17X2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwuX2NoZWNrZWRDaGFuZ2VkLmNhbGwodGhpcyk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuY2hlY2tlZD90aGlzLl9yaXBwbGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiIik6dGhpcy5fcmlwcGxlLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpKX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyk7IXRoaXMuZGlzYWJsZWQmJnRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuY2hlY2tlZD10aGlzLmFjdGl2ZSl9fTsKUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItY2hlY2tib3gvcGFwZXItY2hlY2tib3guaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIGI9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGQ9InB4IixmPWIubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09ZiYmKGQ9ZlswXSk7Yj1wYXJzZUZsb2F0KGIpOwpmPTgvMypiOyJweCI9PT1kJiYoZj1NYXRoLmZsb29yKGYpLGYlMiE9PWIlMiYmZisrKTt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOmYrZH0pfX0pfSxfY29tcHV0ZUNoZWNrYm94Q2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0iIjtiJiYoZis9ImNoZWNrZWQgIik7ZCYmKGYrPSJpbnZhbGlkIik7cmV0dXJuIGZ9LF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6ZnVuY3Rpb24oYil7cmV0dXJuIGI/IiI6ImhpZGRlbiJ9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWljb24vaXJvbi1pY29uLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOlBvbHltZXIuQmFzZS5jcmVhdGUoImlyb24tbWV0YSIse3R5cGU6Imljb25zZXQifSl9fSxvYnNlcnZlcnM6WyJfdXBkYXRlSWNvbihfbWV0YSwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlSWNvbih0aGVtZSwgaXNBdHRhY2hlZCkiLCJfc3JjQ2hhbmdlZChzcmMsIGlzQXR0YWNoZWQpIiwiX2ljb25DaGFuZ2VkKGljb24sIGlzQXR0YWNoZWQpIl0sX0RFRkFVTFRfSUNPTlNFVDoiaWNvbnMiLF9pY29uQ2hhbmdlZDpmdW5jdGlvbihiKXtiPShifHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1iLnBvcCgpO3RoaXMuX2ljb25zZXROYW1lPWIucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVDt0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWNvbigpfSwKX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKCh0aGlzLl9pY29uc2V0PXRoaXMuX21ldGEuYnlLZXkodGhpcy5faWNvbnNldE5hbWUpKT8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJgp0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyksdGhpcy5faW1nfHwodGhpcy5faW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLHRoaXMuX2ltZy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5faW1nLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5faW1nLmRyYWdnYWJsZT0hMSksdGhpcy5faW1nLnNyYz10aGlzLnNyYyxQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKHRoaXMuX2ltZykpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYTExeS1hbm5vdW5jZXIvaXJvbi1hMTF5LWFubm91bmNlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9UG9seW1lcih7aXM6Imlyb24tYTExeS1hbm5vdW5jZXIiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwb2xpdGUifSxfdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9dGhpcyk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJpcm9uLWFubm91bmNlIix0aGlzLl9vbklyb25Bbm5vdW5jZS5iaW5kKHRoaXMpKX0sYW5ub3VuY2U6ZnVuY3Rpb24oYil7dGhpcy5fdGV4dD0iIjt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdGV4dD1ifSwxMDApfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UoYi5kZXRhaWwudGV4dCl9fSk7ClBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHk9ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlfHwoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSl9fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWlucHV0L2lyb24taW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbnB1dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntiaW5kVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx2YWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVmFsdWUoYmluZFZhbHVlKSJ9LGFsbG93ZWRQYXR0ZXJuOnt0eXBlOlN0cmluZ30sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbnB1dEVsZW1lbnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYmluZFZhbHVlQ2hhbmdlZChiaW5kVmFsdWUsIF9pbnB1dEVsZW1lbnQpIl0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQiLGtleXByZXNzOiJfb25LZXlwcmVzcyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKTt0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiI7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPQpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oKXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoUG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdO3RoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKTt0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7aWYodGhpcy5hbGxvd2VkUGF0dGVybil2YXIgYj1uZXcgUmVnRXhwKHRoaXMuYWxsb3dlZFBhdHRlcm4pOwplbHNlIHN3aXRjaCh0aGlzLmlucHV0RWxlbWVudC50eXBlKXtjYXNlICJudW1iZXIiOmI9L1swLTkuLGUtXS99cmV0dXJuIGJ9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmKHZvaWQgMD09PWI/ZC52YWx1ZT1udWxsOmIhPT1kLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9YiksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOmJ9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7IXRoaXMuYWxsb3dlZFBhdHRlcm58fHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZHx8dGhpcy5fY2hlY2tQYXR0ZXJuVmFsaWRpdHkoKXx8KHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4iKSx0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQpO3RoaXMuYmluZFZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0KdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxfaXNQcmludGFibGU6ZnVuY3Rpb24oYil7dmFyIGQ9MTk9PWIua2V5Q29kZXx8MjA9PWIua2V5Q29kZXx8NDU9PWIua2V5Q29kZXx8NDY9PWIua2V5Q29kZXx8MTQ0PT1iLmtleUNvZGV8fDE0NT09Yi5rZXlDb2RlfHwzMjxiLmtleUNvZGUmJjQxPmIua2V5Q29kZXx8MTExPGIua2V5Q29kZSYmMTI0PmIua2V5Q29kZTtyZXR1cm4hKDg9PWIua2V5Q29kZXx8OT09Yi5rZXlDb2RlfHwxMz09Yi5rZXlDb2RlfHwyNz09Yi5rZXlDb2RlKSYmISgwPT1iLmNoYXJDb2RlJiZkKX0sX29uS2V5cHJlc3M6ZnVuY3Rpb24oYil7aWYodGhpcy5hbGxvd2VkUGF0dGVybnx8Im51bWJlciI9PT10aGlzLmlucHV0RWxlbWVudC50eXBlKXt2YXIgZD10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKGQmJiEoYi5tZXRhS2V5fHxiLmN0cmxLZXl8fGIuYWx0S2V5KSl7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPQohMDt2YXIgZj1TdHJpbmcuZnJvbUNoYXJDb2RlKGIuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKGIpJiYhZC50ZXN0KGYpJiYoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIitmKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIWIpcmV0dXJuITA7Zm9yKHZhciBkPTA7ZDx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7ZCsrKWlmKCFiLnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbZF0pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciBiPXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtiJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLmJpbmRWYWx1ZT9iPSExOgp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLmJpbmRWYWx1ZSkpKTt0aGlzLmludmFsaWQ9IWI7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGJ9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDpifSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXI9e307UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEPTE7ClBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvZm9jdXNDaGFuZ2VkIn0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30sbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbWluOnt0eXBlOlN0cmluZ30sbWF4Ont0eXBlOlN0cmluZ30sc3RlcDp7dHlwZTpTdHJpbmd9LG5hbWU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNpemU6e3R5cGU6TnVtYmVyfSxhdXRvY2FwaXRhbGl6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vbmUifSxhdXRvY29ycmVjdDp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9zYXZlOnt0eXBlOlN0cmluZ30scmVzdWx0czp7dHlwZTpOdW1iZXJ9LGFjY2VwdDp7dHlwZTpTdHJpbmd9LG11bHRpcGxlOnt0eXBlOkJvb2xlYW59LF9hcmlhRGVzY3JpYmVkQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSwKX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7dGhpcy4kfHwodGhpcy4kPXt9KTt0aGlzLiQuaW5wdXR8fCh0aGlzLl9nZW5lcmF0ZUlucHV0SWQoKSx0aGlzLiQuaW5wdXQ9dGhpcy4kJCgiIyIrdGhpcy5faW5wdXRJZCkpO3JldHVybiB0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayBmaWxlIi5zcGxpdCgiICIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCk7CiFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApfSxfYXBwZW5kU3RyaW5nV2l0aFNwYWNlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/YisiICIrZDpkfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtpZihiLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGIuaWQpO2Vsc2V7dmFyIGQ9InBhcGVyLWlucHV0LWFkZC1vbi0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRCsrO2IuaWQ9ZDt0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxkKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LApfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25Db250cm9sU3RhdGUuX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKGIpe3RyeXt2YXIgZD0KdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT1iO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWQ7dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWR9Y2F0Y2goZil7dGhpcy52YWx1ZT1ifX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR8fGJ9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigibGFiZWwiKTtpZihiKXtpZihiLmlkKXZhciBkPWIuaWQ7ZWxzZSBkPSJwYXBlci1pbnB1dC1sYWJlbC0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRCsrLGIuaWQ9ZDt0aGlzLl9hcmlhTGFiZWxsZWRCeT1kfWVsc2UgdGhpcy5fYXJpYUxhYmVsbGVkQnk9IiJ9LF9nZW5lcmF0ZUlucHV0SWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dElkJiYiIiE9PXRoaXMuX2lucHV0SWR8fCh0aGlzLl9pbnB1dElkPQoiaW5wdXQtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbihiKXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZShiLnR5cGUse3NvdXJjZUV2ZW50OmJ9LHtub2RlOnRoaXMsYnViYmxlczpiLmJ1YmJsZXMsY2FuY2VsYWJsZTpiLmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmIhPT1kb2N1bWVudC5ib2R5JiZiIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX07UG9seW1lci5QYXBlcklucHV0QmVoYXZpb3I9W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYWRkb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yPXthdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiYWRkb24tYXR0YWNoZWQiKX0sdXBkYXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfY2hhckNvdW50ZXJTdHI6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIn19LHVwZGF0ZTpmdW5jdGlvbihiKXtpZihiLmlucHV0RWxlbWVudCl7Yi52YWx1ZT1iLnZhbHVlfHwiIjt2YXIgZD1iLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoLnRvU3RyaW5nKCk7Yi5pbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJtYXhsZW5ndGgiKSYmKGQrPSIvIitiLmlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1heGxlbmd0aCIpKTt0aGlzLl9jaGFyQ291bnRlclN0cj1kfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci1pbnB1dC1jb250YWluZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtY29udGFpbmVyIixwcm9wZXJ0aWVzOntub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdHRyRm9yVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5kLXZhbHVlIn0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e29ic2VydmVyOiJfaW52YWxpZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZm9jdXNlZDp7cmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sX2FkZG9uczp7dHlwZTpBcnJheX0sX2lucHV0SGFzQ29udGVudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRTZWxlY3Rvcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImlucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0In0sX2JvdW5kT25Gb2N1czp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyl9fSwKX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclZhbHVlKX0sZ2V0IF9pbnB1dEVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3Rvcih0aGlzLl9pbnB1dFNlbGVjdG9yKX0sCmdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMDt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpO3RoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/CnRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCk6dGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihiKXt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO2I9Yi50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihiKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGIpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKTt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbihiKXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShiLnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD0KYi50YXJnZXQ7aWYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZSYmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITEsdm9pZCAwPT09ZC52YWx1ZXx8IiI9PT1kLnZhbHVlKSlyZXR1cm47dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYi50YXJnZXQpfSxfaGFuZGxlVmFsdWU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU7ZHx8MD09PWR8fCJudW1iZXIiPT09Yi50eXBlJiYhYi5jaGVja1ZhbGlkaXR5KCk/dGhpcy5faW5wdXRIYXNDb250ZW50PSEwOnRoaXMuX2lucHV0SGFzQ29udGVudD0hMTt0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OmIsdmFsdWU6ZCxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24oYil7dGhpcy5hdXRvVmFsaWRhdGUmJmImJih0aGlzLmludmFsaWQ9IShiLnZhbGlkYXRlP2IudmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50VmFsdWUpOmIuY2hlY2tWYWxpZGl0eSgpKSk7CnRoaXMuX2hhbmRsZVZhbHVlKGIpfSxfb25Jcm9uSW5wdXRWYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD10aGlzLl9pbnB1dEVsZW1lbnQuaW52YWxpZH0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWRkb25zJiZ0aGlzLnVwZGF0ZUFkZG9ucyh7aW52YWxpZDp0aGlzLmludmFsaWR9KX0sdXBkYXRlQWRkb25zOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZCxmPTA7ZD10aGlzLl9hZGRvbnNbZl07ZisrKWQudXBkYXRlKGIpfSxfY29tcHV0ZUlucHV0Q29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9ImlucHV0LWNvbnRlbnQiO2I/KGsmJih0Kz0iIGxhYmVsLWlzLWhpZGRlbiIpLGgmJih0Kz0iIGlzLWludmFsaWQiKSk6KGI9dGhpcy5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpLGR8fGs/KHQrPSIgbGFiZWwtaXMtZmxvYXRpbmciLHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJzdGF0aWMiLGg/dCs9IiBpcy1pbnZhbGlkIjoKZiYmKHQrPSIgbGFiZWwtaXMtaGlnaGxpZ2h0ZWQiKSk6KGImJih0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoJiYodCs9IiBpcy1pbnZhbGlkIikpKTtmJiYodCs9IiBmb2N1c2VkIik7cmV0dXJuIHR9LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0idW5kZXJsaW5lIjtkP2YrPSIgaXMtaW52YWxpZCI6YiYmKGYrPSIgaXMtaGlnaGxpZ2h0ZWQiKTtyZXR1cm4gZn0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQpe3ZhciBmPSJhZGQtb24tY29udGVudCI7ZD9mKz0iIGlzLWludmFsaWQiOmImJihmKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtZXJyb3IuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbihiKXt0aGlzLl9zZXRJbnZhbGlkKGIuaW52YWxpZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfX0sYmVmb3JlUmVnaXN0ZXI6ZnVuY3Rpb24oKXt2YXIgYj0iZnVuY3Rpb24iPT10eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1pbnB1dCIpLl9pbml0U2xvdHRlZElucHV0PyJ2MSI6InYwIixkPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSIpO2I9UG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KCJwYXBlci1pbnB1dCIsInRlbXBsYXRlIyIrYik7KGQ9ZC5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIiN0ZW1wbGF0ZS1wbGFjZWhvbGRlciIpKSYmZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLmNvbnRlbnQsZCl9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiBQb2x5bWVyLkVsZW1lbnQ/dGhpcy5pbnB1dEVsZW1lbnQuX2lucHV0RWxlbWVudDoKdGhpcy5pbnB1dEVsZW1lbnR9LGxpc3RlbmVyczp7Imlyb24taW5wdXQtcmVhZHkiOiJfb25Jcm9uSW5wdXRSZWFkeSJ9LF9vbklyb25JbnB1dFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy4kLm5hdGl2ZUlucHV0fHwodGhpcy4kLm5hdGl2ZUlucHV0PXRoaXMuJCQoImlucHV0IikpO3RoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy4kLm5hdGl2ZUlucHV0LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKTt0aGlzLmlucHV0RWxlbWVudC5iaW5kVmFsdWUmJnRoaXMuJC5jb250YWluZXIuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuaW5wdXRFbGVtZW50KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZpdC1iZWhhdmlvci9pcm9uLWZpdC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZpdEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZml0SW5mbzp7dHlwZTpPYmplY3R9fSxnZXQgX2ZpdFdpZHRoKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJXaWR0aDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGh9LApnZXQgX2ZpdEhlaWdodCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVySGVpZ2h0OnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGdldCBfZml0TGVmdCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZ2V0IF9maXRUb3AoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO2ImJmIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiPWIuaG9zdCk7cmV0dXJuIGJ9LGdldCBfbG9jYWxlSG9yaXpvbnRhbEFsaWduKCl7aWYodGhpcy5faXNSVEwpe2lmKCJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4ibGVmdCI7CmlmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9pc1JUTCYmKHRoaXMuX2lzUlRMPSJydGwiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0O3RoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSwKdGhpcy5maXQoKSkpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX19kZWZlcnJlZEZpdCYmKGNsZWFyVGltZW91dCh0aGlzLl9fZGVmZXJyZWRGaXQpLHRoaXMuX19kZWZlcnJlZEZpdD1udWxsKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbigpO3RoaXMuY29uc3RyYWluKCk7dGhpcy5jZW50ZXIoKX0sX2Rpc2NvdmVySW5mbzpmdW5jdGlvbigpe2lmKCF0aGlzLl9maXRJbmZvKXt2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKSxkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2l6aW5nVGFyZ2V0KTt0aGlzLl9maXRJbmZvPXtpbmxpbmVTdHlsZTp7dG9wOnRoaXMuc3R5bGUudG9wfHwiIixsZWZ0OnRoaXMuc3R5bGUubGVmdHx8IiIscG9zaXRpb246dGhpcy5zdHlsZS5wb3NpdGlvbnx8IiJ9LHNpemVySW5saW5lU3R5bGU6e21heFdpZHRoOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRofHwiIixtYXhIZWlnaHQ6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0fHwKIiIsYm94U2l6aW5nOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZ3x8IiJ9LHBvc2l0aW9uZWRCeTp7dmVydGljYWxseToiYXV0byIhPT1iLnRvcD8idG9wIjoiYXV0byIhPT1iLmJvdHRvbT8iYm90dG9tIjpudWxsLGhvcml6b250YWxseToiYXV0byIhPT1iLmxlZnQ/ImxlZnQiOiJhdXRvIiE9PWIucmlnaHQ/InJpZ2h0IjpudWxsfSxzaXplZEJ5OntoZWlnaHQ6Im5vbmUiIT09ZC5tYXhIZWlnaHQsd2lkdGg6Im5vbmUiIT09ZC5tYXhXaWR0aCxtaW5XaWR0aDpwYXJzZUludChkLm1pbldpZHRoLDEwKXx8MCxtaW5IZWlnaHQ6cGFyc2VJbnQoZC5taW5IZWlnaHQsMTApfHwwfSxtYXJnaW46e3RvcDpwYXJzZUludChiLm1hcmdpblRvcCwxMCl8fDAscmlnaHQ6cGFyc2VJbnQoYi5tYXJnaW5SaWdodCwxMCl8fDAsYm90dG9tOnBhcnNlSW50KGIubWFyZ2luQm90dG9tLDEwKXx8MCxsZWZ0OnBhcnNlSW50KGIubWFyZ2luTGVmdCwxMCl8fDB9fX19LHJlc2V0Rml0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuX2ZpdEluZm98fHt9LGQ7Zm9yKGQgaW4gYi5zaXplcklubGluZVN0eWxlKXRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlW2RdPWIuc2l6ZXJJbmxpbmVTdHlsZVtkXTtmb3IoZCBpbiBiLmlubGluZVN0eWxlKXRoaXMuc3R5bGVbZF09Yi5pbmxpbmVTdHlsZVtkXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxkPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCk7dGhpcy5maXQoKTt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PWI7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt0aGlzLnN0eWxlLmxlZnQ9IjBweCI7CnRoaXMuc3R5bGUudG9wPSIwcHgiO3ZhciBiPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5wb3NpdGlvblRhcmdldCksZj10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKSxoPXRoaXMuX2ZpdEluZm8ubWFyZ2luLGs9dGhpcy5fX2dldFBvc2l0aW9uKHRoaXMuX2xvY2FsZUhvcml6b250YWxBbGlnbix0aGlzLnZlcnRpY2FsQWxpZ24se3dpZHRoOmIud2lkdGgraC5sZWZ0K2gucmlnaHQsaGVpZ2h0OmIuaGVpZ2h0K2gudG9wK2guYm90dG9tfSxiLGQsZik7ZD1rLmxlZnQraC5sZWZ0O2s9ay50b3AraC50b3A7dmFyIHQ9TWF0aC5taW4oZi5yaWdodC1oLnJpZ2h0LGQrYi53aWR0aCksbD1NYXRoLm1pbihmLmJvdHRvbS1oLmJvdHRvbSxrK2IuaGVpZ2h0KTtkPU1hdGgubWF4KGYubGVmdCtoLmxlZnQsTWF0aC5taW4oZCx0LXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkpO2s9TWF0aC5tYXgoZi50b3ArCmgudG9wLE1hdGgubWluKGssbC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGg9TWF0aC5tYXgodC1kLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkrInB4Ijt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHQ9TWF0aC5tYXgobC1rLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKyJweCI7dGhpcy5zdHlsZS5sZWZ0PWQtYi5sZWZ0KyJweCI7dGhpcy5zdHlsZS50b3A9ay1iLnRvcCsicHgifX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mbztiLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKTtiLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsCnRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Iuc2l6ZWRCeS5oZWlnaHR8fHRoaXMuX19zaXplRGltZW5zaW9uKGQsYi5wb3NpdGlvbmVkQnkudmVydGljYWxseSwidG9wIiwiYm90dG9tIiwiSGVpZ2h0Iik7Yi5zaXplZEJ5LndpZHRofHx0aGlzLl9fc2l6ZURpbWVuc2lvbihkLGIucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSwibGVmdCIsInJpZ2h0IiwiV2lkdGgiKX19LF9zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dGhpcy5fX3NpemVEaW1lbnNpb24oYixkLGYsaCxrKX0sX19zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9dGhpcy5fZml0SW5mbyxsPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2w9IldpZHRoIj09PWs/bC53aWR0aDpsLmhlaWdodDtkPWQ9PT1oO3ZhciBwPQoib2Zmc2V0IitrO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK2tdPWwtdC5tYXJnaW5bZD9mOmhdLShkP2wtYltoXTpiW2ZdKS0odGhpc1twXS10aGlzLnNpemluZ1RhcmdldFtwXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIWIudmVydGljYWxseXx8IWIuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpO2IuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9Zi50b3AtZC50b3ArKGYuaGVpZ2h0LWQuaGVpZ2h0KS8yKyJweCIpO2IuaG9yaXpvbnRhbGx5fHwKKHRoaXMuc3R5bGUubGVmdD1mLmxlZnQtZC5sZWZ0KyhmLndpZHRoLWQud2lkdGgpLzIrInB4Iil9fX0sX19nZXROb3JtYWxpemVkUmVjdDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8Yj09PXdpbmRvdz97dG9wOjAsbGVmdDowLHdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQscmlnaHQ6d2luZG93LmlubmVyV2lkdGgsYm90dG9tOndpbmRvdy5pbm5lckhlaWdodH06Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sX19nZXRPZmZzY3JlZW5BcmVhOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gTWF0aC5hYnMoTWF0aC5taW4oMCxiLnRvcCkrTWF0aC5taW4oMCxmLmJvdHRvbS0oYi50b3ArZC5oZWlnaHQpKSkqZC53aWR0aCtNYXRoLmFicyhNYXRoLm1pbigwLGIubGVmdCkrTWF0aC5taW4oMCxmLnJpZ2h0LShiLmxlZnQrZC53aWR0aCkpKSpkLmhlaWdodH0sX19nZXRQb3NpdGlvbjpmdW5jdGlvbihiLGQsCmYsaCxrLHQpe3ZhciBsPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLmJvdHRvbS1mLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsuYm90dG9tLWYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07CmlmKHRoaXMubm9PdmVybGFwKXtmb3IodmFyIHA9MCxtPWwubGVuZ3RoO3A8bTtwKyspe3ZhciBuPXt9LHE7Zm9yKHEgaW4gbFtwXSluW3FdPWxbcF1bcV07bC5wdXNoKG4pfWxbMF0udG9wPWxbMV0udG9wKz1rLmhlaWdodDtsWzJdLnRvcD1sWzNdLnRvcC09ay5oZWlnaHQ7bFs0XS5sZWZ0PWxbNl0ubGVmdCs9ay53aWR0aDtsWzVdLmxlZnQ9bFs3XS5sZWZ0LT1rLndpZHRofWQ9ImF1dG8iPT09ZD9udWxsOmQ7Yj0iYXV0byI9PT1iP251bGw6YjtiJiYiY2VudGVyIiE9PWJ8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGwucHVzaCh7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsuYm90dG9tLQpmLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pKTtkJiYibWlkZGxlIiE9PWR8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ay50b3AtaC5oZWlnaHQvMitrLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLndpZHRoOjApfSksbC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2sud2lkdGg6MCl9KSk7Im1pZGRsZSI9PT1kJiYiY2VudGVyIj09PQpiJiZsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspe2g9bFtwXTtrPWgudmVydGljYWxBbGlnbj09PWQ7bT1oLmhvcml6b250YWxBbGlnbj09PWI7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJmsmJm0pe3ZhciB1PWg7YnJlYWt9bj0oIWR8fGspJiYoIWJ8fG0pO2lmKHRoaXMuZHluYW1pY0FsaWdufHxuKXtoLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoaCxmLHQpO2lmKDA9PT1oLm9mZnNjcmVlbkFyZWEmJm4pe3U9aDticmVha311PXV8fGg7bj1oLm9mZnNjcmVlbkFyZWEtdS5vZmZzY3JlZW5BcmVhO2lmKDA+bnx8MD09PW4mJihrfHxtKSl1PWh9fXJldHVybiB1fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yZXNpemFibGUtYmVoYXZpb3IvaXJvbi1yZXNpemFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcj17cHJvcGVydGllczp7X3BhcmVudFJlc2l6YWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9wYXJlbnRSZXNpemFibGVDaGFuZ2VkIn0sX25vdGlmeWluZ0Rlc2NlbmRhbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7Imlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyI6Il9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcz1bXTt0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZT10aGlzLm5vdGlmeVJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKTp3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwKdGhpcy5fYm91bmROb3RpZnlSZXNpemUpO3RoaXMuX3BhcmVudFJlc2l6YWJsZT1udWxsfSxub3RpZnlSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeShiKSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudChiKX0sdGhpcyksdGhpcy5fZmlyZVJlc2l6ZSgpKX0sYXNzaWduUGFyZW50UmVzaXphYmxlOmZ1bmN0aW9uKGIpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT1ifSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGIpOy0xPGQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoZCwxKSx0aGlzLnVubGlzdGVuKGIsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKGIpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/Yi5zdG9wUHJvcGFnYXRpb24oKTpQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvd3x8dGhpcy5fZmlyZVJlc2l6ZSgpfSxfZmlyZVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1yZXNpemUiLG51bGwse25vZGU6dGhpcyxidWJibGVzOiExfSl9LF9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QhPT10aGlzJiYoLTE9PT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGQpJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMucHVzaChkKSx0aGlzLmxpc3RlbihkLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpLGQuYXNzaWduUGFyZW50UmVzaXphYmxlKHRoaXMpLHRoaXMuX25vdGlmeURlc2NlbmRhbnQoZCksYi5zdG9wUHJvcGFnYXRpb24oKSl9LApfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKGIpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsYi5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBiPXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24gZigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGYpO2IoKX0pfWVsc2UgdGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiLApudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYil7YiYmYi50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5wcmVwYXJlKCk6KGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWIudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1iLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1tYW5hZ2VyLmh0bWwuanMKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcz1mdW5jdGlvbigpe3RoaXMuX292ZXJsYXlzPVtdO3RoaXMuX21pbmltdW1aPTEwMTt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9bnVsbDtQb2x5bWVyLkdlc3R1cmVzLmFkZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsInRhcCIsZnVuY3Rpb24oKXt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfTsKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MsZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3RoaXMuX2JhY2tkcm9wRWxlbWVudHx8KHRoaXMuX2JhY2tkcm9wRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLW92ZXJsYXktYmFja2Ryb3AiKSk7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH0sZ2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiJiYhMSE9PWIgaW5zdGFuY2VvZiBFbGVtZW50fHwoYj1kb2N1bWVudC5ib2R5KTtmb3IoO2Iucm9vdCYmUG9seW1lci5kb20oYi5yb290KS5hY3RpdmVFbGVtZW50OyliPVBvbHltZXIuZG9tKGIucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gYn0sX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzW2JdO2lmKGQpe3ZhciBmPQp0aGlzLl9vdmVybGF5cy5sZW5ndGgtMSxoPXRoaXMuX292ZXJsYXlzW2ZdO2gmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShkLGgpJiZmLS07aWYoIShiPj1mKSl7aD1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihkKTw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihkLGgpO2I8ZjspdGhpcy5fb3ZlcmxheXNbYl09dGhpcy5fb3ZlcmxheXNbYisxXSxiKys7dGhpcy5fb3ZlcmxheXNbZl09ZH19fSxhZGRPclJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yi5vcGVuZWQ/dGhpcy5hZGRPdmVybGF5KGIpOnRoaXMucmVtb3ZlT3ZlcmxheShiKX0sYWRkT3ZlcmxheTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpO2lmKDA8PWQpdGhpcy5fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQoZCk7ZWxzZXtkPXRoaXMuX292ZXJsYXlzLmxlbmd0aDt2YXIgZj10aGlzLl9vdmVybGF5c1tkLTFdLGg9Ck1hdGgubWF4KHRoaXMuX2dldFooZiksdGhpcy5fbWluaW11bVopLGs9dGhpcy5fZ2V0WihiKTtmJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoYixmKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooZixoKSxkLS0saD1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW2QtMV0pLHRoaXMuX21pbmltdW1aKSk7azw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihiLGgpO3RoaXMuX292ZXJsYXlzLnNwbGljZShkLDAsYil9dGhpcy50cmFja0JhY2tkcm9wKCl9LHJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yj10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpOy0xIT09YiYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShiLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX0sY3VycmVudE92ZXJsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfSxjdXJyZW50T3ZlcmxheVo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLmN1cnJlbnRPdmVybGF5KCkpfSwKZW5zdXJlTWluaW11bVo6ZnVuY3Rpb24oYil7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosYil9LGZvY3VzT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuY3VycmVudE92ZXJsYXkoKTtiJiZiLl9hcHBseUZvY3VzKCl9LHRyYWNrQmFja2Ryb3A6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7aWYoYnx8dGhpcy5fYmFja2Ryb3BFbGVtZW50KXRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleD10aGlzLl9nZXRaKGIpLTEsdGhpcy5iYWNrZHJvcEVsZW1lbnQub3BlbmVkPSEhYix0aGlzLmJhY2tkcm9wRWxlbWVudC5wcmVwYXJlKCl9LGdldEJhY2tkcm9wczpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxkPTA7ZDx0aGlzLl9vdmVybGF5cy5sZW5ndGg7ZCsrKXRoaXMuX292ZXJsYXlzW2RdLndpdGhCYWNrZHJvcCYmYi5wdXNoKHRoaXMuX292ZXJsYXlzW2RdKTtyZXR1cm4gYn0sYmFja2Ryb3BaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0KMX0sX292ZXJsYXlXaXRoQmFja2Ryb3A6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTE7MDw9YjtiLS0paWYodGhpcy5fb3ZlcmxheXNbYl0ud2l0aEJhY2tkcm9wKXJldHVybiB0aGlzLl9vdmVybGF5c1tiXX0sX2dldFo6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fbWluaW11bVo7YiYmKGI9TnVtYmVyKGIuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS56SW5kZXgpLGI9PT1iJiYoZD1iKSk7cmV0dXJuIGR9LF9zZXRaOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS56SW5kZXg9ZH0sX2FwcGx5T3ZlcmxheVo6ZnVuY3Rpb24oYixkKXt0aGlzLl9zZXRaKGIsZCsyKX0sX292ZXJsYXlJblBhdGg6ZnVuY3Rpb24oYil7Yj1ifHxbXTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZihiW2RdLl9tYW5hZ2VyPT09dGhpcylyZXR1cm4gYltkXX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0KMTtpZigtMSE9PWQpZm9yKHZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGgsaDsoaD10aGlzLl9vdmVybGF5c1tkXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoZikhPT1oOylpZihoLl9vbkNhcHR1cmVDbGljayhiKSxoLmFsbG93Q2xpY2tUaHJvdWdoKWQtLTtlbHNlIGJyZWFrfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2QmJmQuX29uQ2FwdHVyZUZvY3VzKGIpfSxfb25DYXB0dXJlS2V5RG93bjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZCYmKFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsImVzYyIpP2QuX29uQ2FwdHVyZUVzYyhiKTpQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ0YWIiKSYmZC5fb25DYXB0dXJlVGFiKGIpKX0sX3Nob3VsZEJlQmVoaW5kT3ZlcmxheTpmdW5jdGlvbihiLGQpe3JldHVybiFiLmFsd2F5c09uVG9wJiYKZC5hbHdheXNPblRvcH19O1BvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyPW5ldyBQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9MCxkPTAsZj1udWxsLGg9W10saz1bIndoZWVsIiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSJdO1BvbHltZXIuSXJvblNjcm9sbE1hbmFnZXI9e2dldCBjdXJyZW50TG9ja2luZ0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbG9ja2luZ0VsZW1lbnRzW3RoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgtMV19LGVsZW1lbnRJc1Njcm9sbExvY2tlZDpmdW5jdGlvbih0KXt2YXIgbD10aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudDtpZih2b2lkIDA9PT1sKXJldHVybiExO2lmKHRoaXMuX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQodCkpcmV0dXJuITA7aWYodGhpcy5faGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50KHQpKXJldHVybiExOyhsPSEhbCYmbCE9PXQmJiF0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhsLHQpKT90aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUucHVzaCh0KTp0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKHQpOwpyZXR1cm4gbH0scHVzaFNjcm9sbExvY2s6ZnVuY3Rpb24odCl7MDw9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YodCl8fCgwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fbG9ja1Njcm9sbEludGVyYWN0aW9ucygpLHRoaXMuX2xvY2tpbmdFbGVtZW50cy5wdXNoKHQpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSl9LHJlbW92ZVNjcm9sbExvY2s6ZnVuY3Rpb24odCl7dD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZih0KTstMSE9PXQmJih0aGlzLl9sb2NraW5nRWxlbWVudHMuc3BsaWNlKHQsMSksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdLDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSl9LF9sb2NraW5nRWxlbWVudHM6W10sX2xvY2tlZEVsZW1lbnRDYWNoZTpudWxsLApfdW5sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCxfaGFzQ2FjaGVkTG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZih0KX0sX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKHQpfSxfY29tcG9zZWRUcmVlQ29udGFpbnM6ZnVuY3Rpb24odCxsKXt2YXIgcCxtO2lmKHQuY29udGFpbnMobCkpcmV0dXJuITA7dD1Qb2x5bWVyLmRvbSh0KS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50LHNsb3QiKTtmb3IocD0wO3A8dC5sZW5ndGg7KytwKXt2YXIgbj1Qb2x5bWVyLmRvbSh0W3BdKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKG09MDttPG4ubGVuZ3RoOysrbSlpZihuW21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKG5bbV0sbCkpcmV0dXJuITB9cmV0dXJuITF9LF9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dC5jYW5jZWxhYmxlJiYKdGhpcy5fc2hvdWxkUHJldmVudFNjcm9sbGluZyh0KSYmdC5wcmV2ZW50RGVmYXVsdCgpO3QudGFyZ2V0VG91Y2hlcyYmKHQ9dC50YXJnZXRUb3VjaGVzWzBdLGI9dC5wYWdlWCxkPXQucGFnZVkpfSxfbG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fHRoaXMuX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlci5iaW5kKHRoaXMpO2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sX3VubG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sCl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nOmZ1bmN0aW9uKHQpe3ZhciBsPVBvbHltZXIuZG9tKHQpLnJvb3RUYXJnZXQ7InRvdWNobW92ZSIhPT10LnR5cGUmJmYhPT1sJiYoZj1sLGg9dGhpcy5fZ2V0U2Nyb2xsYWJsZU5vZGVzKFBvbHltZXIuZG9tKHQpLnBhdGgpKTtpZighaC5sZW5ndGgpcmV0dXJuITA7aWYoInRvdWNoc3RhcnQiPT09dC50eXBlKXJldHVybiExO3Q9dGhpcy5fZ2V0U2Nyb2xsSW5mbyh0KTtyZXR1cm4hdGhpcy5fZ2V0U2Nyb2xsaW5nTm9kZShoLHQuZGVsdGFYLHQuZGVsdGFZKX0sX2dldFNjcm9sbGFibGVOb2RlczpmdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD10LmluZGV4T2YodGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQpLG09MDttPD1wO20rKylpZih0W21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBuPXRbbV0scT1uLnN0eWxlOyJzY3JvbGwiIT09cS5vdmVyZmxvdyYmImF1dG8iIT09cS5vdmVyZmxvdyYmKHE9d2luZG93LmdldENvbXB1dGVkU3R5bGUobikpOwoic2Nyb2xsIiE9PXEub3ZlcmZsb3cmJiJhdXRvIiE9PXEub3ZlcmZsb3d8fGwucHVzaChuKX1yZXR1cm4gbH0sX2dldFNjcm9sbGluZ05vZGU6ZnVuY3Rpb24odCxsLHApe2lmKGx8fHApZm9yKHZhciBtPU1hdGguYWJzKHApPj1NYXRoLmFicyhsKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBxPXRbbl07aWYobT8wPnA/MDxxLnNjcm9sbFRvcDpxLnNjcm9sbFRvcDxxLnNjcm9sbEhlaWdodC1xLmNsaWVudEhlaWdodDowPmw/MDxxLnNjcm9sbExlZnQ6cS5zY3JvbGxMZWZ0PHEuc2Nyb2xsV2lkdGgtcS5jbGllbnRXaWR0aClyZXR1cm4gcX19LF9nZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBsPXtkZWx0YVg6dC5kZWx0YVgsZGVsdGFZOnQuZGVsdGFZfTsiZGVsdGFYImluIHR8fCgid2hlZWxEZWx0YVgiaW4gdCYmIndoZWVsRGVsdGFZImluIHQ/KGwuZGVsdGFYPS10LndoZWVsRGVsdGFYLGwuZGVsdGFZPS10LndoZWVsRGVsdGFZKToid2hlZWxEZWx0YSJpbiB0PyhsLmRlbHRhWD0KMCxsLmRlbHRhWT0tdC53aGVlbERlbHRhKToiYXhpcyJpbiB0PyhsLmRlbHRhWD0xPT09dC5heGlzP3QuZGV0YWlsOjAsbC5kZWx0YVk9Mj09PXQuYXhpcz90LmRldGFpbDowKTp0LnRhcmdldFRvdWNoZXMmJih0PXQudGFyZ2V0VG91Y2hlc1swXSxsLmRlbHRhWD1iLXQucGFnZVgsbC5kZWx0YVk9ZC10LnBhZ2VZKSk7cmV0dXJuIGx9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tZm9jdXNhYmxlcy1oZWxwZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1FbGVtZW50LnByb3RvdHlwZSxkPWIubWF0Y2hlc3x8Yi5tYXRjaGVzU2VsZWN0b3J8fGIubW96TWF0Y2hlc1NlbGVjdG9yfHxiLm1zTWF0Y2hlc1NlbGVjdG9yfHxiLm9NYXRjaGVzU2VsZWN0b3J8fGIud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1BvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXI9e2dldFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZil7dmFyIGg9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGYsaCk/dGhpcy5fc29ydEJ5VGFiSW5kZXgoaCk6aH0saXNGb2N1c2FibGU6ZnVuY3Rpb24oZil7cmV0dXJuIGQuY2FsbChmLCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9kLmNhbGwoZiwiOm5vdChbZGlzYWJsZWRdKSIpOmQuY2FsbChmLCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9LGlzVGFiYmFibGU6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZikmJgpkLmNhbGwoZiwnOm5vdChbdGFiaW5kZXhceDNkIi0xIl0pJykmJnRoaXMuX2lzVmlzaWJsZShmKX0sX25vcm1hbGl6ZWRUYWJJbmRleDpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShmKT8oZj1mLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MCxOdW1iZXIoZikpOi0xfSxfY29sbGVjdFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZixoKXtpZihmLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREV8fCF0aGlzLl9pc1Zpc2libGUoZikpcmV0dXJuITE7dmFyIGs9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KGYpLHQ9MDxrOzA8PWsmJmgucHVzaChmKTtmPSJjb250ZW50Ij09PWYubG9jYWxOYW1lfHwic2xvdCI9PT1mLmxvY2FsTmFtZT9Qb2x5bWVyLmRvbShmKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6UG9seW1lci5kb20oZi5yb290fHxmKS5jaGlsZHJlbjtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKXQ9dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZltrXSxoKXx8dDsKcmV0dXJuIHR9LF9pc1Zpc2libGU6ZnVuY3Rpb24oZil7dmFyIGg9Zi5zdHlsZTtyZXR1cm4iaGlkZGVuIiE9PWgudmlzaWJpbGl0eSYmIm5vbmUiIT09aC5kaXNwbGF5PyhoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYpLCJoaWRkZW4iIT09aC52aXNpYmlsaXR5JiYibm9uZSIhPT1oLmRpc3BsYXkpOiExfSxfc29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZil7dmFyIGg9Zi5sZW5ndGg7aWYoMj5oKXJldHVybiBmO3ZhciBrPU1hdGguY2VpbChoLzIpO2g9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZi5zbGljZSgwLGspKTtmPXRoaXMuX3NvcnRCeVRhYkluZGV4KGYuc2xpY2UoaykpO3JldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGgsZil9LF9tZXJnZVNvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGYsaCl7Zm9yKHZhciBrPVtdOzA8Zi5sZW5ndGgmJjA8aC5sZW5ndGg7KXRoaXMuX2hhc0xvd2VyVGFiT3JkZXIoZlswXSxoWzBdKT9rLnB1c2goaC5zaGlmdCgpKTprLnB1c2goZi5zaGlmdCgpKTsKcmV0dXJuIGsuY29uY2F0KGYsaCl9LF9oYXNMb3dlclRhYk9yZGVyOmZ1bmN0aW9uKGYsaCl7Zj1NYXRoLm1heChmLnRhYkluZGV4LDApO2g9TWF0aC5tYXgoaC50YWJJbmRleCwwKTtyZXR1cm4gMD09PWZ8fDA9PT1oP2g+ZjpmPmh9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e29wZW5lZDp7b2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjYW5jZWxlZDp7b2JzZXJ2ZXI6Il9jYW5jZWxlZENoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2l0aEJhY2tkcm9wOntvYnNlcnZlcjoiX3dpdGhCYWNrZHJvcENoYW5nZWQiLHR5cGU6Qm9vbGVhbn0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbkVzY0tleTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NpbmdSZWFzb246e3R5cGU6T2JqZWN0fSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsbG93Q2xpY2tUaHJvdWdoOnt0eXBlOkJvb2xlYW59LGFsd2F5c09uVG9wOnt0eXBlOkJvb2xlYW59LApzY3JvbGxBY3Rpb246e3R5cGU6U3RyaW5nfSxfbWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJ9LF9mb2N1c2VkQ2hpbGQ6e3R5cGU6T2JqZWN0fX0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJfb25Jcm9uUmVzaXplIn0sb2JzZXJ2ZXJzOlsiX191cGRhdGVTY3JvbGxPYnNlcnZlcnMoaXNBdHRhY2hlZCwgb3BlbmVkLCBzY3JvbGxBY3Rpb24pIl0sZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3JldHVybiB0aGlzLl9tYW5hZ2VyLmJhY2tkcm9wRWxlbWVudH0sZ2V0IF9mb2N1c05vZGUoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZENoaWxkfHxQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJbYXV0b2ZvY3VzXSIpfHx0aGlzfSxnZXQgX2ZvY3VzYWJsZU5vZGVzKCl7cmV0dXJuIFBvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXIuZ2V0VGFiYmFibGVOb2Rlcyh0aGlzKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9CnRoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1udWxsO3RoaXMuX19yYWZzPXt9O3RoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDt0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKTt0aGlzLl9fcm9vdE5vZGVzPW51bGw7dGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTt0aGlzLl9vYnNlcnZlcj1udWxsO2Zvcih2YXIgYiBpbiB0aGlzLl9fcmFmcyludWxsIT09CnRoaXMuX19yYWZzW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1tiXSk7dGhpcy5fX3JhZnM9e307dGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpO3RoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsYix7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9CiExKX0saW52YWxpZGF0ZVRhYmJhYmxlczpmdW5jdGlvbigpe3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGx9LF9lbnN1cmVTZXR1cDpmdW5jdGlvbigpe3RoaXMuX292ZXJsYXlTZXR1cHx8KHRoaXMuX292ZXJsYXlTZXR1cD0hMCx0aGlzLnN0eWxlLm91dGxpbmU9Im5vbmUiLHRoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpOnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9faXNBbmltYXRpbmc9ITAsdGhpcy5fX2RlcmFmKCJfX29wZW5lZENoYW5nZWQiLHRoaXMuX19vcGVuZWRDaGFuZ2VkKSl9LF9jYW5jZWxlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fTt0aGlzLmNsb3NpbmdSZWFzb24uY2FuY2VsZWQ9CnRoaXMuY2FuY2VsZWR9LF93aXRoQmFja2Ryb3BDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy53aXRoQmFja2Ryb3AmJiF0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT8odGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITApOnRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleCYmKHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMSk7dGhpcy5vcGVuZWQmJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbWFuYWdlci50cmFja0JhY2tkcm9wKCl9LF9wcmVwYXJlUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDt0aGlzLl9wcmVwYXJlUG9zaXRpb25pbmcoKTt0aGlzLnJlZml0KCk7dGhpcy5fZmluaXNoUG9zaXRpb25pbmcoKTt0aGlzLm5vQXV0b0ZvY3VzJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09CnRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc3R5bGUuekluZGV4PSIiO3RoaXMubm90aWZ5UmVzaXplKCk7dGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj0KdGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSJub25lIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ibm9uZSI7dGhpcy5zdHlsZS5kaXNwbGF5PSIifSxfZmluaXNoUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249IiI7dGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiI7dGhpcy5zdHlsZS5kaXNwbGF5PSIiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe2lmKHRoaXMub3BlbmVkKXRoaXMubm9BdXRvRm9jdXN8fHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpO2Vsc2V7dGhpcy5fZm9jdXNOb2RlLmJsdXIoKTt0aGlzLl9mb2N1c2VkQ2hpbGQ9bnVsbDtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJgp0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSl7dmFyIGI9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsoYj09PWRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMpLmRlZXBDb250YWlucyhiKSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDsoYj10aGlzLl9tYW5hZ2VyLmN1cnJlbnRPdmVybGF5KCkpJiZ0aGlzIT09YiYmYi5fYXBwbHlGb2N1cygpfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwoYil9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDstMT09PWQuaW5kZXhPZih0aGlzKT8oYi5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1kWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbihiKXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fAp0aGlzLmNhbmNlbChiKX0sX29uQ2FwdHVyZVRhYjpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dGhpcy5fX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXMoKTt2YXIgZD1iLnNoaWZ0S2V5LGY9ZD90aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlOnRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZTtkPWQ/dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOnRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU7aWYoZj09PWQpZj0hMDtlbHNle3ZhciBoPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7Zj1oPT09Znx8aD09PXRoaXN9ZiYmKGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ2hpbGQ9ZCx0aGlzLl9hcHBseUZvY3VzKCkpfX0sX29uSXJvblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiZ0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KX0sX29uTm9kZXNDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmCih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGV8fCF0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGUpe3ZhciBiPXRoaXMuX2ZvY3VzYWJsZU5vZGVzO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9YlswXTt0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9YltiLmxlbmd0aC0xXX19LF9fb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkPyh0aGlzLl9wcmVwYXJlUmVuZGVyT3BlbmVkKCksdGhpcy5fbWFuYWdlci5hZGRPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJPcGVuZWQoKSk6KHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyQ2xvc2VkKCkpfSxfX2RlcmFmOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5fX3JhZnM7Cm51bGwhPT1mW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZShmW2JdKTtmW2JdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2ZbYl09bnVsbDtkLmNhbGwodGhpcyl9LmJpbmQodGhpcykpfSxfX3VwZGF0ZVNjcm9sbE9ic2VydmVyczpmdW5jdGlvbihiLGQsZil7YiYmZCYmdGhpcy5fX2lzVmFsaWRTY3JvbGxBY3Rpb24oZik/KCJsb2NrIj09PWYmJih0aGlzLl9fc2F2ZVNjcm9sbFBvc2l0aW9uKCksUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5wdXNoU2Nyb2xsTG9jayh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5yZW1vdmVTY3JvbGxMb2NrKHRoaXMpLHRoaXMuX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKSl9LF9fYWRkU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19yb290Tm9kZXMpe3RoaXMuX19yb290Tm9kZXM9W107aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpZm9yKHZhciBiPQp0aGlzO2I7KWIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJmIuaG9zdCYmdGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGIpLGI9Yi5ob3N0fHxiLmFzc2lnbmVkU2xvdHx8Yi5wYXJlbnROb2RlO3RoaXMuX19yb290Tm9kZXMucHVzaChkb2N1bWVudCl9dGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyl9LF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fX3Jvb3ROb2RlcyYmdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyk7dGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKGIpe3JldHVybiJsb2NrIj09PQpifHwicmVmaXQiPT09Ynx8ImNhbmNlbCI9PT1ifSxfX29uQ2FwdHVyZVNjcm9sbDpmdW5jdGlvbihiKXtpZighKHRoaXMuX19pc0FuaW1hdGluZ3x8MDw9UG9seW1lci5kb20oYikucGF0aC5pbmRleE9mKHRoaXMpKSlzd2l0Y2godGhpcy5zY3JvbGxBY3Rpb24pe2Nhc2UgImxvY2siOnRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTticmVhaztjYXNlICJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSAiY2FuY2VsIjp0aGlzLmNhbmNlbChiKX19LF9fc2F2ZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8odGhpcy5fX3Njcm9sbFRvcD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCx0aGlzLl9fc2Nyb2xsTGVmdD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQpOih0aGlzLl9fc2Nyb2xsVG9wPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsCmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSx0aGlzLl9fc2Nyb2xsTGVmdD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKX0sX19yZXN0b3JlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyhkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpfX07UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yPVtQb2x5bWVyLklyb25GaXRCZWhhdmlvcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvciwKUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZW50cnlBbmltYXRpb246e29ic2VydmVyOiJfZW50cnlBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ30sZXhpdEFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9leGl0QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9fSxfZW50cnlBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmVudHJ5PVt7bmFtZTp0aGlzLmVudHJ5QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfZXhpdEFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZXhpdD1be25hbWU6dGhpcy5leGl0QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfY29weVByb3BlcnRpZXM6ZnVuY3Rpb24oYiwKZCl7Zm9yKHZhciBmIGluIGQpYltmXT1kW2ZdfSxfY2xvbmVDb25maWc6ZnVuY3Rpb24oYil7dmFyIGQ9e2lzQ2xvbmU6ITB9O3RoaXMuX2NvcHlQcm9wZXJ0aWVzKGQsYik7cmV0dXJuIGR9LF9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmU6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnKWlmKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZXt2YXIgaD1iP3RoaXMuYW5pbWF0aW9uQ29uZmlnW2JdOnRoaXMuYW5pbWF0aW9uQ29uZmlnO0FycmF5LmlzQXJyYXkoaCl8fChoPVtoXSk7aWYoaClmb3IodmFyIGssdD0wO2s9CmhbdF07dCsrKWlmKGsuYW5pbWF0YWJsZSlrLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShrLnR5cGV8fGIsZCxmKTtlbHNlIGlmKGsuaWQpe3ZhciBsPWRbay5pZF07bD8obC5pc0Nsb25lfHwoZFtrLmlkXT10aGlzLl9jbG9uZUNvbmZpZyhsKSxsPWRbay5pZF0pLHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGwsaykpOmRbay5pZF09a31lbHNlIGYucHVzaChrKX19LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbihiKXt2YXIgZD17fSxmPVtdO3RoaXMuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShiLGQsZik7Zm9yKHZhciBoIGluIGQpZi5wdXNoKGRbaF0pO3JldHVybiBmfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tcnVubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JJbXBsPXtfY29uZmlndXJlQW5pbWF0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1bXSxmPVtdO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBoLGs9MDtoPWJba107aysrKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGgubmFtZSk7aWYodC5pc05lb25BbmltYXRpb24pe3ZhciBsPW51bGw7dC5jb25maWd1cmV8fCh0LmNvbmZpZ3VyZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSk7bD10LmNvbmZpZ3VyZShoKTtmLnB1c2goe3Jlc3VsdDpsLGNvbmZpZzpofSl9ZWxzZSBjb25zb2xlLndhcm4odGhpcy5pcysiOiIsaC5uYW1lLCJub3QgZm91bmQhIil9Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyl7bD1mW2JdLnJlc3VsdDtoPWZbYl0uY29uZmlnO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgbC5jYW5jZWwmJihsPWRvY3VtZW50LnRpbWVsaW5lLnBsYXkobCkpfWNhdGNoKHApe2w9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsCiIoIixoLm5hbWUsIikuIixwKX1sJiZkLnB1c2goe25lb25BbmltYXRpb246dCxjb25maWc6aCxhbmltYXRpb246bH0pfXJldHVybiBkfSxfc2hvdWxkQ29tcGxldGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPSEwLGY9MDtmPGIubGVuZ3RoO2YrKylpZigiZmluaXNoZWQiIT1iW2ZdLmFuaW1hdGlvbi5wbGF5U3RhdGUpe2Q9ITE7YnJlYWt9cmV0dXJuIGR9LF9jb21wbGV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdLm5lb25BbmltYXRpb24uY29tcGxldGUoYltkXS5jb25maWcpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYltkXS5hbmltYXRpb24uY2FuY2VsKCl9LHBsYXlBbmltYXRpb246ZnVuY3Rpb24oYixkKXt2YXIgZj10aGlzLmdldEFuaW1hdGlvbkNvbmZpZyhiKTtpZihmKXt0aGlzLl9hY3RpdmU9dGhpcy5fYWN0aXZlfHx7fTt0aGlzLl9hY3RpdmVbYl0mJih0aGlzLl9jb21wbGV0ZSh0aGlzLl9hY3RpdmVbYl0pLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYl0pOwp2YXIgaD10aGlzLl9jb25maWd1cmVBbmltYXRpb25zKGYpO2lmKDA9PWgubGVuZ3RoKXRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSk7ZWxzZSBmb3IodGhpcy5fYWN0aXZlW2JdPWgsZj0wO2Y8aC5sZW5ndGg7ZisrKWhbZl0uYW5pbWF0aW9uLm9uZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkQ29tcGxldGUoaCkmJih0aGlzLl9jb21wbGV0ZShoKSxkZWxldGUgdGhpcy5fYWN0aXZlW2JdLHRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSkpfS5iaW5kKHRoaXMpfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIHRoaXMuX2FjdGl2ZSl7dmFyIGQ9dGhpcy5fYWN0aXZlW2JdLGY7Zm9yKGYgaW4gZClkW2ZdLmFuaW1hdGlvbi5jYW5jZWwoKX10aGlzLl9hY3RpdmU9e319fTsKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3I9W1BvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZHJvcGRvd24vaXJvbi1kcm9wZG93bi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkRyb3Bkb3duU2Nyb2xsTWFuYWdlcj1Qb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWRyb3Bkb3duL2lyb24tZHJvcGRvd24uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1kcm9wZG93biIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sCmxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KSJdLGdldCBjb250YWluZWRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj10aGlzLmFsbG93T3V0c2lkZVNjcm9sbD8icmVmaXQiOiJsb2NrIik7dGhpcy5fcmVhZGllZD0hMH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNpemluZ1RhcmdldCYmdGhpcy5zaXppbmdUYXJnZXQhPT0KdGhpc3x8KHRoaXMuc2l6aW5nVGFyZ2V0PXRoaXMuY29udGFpbmVkRWxlbWVudHx8dGhpcyl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5kaXNhYmxlZD90aGlzLmNhbmNlbCgpOih0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMuX3VwZGF0ZUFuaW1hdGlvbkNvbmZpZygpLFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcub3Blbj8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigib3BlbiIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcuY2xvc2U/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oImNsb3NlIikpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIik7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5jb250YWluZWRFbGVtZW50LGQ9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHwKW10pLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLm5vZGU9Yjt0aGlzLmFuaW1hdGlvbkNvbmZpZz17b3Blbjp0aGlzLm9wZW5BbmltYXRpb25Db25maWcsY2xvc2U6dGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ319LF91cGRhdGVPdmVybGF5UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm90aWZ5UmVzaXplKCl9LF9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX3JlYWRpZWQmJihiP3RoaXMuc2Nyb2xsQWN0aW9uJiYibG9jayIhPT10aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPSJyZWZpdCIpOnRoaXMuc2Nyb2xsQWN0aW9uPSJsb2NrIil9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c1RhcmdldHx8dGhpcy5jb250YWluZWRFbGVtZW50O2ImJnRoaXMub3BlbmVkJiYhdGhpcy5ub0F1dG9Gb2N1cz9iLmZvY3VzKCk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLAphcmd1bWVudHMpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25UaW1pbmc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2R1cmF0aW9uOjUwMCxlYXNpbmc6ImN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiLGZpbGw6ImJvdGgifX19fSxpc05lb25BbmltYXRpb246ITAsY3JlYXRlZDpmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYW5pbWF0ZXx8Y29uc29sZS53YXJuKCJObyB3ZWIgYW5pbWF0aW9ucyBkZXRlY3RlZC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGZ1bmN0aW9uIHdpdGhvdXQgYSB3ZWIgYW5pbWF0aW9ucyBwb2x5ZmlsbC4iKX0sdGltaW5nRnJvbUNvbmZpZzpmdW5jdGlvbihiKXtpZihiLnRpbWluZylmb3IodmFyIGQgaW4gYi50aW1pbmcpdGhpcy5hbmltYXRpb25UaW1pbmdbZF09Yi50aW1pbmdbZF07cmV0dXJuIHRoaXMuYW5pbWF0aW9uVGltaW5nfSxzZXRQcmVmaXhlZFByb3BlcnR5OmZ1bmN0aW9uKGIsZCxmKXtmb3IodmFyIGg9Cnt0cmFuc2Zvcm06WyJ3ZWJraXRUcmFuc2Zvcm0iXSx0cmFuc2Zvcm1PcmlnaW46WyJtb3pUcmFuc2Zvcm1PcmlnaW4iLCJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXX1bZF0sayx0PTA7az1oW3RdO3QrKyliLnN0eWxlW2tdPWY7Yi5zdHlsZVtkXT1mfSxjb21wbGV0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1pbi1hbmltYXRpb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFkZS1pbi1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIwIn0se29wYWNpdHk6IjEifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL2ZhZGUtb3V0LWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLW91dC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIxIn0se29wYWNpdHk6IjAifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi1hbmltYXRpb25zLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZCxbe2hlaWdodDpmLzIrInB4In0se2hlaWdodDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pO1BvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6Zi8yKyJweCJ9LHt3aWR0aDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6ZisicHgifSx7d2lkdGg6Zi1mLzIwKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3ZhciBkPWIubm9kZSxmPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3RoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShkLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKTtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7aGVpZ2h0OmYrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSx7aGVpZ2h0OmYvMisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMjBweCkifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtBTklNQVRJT05fQ1VCSUNfQkVaSUVSOiJjdWJpYy1iZXppZXIoLjMsLjk1LC41LDEpIixNQVhfQU5JTUFUSU9OX1RJTUVfTVM6NDAwfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbj1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlZ2lzdGVyZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5hZGRPd25LZXlCaW5kaW5nPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUucmVtb3ZlT3duS2V5QmluZGluZ3M9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fY29sbGVjdEtleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3ByZXBLZXlCaW5kaW5ncz0KZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fYWRkS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fb25LZXlCaW5kaW5nRXZlbnQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fdHJpZ2dlcktleUhhbmRsZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fZm9jdXNCbHVySGFuZGxlcj1mdW5jdGlvbihkKXtpZihQb2x5bWVyLkVsZW1lbnQpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09CmQudHlwZSk7ZWxzZSBpZihkLnRhcmdldD09PXRoaXMpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09ZC50eXBlKTtlbHNlIGlmKHRoaXMuX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nKXt2YXIgZj1Qb2x5bWVyLmRvbShkKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KGYpfHx0aGlzLmZpcmUoZC50eXBlLHtzb3VyY2VFdmVudDpkfSx7bm9kZTp0aGlzLGJ1YmJsZXM6ZC5idWJibGVzLGNhbmNlbGFibGU6ZC5jYW5jZWxhYmxlfSl9fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NoYW5nZWRDb250cm9sU3RhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkJiZ0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkKCl9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fc2V0Rm9jdXNlZD1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b249UG9seW1lcih7aXM6InBhcGVyLW1lbnUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsClBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjIwMH19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoxNTAsZWFzaW5nOmIuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzpiLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fV19fSxjbG9zZUFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoxNTB9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjo1MCxlYXNpbmc6Yi5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX0sCntuYW1lOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIix0aW1pbmc6e2R1cmF0aW9uOjIwMCxlYXNpbmc6ImVhc2UtaW4ifX1dfX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIGQ9UG9seW1lci5kb20odGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxmPTAsaD1kLmxlbmd0aDtmPGg7ZisrKWlmKGRbZl0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gZFtmXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/CnRoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX0sb3BlbjpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuJC5kcm9wZG93bi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLmRyb3Bkb3duLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlT25BY3RpdmF0ZSYmdGhpcy5jbG9zZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2Q/KHRoaXMuX2Ryb3Bkb3duQ29udGVudD10aGlzLmNvbnRlbnRFbGVtZW50LHRoaXMuZmlyZSgicGFwZXItZHJvcGRvd24tb3BlbiIpKTpudWxsIT1mJiZ0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLWNsb3NlIil9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2QmJnRoaXMub3BlbmVkJiYKdGhpcy5jbG9zZSgpfSxfX29uSXJvbk92ZXJsYXlDYW5jZWxlZDpmdW5jdGlvbihkKXt2YXIgZj10aGlzLiQudHJpZ2dlcjstMTxQb2x5bWVyLmRvbShkLmRldGFpbCkucGF0aC5pbmRleE9mKGYpJiZkLnByZXZlbnREZWZhdWx0KCl9fSk7T2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbihkKXtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbltkXT1iW2RdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5hbWUrIjoiK2J9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYixkKXt0aGlzLnJlbW92ZUljb24oYik7CmlmKGQ9dGhpcy5fY2xvbmVJY29uKGQsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGIpKSl7dmFyIGY9UG9seW1lci5kb20oYi5yb290fHxiKTtmLmluc2VydEJlZm9yZShkLGYuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGIuX3N2Z0ljb249ZH1yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihiKXtiLl9zdmdJY29uJiYoUG9seW1lci5kb20oYi5yb290fHxiKS5yZW1vdmVDaGlsZChiLl9zdmdJY29uKSxiLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYil7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYiYmYi5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGI9Yi5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YiYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYj1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZC5pZF09ZH0pO3JldHVybiBifSxfY2xvbmVJY29uOmZ1bmN0aW9uKGIsZCl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2JdLAp0aGlzLnNpemUsZCl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYixkLGYpe2lmKGIpe2I9Yi5jbG9uZU5vZGUoITApO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtkPWIuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitkKyIgIitkO3ZhciBrPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtmJiZiLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoays9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtoLnNldEF0dHJpYnV0ZSgidmlld0JveCIsZCk7aC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7aC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7aC5zdHlsZS5jc3NUZXh0PQprO2guYXBwZW5kQ2hpbGQoYikucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBofXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRyb3Bkb3duLW1lbnUvcGFwZXItZHJvcGRvd24tbWVudS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1kcm9wZG93bi1tZW51IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJyaWdodCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AifSx2ZXJ0aWNhbE9mZnNldDpOdW1iZXIsZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5jb250ZW50RWxlbWVudDtiJiZiLnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihiKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYi5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKX0sX29uVGFwOmZ1bmN0aW9uKGIpe1BvbHltZXIuR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0KGIpPT09dGhpcyYmCnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnZhbHVlPWI9Yj9iLmxhYmVsfHxiLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8Yi50ZXh0Q29udGVudC50cmltKCk6IiI7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoYil9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGQ/ZDpiPy00Ojh9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5yZXF1aXJlZCYmISF0aGlzLnZhbHVlfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3BlbmVkPyJ0cnVlIjoiZmFsc2UiLGQ9dGhpcy5jb250ZW50RWxlbWVudDtkJiZkLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1ifTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpeyghYnx8MD5iLmluZGV4T2YoZCkpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChkLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYil9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihiLGQpe2lmKG51bGwhPWImJmQhPT10aGlzLmlzU2VsZWN0ZWQoYikpe2lmKGQpdGhpcy5zZWxlY3Rpb24ucHVzaChiKTtlbHNle3ZhciBmPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYik7MDw9ZiYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGYsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhiLGQpfX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGIpOnRoaXMuZ2V0KCkhPT1iJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYil7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhdGhpcy5pc1NlbGVjdGVkKGIpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGIpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZD1ifSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXMubGVuZ3RoO2I9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYiklYjt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBiPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGIpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmxpc3Rlbih0aGlzLGIsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMudW5saXN0ZW4odGhpcyxiLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGQpO3RoaXMuX2FkZExpc3RlbmVyKGIpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGIsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhiKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBiPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2I/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChiKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYi5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYildfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGIpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgZD0wLGY7Zj10aGlzLml0ZW1zW2RdO2QrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGYpPT1iKXJldHVybiBkfWVsc2UgcmV0dXJuIE51bWJlcihiKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihiKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYj10aGlzLml0ZW1zW2JdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYil9ZWxzZSByZXR1cm4gYn0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGI9dGhpcy5pbmRleE9mKGIpLC0xPT09Yj9udWxsOmI7dmFyIGQ9YltQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWQ/ZDpiLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihiLGQpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZCxiKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGQsYik7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGQ/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06Yn0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIFBvbHltZXIuZG9tKGIpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihkKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApkLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7Zm9yKHZhciBkPXRoaXMuaXRlbXM7YiYmYiE9dGhpczspe3ZhciBmPWQuaW5kZXhPZihiKTtpZigwPD1mKXtkPXRoaXMuX2luZGV4VG9WYWx1ZShmKTt0aGlzLl9pdGVtQWN0aXZhdGUoZCxiKTticmVha31iPWIucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYixkKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDpiLGl0ZW06ZH0se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChiKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYik6dGhpcy5zZWxlY3RlZD1ifSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWI7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihiKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gbnVsbCE9Yn0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYil7Yj0KYnx8W107Yj0odGhpcy5fdmFsdWVzVG9JdGVtcyhiKXx8W10pLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gbnVsbCE9PWYmJnZvaWQgMCE9PWZ9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYik7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChiW2RdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYiksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIubGVuZ3RoP2JbMF06bnVsbCkpOm51bGwhPT1iJiZ2b2lkIDAhPT1iPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtiXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShiKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYik7MD5kP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGIpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZCwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWI/bnVsbDpiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oZCl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtkJiZkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGQpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGQ9PT1iPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGIpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGIua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgZD10aGlzLl9zZWFyY2hUZXh0fHwiIjtkKz0oYi5rZXkmJjE9PWIua2V5Lmxlbmd0aD9iLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGIua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmI9ZC5sZW5ndGg7Zm9yKHZhciBmPTAsaDtoPXRoaXMuaXRlbXNbZl07ZisrKWlmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2s9KGhba118fGguZ2V0QXR0cmlidXRlKGspfHwiIikudHJpbSgpO2lmKCEoay5sZW5ndGg8YikmJmsuc2xpY2UoMCxiKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1kKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShoKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1kO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5pdGVtcy5sZW5ndGgsZD1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxmPTE7ZjwKYisxO2YrKyl7dmFyIGg9dGhpcy5pdGVtc1soZC1mK2IpJWJdO2lmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9UG9seW1lci5kb20oaCkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGgpO2lmKFBvbHltZXIuZG9tKGspLmFjdGl2ZUVsZW1lbnQ9PWgpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aCxkPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGY9MTtmPGIrMTtmKyspe3ZhciBoPXRoaXMuaXRlbXNbKGQrZiklYl07aWYoIWguaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgaz1Qb2x5bWVyLmRvbShoKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaCk7aWYoUG9seW1lci5kb20oaykuYWN0aXZlRWxlbWVudD09aClicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYixkKXtkP2Iuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTpiLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmZC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYnx8Yi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChiLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYi5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXtiLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihiKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0LGI9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBiLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGIpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgZD10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2Q/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZCk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c2VkSXRlbTtiJiZiLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7Yj8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbGlzdGJveC9wYXBlci1saXN0Ym94Lmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToib3B0aW9uIix0YWJpbmRleDoiMCJ9fTtQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JdfSk7CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIHJjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrLHQpe2xldCBsOyhmdW5jdGlvbihtKXttW20uTkFUVVJBTD0wXT0iTkFUVVJBTCI7bVttLlJFQUw9MV09IlJFQUwiO21bbS5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjttW20uRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGx8fChsPXt9KSk7bGV0IHA9bC5OQVRVUkFMO2Zvcig7dDxrLmxlbmd0aDt0KyspaWYocD09PWwuTkFUVVJBTClpZigiLiI9PT1rW3RdKXA9bC5SRUFMO2Vsc2UgaWYoImUiPT09a1t0XXx8IkUiPT09a1t0XSlwPWwuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFmKGtbdF0pKWJyZWFrfWVsc2UgaWYocD09PWwuUkVBTClpZigiZSI9PT1rW3RdfHwiRSI9PT1rW3RdKXA9bC5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWYoa1t0XSkpYnJlYWt9ZWxzZSBpZihwPT09bC5FWFBPTkVOVF9TSUdOKWlmKGYoa1t0XSl8fCIrIj09PWtbdF18fCItIj09PWtbdF0pcD1sLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihwPT09bC5FWFBPTkVOVCYmCiFmKGtbdF0pKWJyZWFrO3JldHVybiB0fWZ1bmN0aW9uIGYoayl7cmV0dXJuIjAiPD1rJiYiOSI+PWt9ZnVuY3Rpb24gaChrKXtyZXR1cm4iLyI9PT1rfHwiXyI9PT1rfHxmKGspfWIuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGssdCl7bGV0IGw9MCxwPTA7Zm9yKDs7KXtpZihsPT09ay5sZW5ndGgpcmV0dXJuIHA9PT10Lmxlbmd0aD8wOi0xO2lmKHA9PT10Lmxlbmd0aClyZXR1cm4gMTtpZihmKGtbbF0pJiZmKHRbcF0pKXt2YXIgbT1sLG49cDtsPWQoayxsKzEpO3A9ZCh0LHArMSk7bT1wYXJzZUZsb2F0KGsuc2xpY2UobSxsKSk7bj1wYXJzZUZsb2F0KHQuc2xpY2UobixwKSk7aWYobTxuKXJldHVybi0xO2lmKG0+bilyZXR1cm4gMX1lbHNle2lmKGgoa1tsXSkpe2lmKCFoKHRbcF0pKXJldHVybi0xfWVsc2V7aWYoaCh0W3BdKSlyZXR1cm4gMTtpZihrW2xdPHRbcF0pcmV0dXJuLTE7aWYoa1tsXT50W3BdKXJldHVybiAxfWwrKztwKyt9fX19KShyY3x8KHJjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgdmM7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHEsdSx4LEEpe2NvbnN0IHk9bmV3IFhNTEh0dHBSZXF1ZXN0O3kub3BlbihxLHUpO3gmJih5LndpdGhDcmVkZW50aWFscz14KTtBJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsQSk7cmV0dXJuIHl9ZnVuY3Rpb24gZihxKXtjb25zdCB1PW5ldyBtO2lmKCFxKXJldHVybiB1Lm1ldGhvZFR5cGU9cC5HRVQsdTt1Lm1ldGhvZFR5cGU9cC5QT1NUO3UuYm9keT1oKHEpO3JldHVybiB1fWZ1bmN0aW9uIGgocSl7Y29uc3QgdT1uZXcgRm9ybURhdGE7Zm9yKGxldCB4IGluIHEpeCYmdS5hcHBlbmQoeCxxW3hdKTtyZXR1cm4gdX1jbGFzcyBrIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19Yi5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9aztjbGFzcyB0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IocSl7c3VwZXIocSk7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQucHJvdG90eXBlKX19Yi5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj10O2NsYXNzIGwgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihxLHUpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Euc3RhdHVzfSBhdCAke3V9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXE7dGhpcy51cmw9dX19Yi5SZXF1ZXN0TmV0d29ya0Vycm9yPWw7bGV0IHA7KGZ1bmN0aW9uKHEpe3EuR0VUPSJHRVQiO3EuUE9TVD0iUE9TVCJ9KShwPWIuSHR0cE1ldGhvZFR5cGV8fChiLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgbXt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXAuR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IHQoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319Yi5SZXF1ZXN0T3B0aW9ucz0KbTtjbGFzcyBue2NvbnN0cnVjdG9yKHE9MUUzLHU9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXE7dGhpcy5fbWF4UmV0cmllcz11fXJlcXVlc3QocSx1KXt1PWYodSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHEsdSl9cmVxdWVzdFdpdGhPcHRpb25zKHEsdSl7dS52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgoeCxBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6eCxyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhxLHRoaXMuX21heFJldHJpZXMsdSkpLnRoZW4oeD0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4geH0seD0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXgubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh4KX0pfWZldGNoKHEsdSl7cmV0dXJuKG5ldyBQcm9taXNlKCh4LEEpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp4LHJlamVjdDpBfSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgeD0xO3JldHVybiBuZXcgUHJvbWlzZShBPT57Y29uc3QgeT0oKT0+e2ZldGNoKHEsdSkudGhlbih3PT57IXcub2smJnRoaXMuX21heFJldHJpZXM+eD8oeCsrLHkoKSk6KEEodyksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt5KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGsoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHEsdSx4KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21VcmwocSx4KS50aGVuKEE9PkEsQT0+MDx1P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHEsdS0xLHgpOlByb21pc2UucmVqZWN0KEEpKX1fcHJvbWlzZUZyb21VcmwocSx1KXtyZXR1cm4gbmV3IFByb21pc2UoKHgsQSk9Pntjb25zdCB5PWQodS5tZXRob2RUeXBlLHEsdS53aXRoQ3JlZGVudGlhbHMsdS5jb250ZW50VHlwZSk7eS5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT15LnN0YXR1cz94KEpTT04ucGFyc2UoeS5yZXNwb25zZVRleHQpKTpBKG5ldyBsKHkscSkpfTt5Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBsKHksCnEpKX07dS5ib2R5P3kuc2VuZCh1LmJvZHkpOnkuc2VuZCgpfSl9fWIuUmVxdWVzdE1hbmFnZXI9bn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZikucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9Yi5hZGRQYXJhbXM9ZnVuY3Rpb24oZixoKXt2YXIgaz1PYmplY3Qua2V5cyhoKS5zb3J0KCkuZmlsdGVyKGw9PnZvaWQgMCE9PWhbbF0pO2lmKCFrLmxlbmd0aClyZXR1cm4gZjtjb25zdCB0PS0xIT09Zi5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtrPVtdLmNvbmNhdCguLi5rLm1hcChsPT57Y29uc3QgcD1oW2xdO3JldHVybihBcnJheS5pc0FycmF5KHApP3A6W3BdKS5tYXAobT0+YCR7bH09JHtkKG0pfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZit0K2t9fSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHQ9ImRhdGEiLGw9bmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSl7Ii8iPT09dFt0Lmxlbmd0aC0xXSYmKHQ9dC5zbGljZSgwLHQubGVuZ3RoLTEpKTtyZXR1cm57ZW52aXJvbm1lbnQ6KCk9PmYodCwiL2Vudmlyb25tZW50IiksZXhwZXJpbWVudHM6KCk9PmYodCwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KHAsbSxuKT0+Zih0KyIvcGx1Z2luIixgLyR7cH0ke219YCxuKSxwbHVnaW5zTGlzdGluZzooKT0+Zih0LCIvcGx1Z2luc19saXN0aW5nIixoKHtbImV4cGVyaW1lbnRhbFBsdWdpbiJdOmwuZ2V0QWxsKCJleHBlcmltZW50YWxQbHVnaW4iKX0pKSxydW5zOigpPT5mKHQsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6cD0+Zih0LCIvZXhwZXJpbWVudF9ydW5zIixoKHtleHBlcmltZW50OlN0cmluZyhwKX0pKX19ZnVuY3Rpb24gZih0LGwscD1uZXcgVVJMU2VhcmNoUGFyYW1zKXt0Kz1sO1N0cmluZyhwKSYmCihsPWwuaW5jbHVkZXMoIj8iKT8iXHgyNiI6Ij8iLHQrPWwrU3RyaW5nKHApKTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQ9e30pe2NvbnN0IGw9T2JqZWN0LmtleXModCkuc29ydCgpLmZpbHRlcihtPT50W21dKSxwPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5mb3JFYWNoKG09Pntjb25zdCBuPXRbbV07KEFycmF5LmlzQXJyYXkobik/bjpbbl0pLmZvckVhY2gocT0+cC5hcHBlbmQobSxxKSl9KTtyZXR1cm4gcH1sZXQgaz1kKCk7Yi5jcmVhdGVSb3V0ZXI9ZDtiLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBrfTtiLnNldFJvdXRlcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrdCk7az10fTtiLmNyZWF0ZVNlYXJjaFBhcmFtPWh9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoaCl7dGhpcy5saXN0ZW5lcj1ofX1iLkxpc3RlbktleT1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBiLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGgpe2g9bmV3IGQoaCk7dGhpcy5fbGlzdGVuZXJzLmFkZChoKTtyZXR1cm4gaH1yZW1vdmVMaXN0ZW5lckJ5S2V5KGgpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoaCl9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGg9Pnt0cnl7aC5saXN0ZW5lcigpfWNhdGNoKGspe319KX19Yi5CYXNlU3RvcmU9Zn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBiLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZj1iLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9Pntjb25zdCBrPXtkYXRhTG9jYXRpb246aC5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmgud2luZG93X3RpdGxlfTt2b2lkIDAhPT1oLmV4cGVyaW1lbnRfbmFtZSYmKGsuZXhwZXJpbWVudE5hbWU9aC5leHBlcmltZW50X25hbWUpO3ZvaWQgMCE9PWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbiYmKGsuZXhwZXJpbWVudERlc2NyaXB0aW9uPWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbik7dm9pZCAwIT09aC5jcmVhdGlvbl90aW1lJiYoay5jcmVhdGlvblRpbWU9aC5jcmVhdGlvbl90aW1lKTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxrKXx8KHRoaXMuZW52aXJvbm1lbnQ9ayx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD8KdGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb246IiJ9Z2V0V2luZG93VGl0bGUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LndpbmRvd1RpdGxlOiIifWdldEV4cGVyaW1lbnROYW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50TmFtZToiIn1nZXRFeHBlcmltZW50RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbjoiIn1nZXRDcmVhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmNyZWF0aW9uVGltZTpudWxsfX1iLkVudmlyb25tZW50U3RvcmU9ZDtiLmVudmlyb25tZW50U3RvcmU9bmV3IGR9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9leHBlcmltZW50c1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2V4cGVyaW1lbnRzPVtdfWxvYWQoKXtjb25zdCBmPWIuZ2V0Um91dGVyKCkuZXhwZXJpbWVudHMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4oaD0+e18uaXNFcXVhbCh0aGlzLl9leHBlcmltZW50cyxoKXx8KHRoaXMuX2V4cGVyaW1lbnRzPWgsdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Yi5FeHBlcmltZW50c1N0b3JlPWQ7Yi5leHBlcmltZW50c1N0b3JlPW5ldyBkfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcnVuc1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IGY9Yi5nZXRSb3V0ZXIoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9PntfLmlzRXF1YWwodGhpcy5fcnVucyxoKXx8KHRoaXMuX3J1bnM9aCx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRSdW5zKCl7cmV0dXJuIHRoaXMuX3J1bnMuc2xpY2UoKX19Yi5SdW5zU3RvcmU9ZDtiLnJ1bnNTdG9yZT1uZXcgZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2JhY2tlbmQuanMKKGZ1bmN0aW9uKGIpe2IuVFlQRVM9W107Yi5nZXRSdW5zTmFtZWQ9ZnVuY3Rpb24oZCl7cmV0dXJuIF8ua2V5cyhkKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZ2V0VGFncz1mdW5jdGlvbihkKXtyZXR1cm4gXy51bmlvbi5hcHBseShudWxsLF8udmFsdWVzKGQpKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZmlsdGVyVGFncz1mdW5jdGlvbihkLGYpe2xldCBoPVtdO2YuZm9yRWFjaChrPT5oPWguY29uY2F0KGRba10pKTtyZXR1cm4gXy51bmlxKGgpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKX19KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9jYW5jZWxsZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUoZil7Y29uc3QgaD10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBrPT5mKHt2YWx1ZTprLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09aH0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319Yi5DYW5jZWxsZXI9ZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3RmLWJhY2tlbmQtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWJhY2tlbmQiLF90ZW1wbGF0ZTpudWxsLHRmX2JhY2tlbmQ6Yn0pfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhdGVnb3JpemF0aW9uLXV0aWxzL2NhdGVnb3JpemF0aW9uVXRpbHMuanMKdmFyICRjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChtLG4pe2NvbnN0IHE9KCgpPT57dHJ5e3JldHVybiBuZXcgUmVnRXhwKG4pfWNhdGNoKHUpe3JldHVybiBudWxsfX0pKCk7cmV0dXJue25hbWU6bixtZXRhZGF0YTp7dHlwZTpwLlNFQVJDSF9SRVNVTFRTLHZhbGlkUmVnZXg6ISFxLHVuaXZlcnNhbFJlZ2V4OiIuKiI9PT1ufSxpdGVtczpxP20uZmlsdGVyKHU9PnUubWF0Y2gocSkpOltdfX1mdW5jdGlvbiBmKG0sbj0iLyIpe2NvbnN0IHE9W10sdT17fTttLmZvckVhY2goeD0+e3ZhciBBPXguaW5kZXhPZihuKTtBPTA8PUE/eC5zbGljZSgwLEEpOng7aWYoIXVbQV0pe2NvbnN0IHk9e25hbWU6QSxtZXRhZGF0YTp7dHlwZTpwLlBSRUZJWF9HUk9VUH0saXRlbXM6W119O3VbQV09eTtxLnB1c2goeSl9dVtBXS5pdGVtcy5wdXNoKHgpfSk7cmV0dXJuIHF9ZnVuY3Rpb24gaChtLG49IiIpe249W2QobSxuKV07bT1mKG0pO3JldHVybltdLmNvbmNhdChuLG0pfWZ1bmN0aW9uIGsobSxuLHEpe2NvbnN0IHU9CnZjLmdldFRhZ3MobSk7cT1oKHUscSk7Y29uc3QgeD10KF8ucGljayhtLG4pKTtyZXR1cm4gcS5tYXAoKHtuYW1lOkEsbWV0YWRhdGE6eSxpdGVtczp3fSk9Pih7bmFtZTpBLG1ldGFkYXRhOnksaXRlbXM6dy5tYXAoQz0+KHt0YWc6QyxydW5zOih4LmdldChDKXx8W10pLnNsaWNlKCl9KSl9KSl9ZnVuY3Rpb24gdChtKXtjb25zdCBuPW5ldyBNYXA7T2JqZWN0LmtleXMobSkuZm9yRWFjaChxPT57bVtxXS5mb3JFYWNoKHU9Pntjb25zdCB4PW4uZ2V0KHUpfHxbXTt4LnB1c2gocSk7bi5zZXQodSx4KX0pfSk7cmV0dXJuIG59ZnVuY3Rpb24gbChtLG4pe2NvbnN0IHE9cmMuY29tcGFyZVRhZ05hbWVzKG0udGFnLG4udGFnKTtyZXR1cm4gMCE9cT9xOnJjLmNvbXBhcmVUYWdOYW1lcyhtLnJ1bixuLnJ1bil9bGV0IHA7KGZ1bmN0aW9uKG0pe21bbS5TRUFSQ0hfUkVTVUxUUz0wXT0iU0VBUkNIX1JFU1VMVFMiO21bbS5QUkVGSVhfR1JPVVA9MV09IlBSRUZJWF9HUk9VUCJ9KShwPWIuQ2F0ZWdvcnlUeXBlfHwKKGIuQ2F0ZWdvcnlUeXBlPXt9KSk7Yi5jYXRlZ29yaXplQnlTZWFyY2hRdWVyeT1kO2IuY2F0ZWdvcml6ZUJ5UHJlZml4PWY7Yi5jYXRlZ29yaXplPWg7Yi5jYXRlZ29yaXplVGFncz1rO2IuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucz1mdW5jdGlvbihtLG4scSl7cmV0dXJuIGsobSxuLHEpLm1hcChmdW5jdGlvbih1KXtjb25zdCB4PV8uZmxhdHRlbih1Lml0ZW1zLm1hcCgoe3RhZzpBLHJ1bnM6eX0pPT55Lm1hcCh3PT4oe3RhZzpBLHJ1bjp3fSkpKSk7eC5zb3J0KGwpO3JldHVybntuYW1lOnUubmFtZSxtZXRhZGF0YTp1Lm1ldGFkYXRhLGl0ZW1zOnh9fSl9fSkoJGN8fCgkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdsb2JhbHMvZ2xvYmFscy5qcwp2YXIgYWQ7KGZ1bmN0aW9uKGIpe2xldCBkPSExO2Iuc2V0VXNlSGFzaD1mdW5jdGlvbihoKXtkPWh9O2IudXNlSGFzaD1mdW5jdGlvbigpe3JldHVybiBkfTtsZXQgZj0iIjtiLnNldEZha2VIYXNoPWZ1bmN0aW9uKGgpe2Y9aH07Yi5nZXRGYWtlSGFzaD1mdW5jdGlvbigpe3JldHVybiBmfX0pKGFkfHwoYWQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1nbG9iYWxzL2dsb2JhbHMtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWdsb2JhbHMiLF90ZW1wbGF0ZTpudWxsLHRmX2dsb2JhbHM6Yn0pfSkoYWR8fChhZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvbGlzdGVuZXJzLmpzCnZhciBwZDsKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3Ioayl7dGhpcy5saXN0ZW5lcj1rfX1iLkxpc3RlbktleT1kO2NvbnN0IGY9bmV3IFNldCxoPW5ldyBTZXQ7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgpPT57Zi5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsKCk9PntoLmZvckVhY2goaz0+ay5saXN0ZW5lcigpKX0pO2IuYWRkSGFzaExpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7Zi5hZGQoayk7cmV0dXJuIGt9O2IuYWRkU3RvcmFnZUxpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7aC5hZGQoayk7cmV0dXJuIGt9O2IuZmlyZVN0b3JhZ2VDaGFuZ2VkPWZ1bmN0aW9uKCl7aC5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9O2IucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7Zi5kZWxldGUoayl9O2IucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7aC5kZWxldGUoayl9fSkocGR8fAoocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL3N0b3JhZ2UuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobixxKXtmdW5jdGlvbiB1KHcsQz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpHLHVzZUxvY2FsU3RvcmFnZTpEPSExfT1DO3c9RD93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odyk6bChoKCkpW3ddO3JldHVybiB2b2lkIDA9PXc/Xy5jbG9uZURlZXAoRyk6bih3KX1mdW5jdGlvbiB4KHcsQyxHPXt9KXtjb25zdCB7ZGVmYXVsdFZhbHVlOkQsdXNlTG9jYWxTdG9yYWdlOkI9ITEsdXNlTG9jYXRpb25SZXBsYWNlOkk9ITF9PUc7Rz1xKEMpO0I/KHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh3LEcpLGIuZmlyZVN0b3JhZ2VDaGFuZ2VkKCkpOl8uaXNFcXVhbChDLHUodyx7dXNlTG9jYWxTdG9yYWdlOkJ9KSl8fChfLmlzRXF1YWwoQyxEKT9wKHcpOihDPWwoaCgpKSxDW3ddPUcsayh0KEMpLEkpKSl9Y29uc3QgQT1bXSx5PVtdO3JldHVybntnZXQ6dSxzZXQ6eCxnZXRJbml0aWFsaXplcjpmdW5jdGlvbih3LEMpe2NvbnN0IEc9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLApwb2x5bWVyUHJvcGVydHk6dyx1c2VMb2NhbFN0b3JhZ2U6ITF9LEMpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IEQ9Zih0aGlzLHcpLEI9KCk9Pntjb25zdCBOPXUoRCxHKTtfLmlzRXF1YWwoTix0aGlzW0cucG9seW1lclByb3BlcnR5XSl8fCh0aGlzW0cucG9seW1lclByb3BlcnR5XT1OKX0sST0oRy51c2VMb2NhbFN0b3JhZ2U/Yi5hZGRTdG9yYWdlTGlzdGVuZXI6Yi5hZGRIYXNoTGlzdGVuZXIpKCgpPT5CKCkpO0cudXNlTG9jYWxTdG9yYWdlP3kucHVzaChJKTpBLnB1c2goSSk7QigpO3JldHVybiB0aGlzW0cucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uKHcsQyl7Y29uc3QgRz1PYmplY3QuYXNzaWduKHtkZWZhdWx0VmFsdWU6Qy5kZWZhdWx0VmFsdWUscG9seW1lclByb3BlcnR5OncsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWYodGhpcyx3KTt4KEQsdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV0sRyl9fSxkaXNwb3NlQmluZGluZzpmdW5jdGlvbigpe0EuZm9yRWFjaCh3PT4KYi5yZW1vdmVIYXNoTGlzdGVuZXJCeUtleSh3KSk7eS5mb3JFYWNoKHc9PmIucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXkodykpfX19ZnVuY3Rpb24gZihuLHEpe249bltiLkRJU0FNQklHVUFUT1JdO3JldHVybihudWxsPT1uP1txXTpbbixxXSkuam9pbigiLiIpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gYWQudXNlSGFzaCgpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOmFkLmdldEZha2VIYXNoKCl9ZnVuY3Rpb24gayhuLHE9ITEpe2FkLnVzZUhhc2goKT9xP3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjIituKTp3aW5kb3cubG9jYXRpb24uaGFzaD1uOmFkLnNldEZha2VIYXNoKG4pfWZ1bmN0aW9uIHQobil7bGV0IHE9IiI7dm9pZCAwIT09bltiLlRBQl0mJihxKz1uW2IuVEFCXSk7Y29uc3QgdT1PYmplY3Qua2V5cyhuKS5tYXAoeD0+W3gsblt4XV0pLmZpbHRlcih4PT54WzBdIT09Yi5UQUIpLm1hcCh4PT5lbmNvZGVVUklDb21wb25lbnQoeFswXSkrIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudCh4WzFdKSkuam9pbigiXHgyNiIpOwpyZXR1cm4gMDx1Lmxlbmd0aD9xKyJceDI2Iit1OnF9ZnVuY3Rpb24gbChuKXtjb25zdCBxPXt9O24uc3BsaXQoIlx4MjYiKS5mb3JFYWNoKHU9Pnt1PXUuc3BsaXQoIlx4M2QiKTsxPT09dS5sZW5ndGg/cVtiLlRBQl09dVswXToyPT09dS5sZW5ndGgmJihxW2RlY29kZVVSSUNvbXBvbmVudCh1WzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHVbMV0pKX0pO3JldHVybiBxfWZ1bmN0aW9uIHAobil7Y29uc3QgcT1sKGgoKSk7ZGVsZXRlIHFbbl07ayh0KHEpKX1iLlRBQj0iX190YWJfXyI7Yi5ESVNBTUJJR1VBVE9SPSJkaXNhbWJpZ3VhdG9yIjtiLnVybERpY3Q9bChoKCkpO2IuYWRkSGFzaExpc3RlbmVyKCgpPT57Yi51cmxEaWN0PWwoaCgpKX0pO3ZhciBtPWQobj0+bixuPT5uKTtiLmdldFN0cmluZz1tLmdldDtiLnNldFN0cmluZz1tLnNldDtiLmdldFN0cmluZ0luaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXRTdHJpbmdPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZVN0cmluZ0JpbmRpbmc9Cm0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PiJ0cnVlIj09PW4/ITA6ImZhbHNlIj09PW4/ITE6dm9pZCAwLG49Pm4udG9TdHJpbmcoKSk7Yi5nZXRCb29sZWFuPW0uZ2V0O2Iuc2V0Qm9vbGVhbj1tLnNldDtiLmdldEJvb2xlYW5Jbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0Qm9vbGVhbk9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlQm9vbGVhbkJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+K24sbj0+bi50b1N0cmluZygpKTtiLmdldE51bWJlcj1tLmdldDtiLnNldE51bWJlcj1tLnNldDtiLmdldE51bWJlckluaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXROdW1iZXJPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZU51bWJlckJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+SlNPTi5wYXJzZShhdG9iKG4pKSxuPT5idG9hKEpTT04uc3RyaW5naWZ5KG4pKSk7Yi5nZXRPYmplY3Q9bS5nZXQ7Yi5zZXRPYmplY3Q9bS5zZXQ7Yi5nZXRPYmplY3RJbml0aWFsaXplcj0KbS5nZXRJbml0aWFsaXplcjtiLmdldE9iamVjdE9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlT2JqZWN0QmluZGluZz1tLmRpc3Bvc2VCaW5kaW5nO2IubWFrZUJpbmRpbmdzPWQ7Yi5taWdyYXRlTGVnYWN5VVJMU2NoZW1lPWZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgU2V0KCJleGFtcGxlc1BhdGggaGlkZU1vZGVsUGFuZTIgbW9kZWxOYW1lMSBtb2RlbE5hbWUyIGluZmVyZW5jZUFkZHJlc3MxIGluZmVyZW5jZUFkZHJlc3MyIG1vZGVsVHlwZSBtb2RlbFZlcnNpb24xIG1vZGVsVmVyc2lvbjIgbW9kZWxTaWduYXR1cmUxIG1vZGVsU2lnbmF0dXJlMiBtYXhFeGFtcGxlcyBsYWJlbFZvY2FiUGF0aCBtdWx0aUNsYXNzIHNlcXVlbmNlRXhhbXBsZXMgbWF4Q2xhc3Nlc1RvRGlzcGxheSBzYW1wbGluZ09kZHMgdXNlUHJlZGljdEFwaSBwcmVkaWN0SW5wdXRUZW5zb3IgcHJlZGljdE91dHB1dFRlbnNvciIuc3BsaXQoIiAiKSkscT1sKGgoKSk7aWYoIndoYXRpZiI9PT1xW2IuVEFCXSlmb3IobGV0IHUgb2Ygbil1IGluCnEmJihxW2BwLndoYXRpZi4ke3V9YF09cVt1XSk7ayh0KHEpKTt0aGlzLnVybERpY3Q9cX19KShwZHx8KHBkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc3RvcmFnZS90Zi1zdG9yYWdlLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1zdG9yYWdlIixfdGVtcGxhdGU6bnVsbCx0Zl9zdG9yYWdlOmJ9KX0pKHBkfHwocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXRlZ29yaXphdGlvbi11dGlscy90Zi10YWctZmlsdGVyZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGFnLWZpbHRlcmVyIixwcm9wZXJ0aWVzOnt0YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigidGFnRmlsdGVyIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMSxwb2x5bWVyUHJvcGVydHk6Il90YWdGaWx0ZXIifSksb2JzZXJ2ZXI6Il90YWdGaWx0ZXJPYnNlcnZlciJ9fSxfdGFnRmlsdGVyT2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLF9jb21wdXRlVGFnRmlsdGVyKCl7cmV0dXJuIHRoaXMuX3RhZ0ZpbHRlcn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2FycmF5LXVwZGF0ZS1oZWxwZXIuanMKdmFyIHFkOyhmdW5jdGlvbihiKXtiLkFycmF5VXBkYXRlSGVscGVyPXt1cGRhdGVBcnJheVByb3AoZCxmLGgpe2xldCBrPXRoaXMuZ2V0KGQpO2lmKCFBcnJheS5pc0FycmF5KGYpKXRocm93IFJhbmdlRXJyb3IoYEV4cGVjdGVkIG5ldyB2YWx1ZSB0byAnJHtkfScgdG8gYmUgYW4gYXJyYXkuYCk7QXJyYXkuaXNBcnJheShrKXx8KGs9W10sdGhpcy5zZXQoZCxrKSk7Y29uc3QgdD1uZXcgU2V0KGYubWFwKChtLG4pPT5oKG0sbikpKTtsZXQgbD0wLHA9MDtmb3IoO2w8ay5sZW5ndGgmJnA8Zi5sZW5ndGg7KXQuaGFzKGgoa1tsXSxsKSk/KGgoa1tsXSxsKT09aChmW3BdLHApP3RoaXMuc2V0KGAke2R9LiR7bH1gLGZbcF0pOnRoaXMuc3BsaWNlKGQsbCwwLGZbcF0pLHArKyxsKyspOnRoaXMuc3BsaWNlKGQsbCwxKTtsPGsubGVuZ3RoJiZ0aGlzLnNwbGljZShkLGwpO3A8Zi5sZW5ndGgmJnRoaXMucHVzaChkLC4uLmYuc2xpY2UocCkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kYXNoYm9hcmQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRhc2hib2FyZC1sYXlvdXQifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1vcHRpb24tc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3B0aW9uLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntuYW1lOlN0cmluZyxzZWxlY3RlZElkOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLmxpc3RlbihiLCJ0YXAiLCJfc2VsZWN0VGFyZ2V0Iil9LmJpbmQodGhpcykpfSl9LF9zZWxlY3RUYXJnZXQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZElkPWIuY3VycmVudFRhcmdldC5pZH0sX3NlbGVjdGVkSWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCIjIit0aGlzLnNlbGVjdGVkSWQpO2ImJih0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9KSxiLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY29sbGFwc2UvaXJvbi1jb2xsYXBzZS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoKIm1heC1oZWlnaHQifSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhpZGRlbiI6InRydWUifSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9vblRyYW5zaXRpb25FbmQifSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0saGlkZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSExfSx1cGRhdGVTaXplOmZ1bmN0aW9uKGIsZCl7Yj0iYXV0byI9PT1iPyIiOmI7ZD1kJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PWI7dGhpcy5fZGVzaXJlZFNpemU9Yjt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTtkJiYoZD10aGlzLl9jYWxjU2l6ZSgpLCIiPT09YiYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIixiPXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1kLHRoaXMuc2Nyb2xsVG9wPQp0aGlzLnNjcm9sbFRvcCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCEwKSxkPWIhPT1kKTt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09YjtkfHx0aGlzLl90cmFuc2l0aW9uRW5kKCl9LGVuYWJsZVRyYW5zaXRpb246ZnVuY3Rpb24oYil7UG9seW1lci5CYXNlLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpO3RoaXMubm9BbmltYXRpb249IWJ9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWImJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzczt0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiI7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPwoiYXV0byI6IjBweCIsITEpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsIXRoaXMub3BlbmVkKTt0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCEwKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsITEpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIiwhMSk7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMCk7dGhpcy5vcGVuZWQmJnRoaXMuZm9jdXMoKX0sX3RyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09dGhpcy5fZGVzaXJlZFNpemU7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCF0aGlzLm9wZW5lZCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLHRoaXMub3BlbmVkKTt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTt0aGlzLm5vdGlmeVJlc2l6ZSgpOwp0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCExKX0sX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0PT09dGhpcyYmdGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxfY2FsY1NpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0rInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1kb20tcmVwZWF0Lmh0bWwuanMKdmFyIEpkOwooZnVuY3Rpb24oYil7Yi5UZkRvbVJlcGVhdEJlaGF2aW9yPVtxZC5BcnJheVVwZGF0ZUhlbHBlcix7cHJvcGVydGllczp7YXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2RvbUJvb3RzdHJhcHBlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3Rvcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+bnVsbH0sX3JlbmRlcmVkSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcmVuZGVyZWRUZW1wbGF0ZUluc3Q6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfbHJ1Q2FjaGVkSXRlbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FjaGVTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2dldEl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmQ9PkpTT04uc3RyaW5naWZ5KGQpfX0sb2JzZXJ2ZXJzOlsiX2Jvb3RzdHJhcERvbShfaXRlbXNSZW5kZXJlZCwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlRG9tKF9yZW5kZXJlZEl0ZW1zLiosIF9kb21Cb290c3RyYXBwZWQpIiwKIl91cGRhdGVBY3RpdmUoX2NvbnRlbnRBY3RpdmUpIiwiX3RyaW1DYWNoZShfY2FjaGVTaXplKSJdLHNldENhY2hlU2l6ZShkKXt0aGlzLl9jYWNoZVNpemU9ZH0sc2V0R2V0SXRlbUtleShkKXt0aGlzLl9nZXRJdGVtS2V5PWR9LHVwZGF0ZURvbShkKXt0aGlzLnVwZGF0ZUFycmF5UHJvcCgiX3JlbmRlcmVkSXRlbXMiLGQsdGhpcy5fZ2V0SXRlbUtleSl9LF9lbnN1cmVUZW1wbGF0aXplZCgpe2lmKCF0aGlzLmlzQXR0YWNoZWQpcmV0dXJuITE7dGhpcy5fY3Rvcnx8KHRoaXMuX2N0b3I9UG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGhpcy5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZSIpLHRoaXMse3BhcmVudE1vZGVsOiEwLGluc3RhbmNlUHJvcHM6e1t0aGlzLmFzXTohMCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKGQsZil7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZm9yRWFjaChoPT57aC5mb3J3YXJkSG9zdFByb3AoZCwKZil9KX19KSk7cmV0dXJuITB9LF9ib290c3RyYXBEb20oKXt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpJiYhdGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYoQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5mb3JFYWNoKGQ9PntQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZChkKX0pLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmNsZWFyKCksdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKChkLGYpPT50aGlzLl9pbnNlcnRJdGVtKGQsZikpLHRoaXMuX2RvbUJvb3RzdHJhcHBlZD0hMCl9LF91cGRhdGVBY3RpdmUoKXt0aGlzLl9kb21Cb290c3RyYXBwZWQmJkFycmF5LmZyb20odGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QudmFsdWVzKCkpLmZvckVhY2goZD0+e2Qubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKX0pfSxfdXBkYXRlRG9tKGQpe2lmKHRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmIl9yZW5kZXJlZEl0ZW1zIiE9ZC5wYXRoJiYKIl9yZW5kZXJlZEl0ZW1zLmxlbmd0aCIhPWQucGF0aClpZigiX3JlbmRlcmVkSXRlbXMuc3BsaWNlcyI9PT1kLnBhdGgpZC52YWx1ZS5pbmRleFNwbGljZXMuZm9yRWFjaChmPT57Y29uc3QgaD1mLmluZGV4LGs9Zi5hZGRlZENvdW50LHQ9Zi5vYmplY3Q7Zi5yZW1vdmVkLmZvckVhY2gobD0+e3RoaXMuX3JlbW92ZUl0ZW0obCx0aGlzLmNoaWxkcmVuW2hdKX0pO3Quc2xpY2UoaCxoK2spLmZvckVhY2goKGwscCk9PnRoaXMuX2luc2VydEl0ZW0obCxoK3ApKTt0aGlzLl90cmltQ2FjaGUoKX0pO2Vsc2V7Y29uc3QgZj10aGlzLl9nZXRJdGVtS2V5KGQudmFsdWUpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmhhcyhmKT90aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZikubm90aWZ5UGF0aCh0aGlzLmFzLGQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7Zn0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGArImNvdWxkIG5vdCBmaW5kIG9uZS4iKX19LF9pbnNlcnRJdGVtKGQsCmYpe2lmKCF0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpKXRocm93IEVycm9yKCJFeHBlY3RlZCB0ZW1wbGF0aXplZCBiZWZvcmUgaW5zZXJ0aW5nIGFuIGl0ZW0iKTtjb25zdCBoPXRoaXMuX2dldEl0ZW1LZXkoZCk7aWYodGhpcy5fbHJ1Q2FjaGVkSXRlbXMuaGFzKGgpKWQ9dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZ2V0KGgpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShoKSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoaCkubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKTtlbHNle2NvbnN0IGs9bmV3IHRoaXMuX2N0b3Ioe1t0aGlzLmFzXTpkLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSk7ZD1rLnJvb3Q7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGgsayl9dGhpcy5jaGlsZHJlbltmXT9Qb2x5bWVyLmRvbSh0aGlzKS5pbnNlcnRCZWZvcmUoZCx0aGlzLmNoaWxkcmVuW2ZdKTooKGQubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT8KQXJyYXkuZnJvbShkLmNoaWxkcmVuKTpbZF0pLmZvckVhY2goaz0+ay5zZXRBdHRyaWJ1dGUoInNsb3QiLCJpdGVtcyIpKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChkKSl9LF9yZW1vdmVJdGVtKGQsZil7UG9seW1lci5kb20oZi5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChmKTtkPXRoaXMuX2dldEl0ZW1LZXkoZCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2V0KGQsZik7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGQpLm5vdGlmeVBhdGgoImFjdGl2ZSIsITEpfSxfdHJpbUNhY2hlKCl7Zm9yKDt0aGlzLl9scnVDYWNoZWRJdGVtcy5zaXplPnRoaXMuX2NhY2hlU2l6ZTspe2NvbnN0IFtkXT10aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmRlbGV0ZShkKX19fV19KShKZHx8KEpkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvcGFnaW5hdGVkVmlld1N0b3JlLmpzCnZhciBuZTsKKGZ1bmN0aW9uKGIpe2xldCBkPW51bGw7Y29uc3QgZj1uZXcgU2V0O2IuYWRkTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihoKXtmLmFkZChoKX07Yi5yZW1vdmVMaW1pdExpc3RlbmVyPWZ1bmN0aW9uKGgpe2YuZGVsZXRlKGgpfTtiLmdldExpbWl0PWZ1bmN0aW9uKCl7bnVsbD09ZCYmKGQ9cGQuZ2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0Iix7dXNlTG9jYWxTdG9yYWdlOiEwfSksbnVsbD09ZHx8IWlzRmluaXRlKGQpfHwwPj1kKSYmKGQ9MTIpO3JldHVybiBkfTtiLnNldExpbWl0PWZ1bmN0aW9uKGgpe2lmKGghPT1NYXRoLmZsb29yKGgpKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7aH1gKTtpZigwPj1oKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBidXQgZ290OiAke2h9YCk7aCE9PWQmJihkPWgscGQuc2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IixkLAp7dXNlTG9jYWxTdG9yYWdlOiEwfSksZi5mb3JFYWNoKGs9PntrKCl9KSl9fSkobmV8fChuZT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLXBhZ2luYXRlZC12aWV3LXN0b3JlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIixfdGVtcGxhdGU6bnVsbCx0Zl9wYWdpbmF0ZWRfdmlldzpuZX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Iixwcm9wZXJ0aWVzOntjYXRlZ29yeTpPYmplY3QsaW5pdGlhbE9wZW5lZDpCb29sZWFuLG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250ZW50QWN0aXZlKG9wZW5lZCkifSxkaXNhYmxlUGFnaW5hdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiopIn0sX2hhc011bHRpcGxlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGUoX2NvdW50KSJ9LF9wYW5lUmVuZGVyZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVQYW5lUmVuZGVyZWQoY2F0ZWdvcnkpIixvYnNlcnZlcjoiX29uUGFuZVJlbmRlcmVkQ2hhbmdlZCJ9LF9pdGVtc1JlbmRlcmVkOnt0eXBlOkJvb2xlYW4sCmNvbXB1dGVkOiJfY29tcHV0ZUl0ZW1zUmVuZGVyZWQob3BlbmVkLCBfcGFuZVJlbmRlcmVkKSJ9LF9pc1NlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEudHlwZSkifSxfaXNJbnZhbGlkU2VhcmNoUmVzdWx0czp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzSW52YWxpZFNlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEpIn0sX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnk6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LGdldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Yj0+SlNPTi5zdHJpbmdpZnkoYiksb2JzZXJ2ZXI6Il9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkIn0sX2xpbWl0Ont0eXBlOk51bWJlcix2YWx1ZToxMixvYnNlcnZlcjoiX2xpbWl0Q2hhbmdlZCJ9LApfYWN0aXZlSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jdXJyZW50UGFnZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFBhZ2UoX2xpbWl0LCBfYWN0aXZlSW5kZXgpIn0sX3BhZ2VDb3VudDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiosIF9saW1pdCkifSxfbXVsdGlwbGVQYWdlc0V4aXN0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlTXVsdGlwbGVQYWdlc0V4aXN0KF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJ9LF9oYXNQcmV2aW91c1BhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNQcmV2aW91c1BhZ2UoX2N1cnJlbnRQYWdlKSJ9LF9oYXNOZXh0UGFnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc05leHRQYWdlKF9jdXJyZW50UGFnZSwgX3BhZ2VDb3VudCkifSxfaW5wdXRXaWR0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlSW5wdXRXaWR0aChfcGFnZUNvdW50KSIsCm9ic2VydmVyOiJfdXBkYXRlSW5wdXRXaWR0aCJ9LF9wYWdlSW5wdXRWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUlucHV0VmFsdWUoX3BhZ2VJbnB1dEZvY3VzZWQsIF9wYWdlSW5wdXRSYXdWYWx1ZSwgX2N1cnJlbnRQYWdlKSIsb2JzZXJ2ZXI6Il91cGRhdGVQYWdlSW5wdXRWYWx1ZSJ9LF9wYWdlSW5wdXRSYXdWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9wYWdlSW5wdXRGb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfY2xhbXBBY3RpdmVJbmRleChjYXRlZ29yeS5pdGVtcy4qKSIsIl91cGRhdGVSZW5kZXJlZEl0ZW1zKF9pdGVtc1JlbmRlcmVkLCBjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQsIF9hY3RpdmVJbmRleCwgX3BhZ2VDb3VudCwgZGlzYWJsZVBhZ2luYXRpb24pIl0sYmVoYXZpb3JzOltKZC5UZkRvbVJlcGVhdEJlaGF2aW9yXSxfY29tcHV0ZUNvdW50KCl7cmV0dXJuIHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RofSwKX2NvbXB1dGVIYXNNdWx0aXBsZSgpe3JldHVybiAxPHRoaXMuX2NvdW50fSxfdG9nZ2xlUGFuZSgpe3RoaXMuX3NldE9wZW5lZCghdGhpcy5vcGVuZWQpfSxfY29tcHV0ZUNvbnRlbnRBY3RpdmUoKXtyZXR1cm4gdGhpcy5vcGVuZWR9LF9vblBhbmVSZW5kZXJlZENoYW5nZWQoYixkKXtiJiZiIT09ZCYmdGhpcy4kLmlmUmVuZGVyZWQucmVuZGVyKCl9LF9jb21wdXRlUGFuZVJlbmRlcmVkKGIpe3JldHVybiEoYi5tZXRhZGF0YS50eXBlPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYiIj09PWIubmFtZSl9LF9jb21wdXRlSXRlbXNSZW5kZXJlZCgpe3JldHVybiB0aGlzLl9wYW5lUmVuZGVyZWQmJnRoaXMub3BlbmVkfSxfY29tcHV0ZUlzU2VhcmNoUmVzdWx0cyhiKXtyZXR1cm4gYj09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUU30sX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGIpe3JldHVybiBiLnR5cGU9PT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJgohYi52YWxpZFJlZ2V4fSxfY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkoYil7cmV0dXJuIGIudHlwZT09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmYi51bml2ZXJzYWxSZWdleH0sX2lzQ29tcG9zaXRlU2VhcmNoKCl7Y29uc3QgYj10aGlzLmNhdGVnb3J5Lm1ldGFkYXRhLnR5cGU7cmV0dXJuIHRoaXMuY2F0ZWdvcnkubWV0YWRhdGEuY29tcG9zaXRlU2VhcmNoJiZiPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTfSxyZWFkeSgpe3RoaXMuX3NldE9wZW5lZChudWxsPT10aGlzLmluaXRpYWxPcGVuZWQ/ITA6dGhpcy5pbml0aWFsT3BlbmVkKTt0aGlzLl9saW1pdExpc3RlbmVyPSgpPT57dGhpcy5zZXQoIl9saW1pdCIsbmUuZ2V0TGltaXQoKSl9O25lLmFkZExpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcik7dGhpcy5fbGltaXRMaXN0ZW5lcigpfSxkZXRhY2hlZCgpe25lLnJlbW92ZUxpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcil9LApfdXBkYXRlUmVuZGVyZWRJdGVtcyhiLGQsZixoLGssdCl7YiYmKGI9TWF0aC5mbG9vcihoL2YpLGQ9dGhpcy5jYXRlZ29yeS5pdGVtc3x8W10sdGhpcy51cGRhdGVEb20odD9kOmQuc2xpY2UoYipmLChiKzEpKmYpLHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5KSl9LF9saW1pdENoYW5nZWQoYil7dGhpcy5zZXRDYWNoZVNpemUoMipiKX0sX2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQoKXt0aGlzLnNldEdldEl0ZW1LZXkodGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpfSxfY29tcHV0ZUN1cnJlbnRQYWdlKGIsZCl7cmV0dXJuIE1hdGguZmxvb3IoZC9iKSsxfSxfY29tcHV0ZVBhZ2VDb3VudChiLGQpe3JldHVybiB0aGlzLmNhdGVnb3J5P01hdGguY2VpbCh0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aC9kKTowfSxfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChiLGQpe3JldHVybiFkJiYxPGJ9LF9jb21wdXRlSGFzUHJldmlvdXNQYWdlKGIpe3JldHVybiAxPGJ9LF9jb21wdXRlSGFzTmV4dFBhZ2UoYiwKZCl7cmV0dXJuIGI8ZH0sX2NvbXB1dGVJbnB1dFdpZHRoKGIpe3JldHVybmBjYWxjKCR7Yi50b1N0cmluZygpLmxlbmd0aH1lbSArIDIwcHgpYH0sX3NldEFjdGl2ZUluZGV4KGIpe2NvbnN0IGQ9KHRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdKS5sZW5ndGgtMTtiPmQmJihiPWQpOzA+YiYmKGI9MCk7dGhpcy5zZXQoIl9hY3RpdmVJbmRleCIsYil9LF9jbGFtcEFjdGl2ZUluZGV4KCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgpfSxfcGVyZm9ybVByZXZpb3VzUGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4LXRoaXMuX2xpbWl0KX0sX3BlcmZvcm1OZXh0UGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4K3RoaXMuX2xpbWl0KX0sX2NvbXB1dGVQYWdlSW5wdXRWYWx1ZShiLGQsZil7cmV0dXJuIGI/ZDpmLnRvU3RyaW5nKCl9LF9oYW5kbGVQYWdlSW5wdXRFdmVudChiKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIiwKYi50YXJnZXQudmFsdWUpO2I9TnVtYmVyKGIudGFyZ2V0LnZhbHVlfHxOYU4pO2lzTmFOKGIpfHx0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9saW1pdCooTWF0aC5tYXgoMSxNYXRoLm1pbihiLHRoaXMuX3BhZ2VDb3VudCkpLTEpKX0sX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfSxfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9wYWdlSW5wdXRWYWx1ZSk7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMCl9LF9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9LF91cGRhdGVQYWdlSW5wdXRWYWx1ZShiKXtjb25zdCBkPXRoaXMuJCQoIiNwYWdlLWlucHV0IGlucHV0Iik7ZCYmKGQudmFsdWU9Yil9LF91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctYmVoYXZpb3IvcGFwZXItZGlhbG9nLWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImRpYWxvZyIsdGFiaW5kZXg6Ii0xIn0scHJvcGVydGllczp7bW9kYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX19yZWFkaWVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfbW9kYWxDaGFuZ2VkKG1vZGFsLCBfX3JlYWRpZWQpIl0sbGlzdGVuZXJzOnt0YXA6Il9vbkRpYWxvZ0NsaWNrIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrO3RoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXk7dGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3A7dGhpcy5fX3JlYWRpZWQ9ITB9LF9tb2RhbENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiYoYj8odGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPQp0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLndpdGhCYWNrZHJvcD10aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24oYil7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8Cnt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jb25maXJtZWQ9Yn0sX29uRGlhbG9nQ2xpY2s6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPVBvbHltZXIuZG9tKGIpLnBhdGgsZj0wLGg9ZC5pbmRleE9mKHRoaXMpO2Y8aDtmKyspe3ZhciBrPWRbZl07aWYoay5oYXNBdHRyaWJ1dGUmJihrLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWRpc21pc3MiKXx8ay5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpKXt0aGlzLl91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkKGsuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKTt0aGlzLmNsb3NlKCk7Yi5zdG9wUHJvcGFnYXRpb24oKTticmVha319fX07UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yPVtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy9wYXBlci1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcl0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZW50cnkiKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJleGl0Iil9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX19KTsKCi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciBwZjsKKGZ1bmN0aW9uKGIpe2IucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTtiLnN0YW5kYXJkPWIucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkocGZ8fChwZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoaCxrKXtmdW5jdGlvbiB0KCl7bC5zZXREb21haW4oaygpKX1jb25zdCBsPW5ldyBmO2guYWRkTGlzdGVuZXIodCk7dCgpO3JldHVybiBwPT5sLmdldENvbG9yKHApfWNsYXNzIGZ7Y29uc3RydWN0b3IoaD1iLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9aDt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihoKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2guZm9yRWFjaCgoayx0KT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGssdGhpcy5wYWxldHRlW3QldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoaCl7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGgpKXRocm93IEVycm9yKGBTdHJpbmcgJHtofSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGgpfX1iLkNvbG9yU2NhbGU9ZjtiLnJ1bnNDb2xvclNjYWxlPWQodmMucnVuc1N0b3JlLCgpPT52Yy5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYi5leHBlcmltZW50c0NvbG9yU2NhbGU9ZCh2Yy5leHBlcmltZW50c1N0b3JlLCgpPT52Yy5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpofSk9PmgpKX0pKHBmfHwocGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtmJiZkIT1mfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9Xy5kZWJvdW5jZShkPT57dGhpcy5yZWdleD1kfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZD90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1kfSwzMCk6YihkKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihiKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYil9Y2F0Y2goZCl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zZWxlY3Rpb25TdGF0ZSxkPV8uZmlsdGVyKF8udmFsdWVzKGIpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaWNvbj0KMT09PWQmJmJbZi5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLl9yZWdleDtyZXR1cm4gYj90aGlzLm5hbWVzLmZpbHRlcihkPT5iLnRlc3QoZCkpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2VsZWN0aW9uU3RhdGUsZD10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGY9Pm51bGw9PWJbZl0/ZDpiW2ZdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTsKYi51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmR9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTtiLnN0eWxlLmNvbG9yPWR9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQubmFtZSxmPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihoKXtmW2hdPWg9PWR9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWZ9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihiKXtiPQpQb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDtjb25zdCBkPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7ZFtiLm5hbWVdPWIuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYil7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihiKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGY9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZikpLGQ9e307dGhpcy5uYW1lcy5mb3JFYWNoKGY9PntkW2ZdPSFifSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1kfX0pfSkocWR8fChxZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXJ1bnMtc2VsZWN0b3IvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlKSJ9fSxfY29tcHV0ZVBhcnRzKGIpe2NvbnN0IGQ9W10sZj0vWy89XywtXS87Zm9yKG51bGw9PWImJihiPSIiKTs7KXtjb25zdCBoPWIuc2VhcmNoKGYpO2lmKC0xPT09aCl7ZC5wdXNoKGIpO2JyZWFrfWVsc2UgZC5wdXNoKGIuc2xpY2UoMCxoKzEpKSxiPWIuc2xpY2UoaCsxKX1yZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ydW5zLXNlbGVjdG9yL3RmLXJ1bnMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcnVucy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuU2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSIsdmFsdWU6cGQuZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSl9LHJlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOnBkLmdldFN0cmluZ0luaXRpYWxpemVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Il9yZWdleE9ic2VydmVyIn0sc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LG5vdGlmeTohMH0scnVuczpBcnJheSxkYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2NsaXBwZWREYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKSJ9LF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOnt0eXBlOk51bWJlciwKdmFsdWU6MjUwLHJlYWRPbmx5OiEwfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOnBmLnJ1bnNDb2xvclNjYWxlfX19LGF0dGFjaGVkKCl7dGhpcy5fcnVuU3RvcmVMaXN0ZW5lcj12Yy5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSl9KTt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSk7dGhpcy5fZW52U3RvcmVMaXN0ZW5lcj12Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsdmMuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9KTt0aGlzLnNldCgiZGF0YUxvY2F0aW9uIix2Yy5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKX0sZGV0YWNoZWQoKXt2Yy5ydW5zU3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9ydW5TdG9yZUxpc3RlbmVyKTt2Yy5lbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcil9LApfdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9LF9nZXRDbGlwcGVkRGF0YUxvY2F0aW9uOmZ1bmN0aW9uKGIsZCl7aWYodm9pZCAwIT09YiYmIShiLmxlbmd0aD5kKSlyZXR1cm4gYn0sX29wZW5EYXRhTG9jYXRpb25EaWFsb2c6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuJCQoIiNkYXRhLWxvY2F0aW9uLWRpYWxvZyIpLm9wZW4oKX0sX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oYixkKXtyZXR1cm4gYiYmYi5sZW5ndGg+ZH0sX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGU6cGQuZ2V0T2JqZWN0T2JzZXJ2ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSksX3JlZ2V4T2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInJlZ2V4SW5wdXQiLHtkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3JlZ2lzdHJ5LmpzCnZhciBxZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtkLk5PVF9MT0FERUQ9Ik5PVF9MT0FERUQiO2QuTE9BREVEPSJMT0FERUQiO2QuRkFJTEVEPSJGQUlMRUQifSkoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlfHwoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXt9KSk7Yi5kYXNoYm9hcmRSZWdpc3RyeT17fTtiLnJlZ2lzdGVyRGFzaGJvYXJkPWZ1bmN0aW9uKCl7dmFyIGQ9e3BsdWdpbjoiYmVob2xkZXIiLGVsZW1lbnROYW1lOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHNob3VsZFJlbW92ZURvbTohMH07aWYoIWQucGx1Z2luKXRocm93IEVycm9yKCJEYXNoYm9hcmQucGx1Z2luIG11c3QgYmUgcHJlc2VudCIpO2lmKCFkLmVsZW1lbnROYW1lKXRocm93IEVycm9yKCJEYXNoYm9hcmQuZWxlbWVudE5hbWUgbXVzdCBiZSBwcmVzZW50Iik7aWYoZC5wbHVnaW4gaW4gYi5kYXNoYm9hcmRSZWdpc3RyeSl0aHJvdyBFcnJvcihgUGx1Z2luIGFscmVhZHkgcmVnaXN0ZXJlZDogJHtkLnBsdWdpbn1gKTtkLnRhYk5hbWV8fAooZC50YWJOYW1lPWQucGx1Z2luKTtiLmRhc2hib2FyZFJlZ2lzdHJ5W2QucGx1Z2luXT1kfX0pKHFmfHwocWY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi11dGlscy91dGlscy5qcwp2YXIgcmY7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCxrKXtyZXR1cm4gMT09PWY/aDprfWIuYWdncmVnYXRlVGFnSW5mbz1mdW5jdGlvbihmLGgpe2xldCBrPXZvaWQgMDtjb25zdCB0PXt9O09iamVjdC5rZXlzKGYpLmZvckVhY2gocD0+e2NvbnN0IG09ZltwXTt2b2lkIDA9PT1rJiYoaz1tLmRpc3BsYXlOYW1lKTtrIT09bS5kaXNwbGF5TmFtZSYmKGs9bnVsbCk7dm9pZCAwPT09dFttLmRlc2NyaXB0aW9uXSYmKHRbbS5kZXNjcmlwdGlvbl09W10pO3RbbS5kZXNjcmlwdGlvbl0ucHVzaChwKX0pO2g9bnVsbCE9az9rOmg7Y29uc3QgbD0oKCk9Pntjb25zdCBwPU9iamVjdC5rZXlzKHQpO3JldHVybiAwPT09cC5sZW5ndGg/IiI6MT09PXAubGVuZ3RoP3BbMF06YCR7Ilx4M2NwXHgzZVx4M2NzdHJvbmdceDNlTXVsdGlwbGUgZGVzY3JpcHRpb25zOlx4M2Mvc3Ryb25nXHgzZVx4M2MvcFx4M2UifTx1bD4ke3AubWFwKG09Pntjb25zdCBuPXRbbV0ubWFwKHU9PmA8Y29kZT4ke3UucmVwbGFjZSgvPC9nLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nLAoiXHgyNmd0OyIpLnJlcGxhY2UoLyYvZywiXHgyNmFtcDsiKX08L2NvZGU+YCkscT0yPG4ubGVuZ3RoP24uc2xpY2UoMCxuLmxlbmd0aC0xKS5qb2luKCIsICIpKyIsIGFuZCAiK25bbi5sZW5ndGgtMV06bi5qb2luKCIgYW5kICIpO3JldHVybmA8bGk+PHA+Rm9yICR7ZChuLmxlbmd0aCwicnVuIiwicnVucyIpfSAke3F9OjwvcD4ke219PC9saT5gfSkuam9pbigiIil9PC91bD5gfSkoKTtyZXR1cm57ZGlzcGxheU5hbWU6aCxkZXNjcmlwdGlvbjpsfX19KShyZnx8KHJmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfX2FjdGl2ZUNoYW5nZWQifSxhbHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJsb2FkaW5nIixvYnNlcnZlcjoiX19hbHRDaGFuZ2VkIn0sX19jb29saW5nRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlczpmdW5jdGlvbihiLGQpe3JldHVybltifHxkPyJhY3RpdmUiOiIiLGQ/ImNvb2xkb3duIjoiIl0uam9pbigiICIpfSxfX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLl9fc2V0QXJpYUhpZGRlbighYik7dGhpcy5fX2Nvb2xpbmdEb3duPSFiJiZkfSxfX2FsdENoYW5nZWQ6ZnVuY3Rpb24oYil7ImxvYWRpbmciPT09Yj90aGlzLmFsdD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfHxiOih0aGlzLl9fc2V0QXJpYUhpZGRlbigiIj09PQpiKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYikpfSxfX3NldEFyaWFIaWRkZW46ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIil9LF9fcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9fY29vbGluZ0Rvd249dGhpcy5hY3RpdmU9ITF9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zcGlubmVyL3BhcGVyLXNwaW5uZXItbGl0ZS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zcGlubmVyLWxpdGUiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2RhdGEtbG9hZGVyLWJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oZil7ZltmLkxPQURJTkc9MF09IkxPQURJTkciO2ZbZi5MT0FERUQ9MV09IkxPQURFRCJ9KShkfHwoZD17fSkpO2IuRGF0YUxvYWRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvYWREYXRhSWZBY3RpdmUifSxsb2FkS2V5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sZGF0YVRvTG9hZDp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGdldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Zj0+U3RyaW5nKGYpfSxsb2FkRGF0YUNhbGxiYWNrOkZ1bmN0aW9uLHJlcXVlc3REYXRhOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGY9PnRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLmdldERhdGFMb2FkVXJsKGYpKX19LGdldERhdGFMb2FkVXJsOkZ1bmN0aW9uLGRhdGFMb2FkaW5nOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLAp2YWx1ZTohMX0sX2RhdGFMb2FkU3RhdGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2xvYWREYXRhQXN5bmM6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfZGF0YVRvTG9hZENoYW5nZWQoaXNBdHRhY2hlZCwgZGF0YVRvTG9hZC4qKSJdLG9uTG9hZEZpbmlzaCgpe30scmVsb2FkKCl7dGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuX2xvYWREYXRhKCl9LHJlc2V0KCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKTt0aGlzLl9jYW5jZWxsZXImJnRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTt0aGlzLl9kYXRhTG9hZFN0YXRlJiZ0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCk7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSwKX2RhdGFUb0xvYWRDaGFuZ2VkKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSxjcmVhdGVkKCl7dGhpcy5fbG9hZERhdGE9Xy50aHJvdHRsZSh0aGlzLl9sb2FkRGF0YUltcGwsMTAwLHtsZWFkaW5nOiEwLHRyYWlsaW5nOiEwfSl9LGRldGFjaGVkKCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKX0sX2xvYWREYXRhSWZBY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbG9hZERhdGEoKX0sX2xvYWREYXRhSW1wbCgpe3RoaXMuYWN0aXZlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9sb2FkRGF0YUFzeW5jKSx0aGlzLl9sb2FkRGF0YUFzeW5jPXRoaXMuYXN5bmModGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntpZighZi5jYW5jZWxsZWQpcmV0dXJuIHRoaXMuX3NldERhdGFMb2FkaW5nKCEwKSxmPXRoaXMuZGF0YVRvTG9hZC5maWx0ZXIoaD0+CntoPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGgpO3JldHVybiF0aGlzLl9kYXRhTG9hZFN0YXRlLmhhcyhoKX0pLm1hcChoPT57Y29uc3Qgaz10aGlzLmdldERhdGFMb2FkTmFtZShoKTt0aGlzLl9kYXRhTG9hZFN0YXRlLnNldChrLGQuTE9BRElORyk7cmV0dXJuIHRoaXMucmVxdWVzdERhdGEoaCkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUodD0+e3QuY2FuY2VsbGVkfHwodGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoayxkLkxPQURFRCksdGhpcy5sb2FkRGF0YUNhbGxiYWNrKHRoaXMsaCx0LnZhbHVlKSk7cmV0dXJuIGt9KSl9KSxQcm9taXNlLmFsbChmKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShoPT57aWYoIWguY2FuY2VsbGVkKXtjb25zdCBrPW5ldyBTZXQoaC52YWx1ZSk7aWYodGhpcy5kYXRhVG9Mb2FkLnNvbWUodD0+ay5oYXModGhpcy5nZXREYXRhTG9hZE5hbWUodCkpKSl0aGlzLm9uTG9hZEZpbmlzaCgpfUFycmF5LmZyb20odGhpcy5fZGF0YUxvYWRTdGF0ZS52YWx1ZXMoKSkuc29tZShrPT4Kaz09PWQuTE9BRElORyl8fHRoaXMuX3NldERhdGFMb2FkaW5nKCExKX0pLCgpPT57fSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHtjYW5jZWxsZWQ6aH0pPT57aHx8KHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9KSl9KSkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9wbG90dGFibGUuanMKLyoKIE1JVAogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgdGhlIFNpZ25hdHVyZSBBUEkgdG8gaGVscCBpbiBjb21wYXJpbmcgd2hlbiB0d28KIFBsb3R0YWJsZSBvYmplY3RzIGhhdmUgImNoYW5nZWQiLgoKIE1lbW9pemF0aW9uIGluIFBsb3R0YWJsZSBpcyBjb21wbGljYXRlZCBieSBtdXRhYmxlIHNjYWxlcyBhbmQgZGF0YXNldHMuIFdlIGNhbm5vdCBzaW1wbHkKIHJlZmVyZW5jZSBjb21wYXJlIHR3byBlLmcuIHNjYWxlcyBzaW5jZSBpdCBtYXkgaGF2ZSBpbnRlcm5hbGx5IG11dGF0ZWQuIFRvIHJlc29sdmUgdGhpcywKIHdlIHdyaXRlIGEgcmVjdXJzaXZlIFNpZ25hdHVyZSBpbnRlcmZhY2UgdGhhdCBob2xkcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2Ygd2hhdGV2ZXIKIHN0YXRlIHRoZSBzY2FsZS9kYXRhIHdhcyBpbiBhdCB0aGUgdGltZS4gVGhlbiBvbiBtZW1vaXplZCBmdW5jdGlvbiBpbnZvY2F0aW9uIHdlIHNpZ24gdGhlCiBuZXcgaW5wdXRzIGFuZCBjb21wYXJlIHRoZSBzaWduYXR1cmVzIHRvIGRlY2lkZSBpZiB3ZSBzaG91bGQgcmVjb21wdXRlLgoKIFdlIG11c3QgaGFuZC13cml0ZSBhIHNpZ25hdHVyZSBmb3IgZWFjaCBjdXN0b20gY2xhc3Mgd2Ugd2lzaCB0byBzdXBwb3J0LgogTUlUCgogQGZpbGVvdmVydmlldyBtYW51YWxseSBhZGQgZDMtc2VsZWN0aW9uLW11bHRpIHRvIGQzIGRlZmF1bHQgYnVuZGxlLiBNb3N0IG9mIHRoaXMgY29kZSBpcwogY29waWVkIGZyb20gZDMtc2VsZWN0aW9uLW11bHRpQDEuMC4wLgogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zZWxlY3Rpb24tbXVsdGkvaXNzdWVzLzExIGZvciB3aHkgd2UgaGF2ZSB0byBkbyB0aGlzCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGNvbnZlbmllbnQgdGh1bmsgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjb21tb24gY2FzZQogb2YgY3JlYXRpbmcgYSBtZW1vaXplZCBmdW5jdGlvbiB0aGF0IHRha2VzIGl0cyBpbnB1dHMgZnJvbSBtdXRhYmxlIGNsYXNzIHByb3BlcnRpZXMuCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGZ1bmN0aW9uIG1lbW9pemVyIHVzaW5nIHRoZSBTaWduYXR1cmUgQVBJLgogUGxvdHRhYmxlIDMuNy4wIChodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvcGxvdHRhYmxlKQogQ29weXJpZ2h0IDIwMTQtMjAxNyBQYWxhbnRpciBUZWNobm9sb2dpZXMKIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFKQogaXMtcGxhaW4tb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wbGFpbi1vYmplY3Q+CgogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LgogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogaXNvYmplY3QgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KKi8KKGZ1bmN0aW9uKGIsZCl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWQocmVxdWlyZSgiZDMiKSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZDMiXSxkKToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuUGxvdHRhYmxlPWQocmVxdWlyZSgiZDMiKSk6Yi5QbG90dGFibGU9ZChiLmQzKX0pKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoayl7aWYoaFtrXSlyZXR1cm4gaFtrXS5leHBvcnRzO3ZhciB0PWhba109e2k6ayxsOiExLGV4cG9ydHM6e319O2Rba10uY2FsbCh0LmV4cG9ydHMsdCx0LmV4cG9ydHMsZik7dC5sPSEwO3JldHVybiB0LmV4cG9ydHN9dmFyIGg9e307Zi5tPWQ7Zi5jPWg7Zi5pPWZ1bmN0aW9uKGspe3JldHVybiBrfTtmLmQ9ZnVuY3Rpb24oayx0LGwpe2YubyhrLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywKdCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Omx9KX07Zi5uPWZ1bmN0aW9uKGspe3ZhciB0PWsmJmsuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBrWyJkZWZhdWx0Il19OmZ1bmN0aW9uKCl7cmV0dXJuIGt9O2YuZCh0LCJhIix0KTtyZXR1cm4gdH07Zi5vPWZ1bmN0aW9uKGssdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChrLHQpfTtmLnA9IiI7cmV0dXJuIGYoZi5zPTE0MCl9KFtmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1kPWgoMTA3KTtmLkFycmF5PWQ7ZD1oKDExMCk7Zi5Db2xvcj1kO2Q9aCg1NSk7Zi5ET009ZDtkPWgoNTYpO2YuTWF0aD1kO2Q9aCgxMTMpO2YuT2JqZWN0PWQ7ZD1oKDU3KTtmLlJUcmVlPWQ7ZD1oKDExNSk7Zi5TdGFja2luZz1kO2Q9aCgzNSk7Zi5XaW5kb3c9ZDtrKGgoMTA4KSk7ayhoKDEwOSkpO2soaCgxMikpOwprKGgoMTExKSk7ayhoKDExMikpO2soaCg1OCkpO2soaCgxMTYpKX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWJ9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEcsRCxCKXt2YXIgST1ELmFjY2Vzc29yO0Q9RC5zY2FsZTtpZihudWxsPT1EKXJldHVybltdO3ZhciBOPUcuZGF0YSgpO251bGwhPUImJihOPU4uZmlsdGVyKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTyxILEcpfSkpO049Ti5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRyl9KTtyZXR1cm4gRC5leHRlbnRPZlZhbHVlcyhOKX12YXIgdD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRyxEKXtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1HfWZvcih2YXIgSSBpbiBEKUQuaGFzT3duUHJvcGVydHkoSSkmJihHW0ldPURbSV0pO0cucHJvdG90eXBlPW51bGw9PT1EP09iamVjdC5jcmVhdGUoRCk6KEIucHJvdG90eXBlPUQucHJvdG90eXBlLG5ldyBCKX0sbD1oKDEpLHA9aCg3KTtkPWgoNCk7dmFyIG09CmgoMTgpLG49aCg2KSxxPWgoOSksdT1oKDIwKSx4PWgoMCksQT1oKDEyKSx5PWgoMTApLHc9aCg1MSksQz1oKDUyKTtmLlJlbmRlcmVyPXkubWFrZUVudW0oWyJzdmciLCJjYW52YXMiXSk7aD1mdW5jdGlvbihHKXtmdW5jdGlvbiBEKCl7dmFyIEI9Ry5jYWxsKHRoaXMpfHx0aGlzO0IuX2RhdGFDaGFuZ2VkPSExO0IuX2F0dHJFeHRlbnRzPXt9O0IuX2FuaW1hdGU9ITE7Qi5fYW5pbWF0b3JzPXt9O0IuX3Byb3BlcnR5RXh0ZW50cz17fTtCLl9yZXNldEVudGl0eVN0b3JlPWZ1bmN0aW9uKCl7Qi5fY2FjaGVkRW50aXR5U3RvcmU9dm9pZCAwfTtCLl9vdmVyZmxvd0hpZGRlbj0hMDtCLmFkZENsYXNzKCJwbG90Iik7Qi5fZGF0YXNldFRvRHJhd2VyPW5ldyB4Lk1hcDtCLl9hdHRyQmluZGluZ3M9bC5tYXAoKTtCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKE4sTyl7cmV0dXJuIEIuX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGUoTixPKX07Qi5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQi5yZW5kZXIoKX07CkIuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIuX29uRGF0YXNldFVwZGF0ZSgpfTtCLl9wcm9wZXJ0eUJpbmRpbmdzPWwubWFwKCk7dmFyIEk9KG5ldyBwLkVhc2luZykubWF4VG90YWxEdXJhdGlvbihELl9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuTUFJTixJKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQsbmV3IHAuTnVsbCk7Qi5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlPXguV2luZG93LmRlYm91bmNlKEMuRGVmZXJyZWRSZW5kZXJlci5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVksQi5fcmVzZXRFbnRpdHlTdG9yZSk7cmV0dXJuIEJ9dChELEcpO0QuZ2V0VG90YWxEcmF3VGltZT1mdW5jdGlvbihCLEkpe3JldHVybiBJLnJlZHVjZShmdW5jdGlvbihOLE8pe3JldHVybiBOK08uYW5pbWF0b3IudG90YWxUaW1lKEIubGVuZ3RoKX0sMCl9O0QuYXBwbHlEcmF3U3RlcHM9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTil7dmFyIE89Ck4uYXR0clRvUHJvamVjdG9yLEg9e307T2JqZWN0LmtleXMoTykuZm9yRWFjaChmdW5jdGlvbihLKXtIW0tdPWZ1bmN0aW9uKE0sTCl7cmV0dXJuIE9bS10oTSxMLEkpfX0pO3JldHVybnthdHRyVG9BcHBsaWVkUHJvamVjdG9yOkgsYW5pbWF0b3I6Ti5hbmltYXRvcn19KX07RC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKEIpe0I9QS5jb2VyY2VFeHRlcm5hbEQzKEIpO0cucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsQik7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9pc1NldHVwfHwoRy5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksbnVsbCE9dGhpcy5fY2FudmFzJiZ0aGlzLl9hcHBlbmRDYW52YXNOb2RlKCksdGhpcy5fcmVuZGVyQXJlYT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJyZW5kZXItYXJlYSIsCiEwKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEkpfSkpfTtELnByb3RvdHlwZS5fYXBwZW5kQ2FudmFzTm9kZT1mdW5jdGlvbigpe3ZhciBCPXRoaXMuZWxlbWVudCgpLnNlbGVjdCgiLnBsb3QtY2FudmFzLWNvbnRhaW5lciIpO0IuZW1wdHkoKSYmKEI9dGhpcy5lbGVtZW50KCkuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJwbG90LWNhbnZhcy1jb250YWluZXIiLCEwKSxCLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMubm9kZSgpKSl9O0QucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihCLEksTixPKXtHLnByb3RvdHlwZS5zZXRCb3VuZHMuY2FsbCh0aGlzLEIsSSxOLE8pO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTtudWxsIT10aGlzLl9jYW52YXMmJih0aGlzLl9idWZmZXJDYW52YXMmJiF0aGlzLl9idWZmZXJDYW52YXNWYWxpZCYmKHRoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJ3aWR0aCIsCnRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIpKSx0aGlzLl9idWZmZXJDYW52YXMuYXR0cigiaGVpZ2h0Iix0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IikpLChOPXRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJk4uZHJhd0ltYWdlKHRoaXMuX2NhbnZhcy5ub2RlKCksMCwwKSx0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMCksTj1udWxsIT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxLHRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIsQipOKSx0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IixJKk4pLE89dGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKSYmKE8uc2V0VHJhbnNmb3JtKE4sMCwwLE4sMCwwKSx0aGlzLl9idWZmZXJDYW52YXMmJk8uZHJhd0ltYWdlKHRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCksMCwwLEIsSSkpfTtELnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIEI9dGhpczsKRy5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEkub2ZmVXBkYXRlKEIuX3JlbmRlckNhbGxiYWNrKX0pO3RoaXMuZGF0YXNldHMoW10pfTtELnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEIpe0I9dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldChCKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9CLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpCLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBCfTtELnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLlNWR0RyYXdlcigicGF0aCIsIiIpfSxmdW5jdGlvbihCKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEIsZnVuY3Rpb24oKXt9KX0pfTtELnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oQil7cmV0dXJuIHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKT8KdGhpcy5fYW5pbWF0b3JzW0JdfHxuZXcgcC5OdWxsOm5ldyBwLk51bGx9O0QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVFeHRlbnRzKCk7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMucmVuZGVyTG93UHJpb3JpdHkoKX07RC5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihCLEksTil7aWYobnVsbD09SSlyZXR1cm4gdGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTt0aGlzLl9iaW5kQXR0cihCLEksTik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2JpbmRQcm9wZXJ0eT1mdW5jdGlvbihCLEksTixPKXt2YXIgSD10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChCKTtIPW51bGwhPUg/SC5zY2FsZTpudWxsO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgST9JOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LHNjYWxlOk4scG9zdFNjYWxlOk99KTsKbnVsbCE9SCYmdGhpcy5fdW5pbnN0YWxsU2NhbGVGb3JLZXkoSCxCKTtudWxsIT1OJiZ0aGlzLl9pbnN0YWxsU2NhbGVGb3JLZXkoTixCKTt0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCl9O0QucHJvdG90eXBlLl9iaW5kQXR0cj1mdW5jdGlvbihCLEksTil7dmFyIE89dGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTtPPW51bGwhPU8/Ty5zY2FsZTpudWxsO3RoaXMuX2F0dHJCaW5kaW5ncy5zZXQoQix7YWNjZXNzb3I6ImZ1bmN0aW9uIj09PXR5cGVvZiBJP0k6ZnVuY3Rpb24oKXtyZXR1cm4gSX0sc2NhbGU6Tn0pO251bGwhPU8mJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KE8sQik7bnVsbCE9TiYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KE4sQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZT1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3J9O0QucHJvdG90eXBlLl9nZXRBdHRyVG9Qcm9qZWN0b3I9CmZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yJiYodGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yPXRoaXMuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCkpO3JldHVybiB4Lk9iamVjdC5hc3NpZ24oe30sdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yKX07RC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEI9e307dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oTixPKXtCW09dPUQuX3NjYWxlZEFjY2Vzc29yKE4pfSk7dmFyIEk9dGhpcy5fcHJvcGVydHlQcm9qZWN0b3JzKCk7T2JqZWN0LmtleXMoSSkuZm9yRWFjaChmdW5jdGlvbihOKXtudWxsPT1CW05dJiYoQltOXT1JW05dKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe0cucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5faXNBbmNob3JlZCYmKHRoaXMuX3BhaW50KCksCnRoaXMuX2RhdGFDaGFuZ2VkPSExKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJDYWxsYmFjaygpfTtELnByb3RvdHlwZS5hbmltYXRlZD1mdW5jdGlvbihCKXtpZihudWxsPT1CKXJldHVybiB0aGlzLl9hbmltYXRlO3RoaXMuX2FuaW1hdGU9QjtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7Ry5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fc2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEI9W107dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTsKcmV0dXJuIEJ9O0QucHJvdG90eXBlLl91cGRhdGVFeHRlbnRzPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7dGhpcy5fc2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gSS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKEIuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfSl9O0QucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiBudWxsfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yQXR0cj1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX2F0dHJFeHRlbnRzW0JdJiYodGhpcy5fYXR0ckV4dGVudHNbQl09dS5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBJLmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2F0dHJCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKE4sTyl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gayhILApPLG51bGwpfSl9KSk7cmV0dXJuIHRoaXMuX2F0dHJFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSYmKHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXT11Lm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIEkuZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4gSS5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2ZpbHRlckZvclByb3BlcnR5KEIpfSxmdW5jdGlvbihOLE8sSCl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gayhLLE8sSCl9KX0pKTtyZXR1cm4gdGhpcy5fcHJvcGVydHlFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlPWZ1bmN0aW9uKEIsSSl7dmFyIE49dGhpcztpZighdGhpcy5faXNBbmNob3JlZCYmCiFJKXJldHVybltdO3ZhciBPPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgsSyl7SC5zY2FsZT09PUImJihIPU4uZ2V0RXh0ZW50c0ZvckF0dHIoSyksbnVsbCE9SCYmKE89Ty5jb25jYXQobC5tZXJnZShIKSkpKX0pO3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaChmdW5jdGlvbihILEspe0guc2NhbGU9PT1CJiYoSD1OLmdldEV4dGVudHNGb3JQcm9wZXJ0eShLKSxudWxsIT1IJiYoTz1PLmNvbmNhdChsLm1lcmdlKEgpKSkpfSk7cmV0dXJuIE99O0QucHJvdG90eXBlLmFuaW1hdG9yPWZ1bmN0aW9uKEIsSSl7aWYodm9pZCAwPT09SSlyZXR1cm4gdGhpcy5fYW5pbWF0b3JzW0JdO3RoaXMuX2FuaW1hdG9yc1tCXT1JO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW5kZXJlcj1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9jYW52YXM/InN2ZyI6ImNhbnZhcyJ9O0QucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fYWRkRGF0YXNldChCKTsKdGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dmFyIEk9dGhpcy5fY3JlYXRlRHJhd2VyKEIpO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5zZXQoQixJKTt0aGlzLl9pc1NldHVwJiZ0aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQoQik7Qi5vblVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fcmVtb3ZlRGF0YXNldChCKTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKX07RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7aWYoLTE9PT10aGlzLmRhdGFzZXRzKCkuaW5kZXhPZihCKSlyZXR1cm4gdGhpczt0aGlzLl9yZW1vdmVEYXRhc2V0Tm9kZXMoQik7Qi5vZmZVcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5kZWxldGUoQik7CnJldHVybiB0aGlzfTtELnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEIpe3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQikucmVtb3ZlKCl9O0QucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXMsTj1bXTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbihPLEgpe3JldHVybiBOLnB1c2goSCl9KTtpZihudWxsPT1CKXJldHVybiBOO04uZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fcmVtb3ZlRGF0YXNldChPKX0pO0IuZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fYWRkRGF0YXNldChPKX0pO3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgcC5OdWxsfV19O0QucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9CmZ1bmN0aW9uKCl7fTtELnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgST10aGlzLE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8sSCl7dmFyIEs9SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKSxNPTA7Ty5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihMLFEpe3ZhciBUPUkuX3BpeGVsUG9pbnQoTCxRLE8pO3guTWF0aC5pc05hTihULngpfHx4Lk1hdGguaXNOYU4oVC55KXx8KE4ucHVzaCh7ZGF0dW06TCxnZXQgcG9zaXRpb24oKXtyZXR1cm4gSS5fcGl4ZWxQb2ludC5jYWxsKEksTCxRLE8pfSxpbmRleDpRLGRhdGFzZXQ6TyxkYXRhc2V0SW5kZXg6SCxjb21wb25lbnQ6SSxkcmF3ZXI6Syx2YWxpZERhdHVtSW5kZXg6TX0pLE0rKyl9KX0pO3JldHVybiBOfTtELnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5zZXQoSSwKSS5kYXRhKCkpfSk7cmV0dXJuIEJ9O0QucHJvdG90eXBlLl9wYWludD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7ZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcjt2YXIgST10aGlzLl9nZW5lcmF0ZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpLE89dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gQi5fZGF0YXNldFRvRHJhd2VyLmdldChLKX0pO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXt2YXIgSD10aGlzLl9jYW52YXMubm9kZSgpO0guZ2V0Q29udGV4dCgiMmQiKS5jbGVhclJlY3QoMCwwLEguY2xpZW50V2lkdGgsSC5jbGllbnRIZWlnaHQpO3RoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkPSExfXRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEssTSl7dmFyIEw9RC5hcHBseURyYXdTdGVwcyhJLEspO09bTV0uZHJhdyhOLmdldChLKSxMKX0pO0g9dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gRC5nZXRUb3RhbERyYXdUaW1lKE4uZ2V0KEspLApJKX0pO0g9eC5NYXRoLm1heChILDApO3RoaXMuX2FkZGl0aW9uYWxQYWludChIKX07RC5wcm90b3R5cGUuc2VsZWN0aW9ucz1mdW5jdGlvbihCKXt2YXIgST10aGlzO3ZvaWQgMD09PUImJihCPXRoaXMuZGF0YXNldHMoKSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpcmV0dXJuIGwuc2VsZWN0QWxsKCk7dmFyIE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8pe089SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKTtudWxsIT1PJiYoTz1PLmdldFZpc3VhbFByaW1pdGl2ZXMoKSxOLnB1c2guYXBwbHkoTixPKSl9KTtyZXR1cm4gbC5zZWxlY3RBbGwoTil9O0QucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7cmV0dXJuIHRoaXMuX2dldEVudGl0eVN0b3JlKEIpLmVudGl0aWVzKCkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuX2dldEVudGl0eVN0b3JlPWZ1bmN0aW9uKEIpe2Z1bmN0aW9uIEkoSCl7cmV0dXJuIE4uX2VudGl0eUJvdW5kcyhIKX0KdmFyIE49dGhpcztpZih2b2lkIDAhPT1CKXt2YXIgTz1uZXcgeC5FbnRpdHlTdG9yZTtPLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKEIpLEksdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSk7cmV0dXJuIE99dm9pZCAwPT09dGhpcy5fY2FjaGVkRW50aXR5U3RvcmUmJihPPW5ldyB4LkVudGl0eVN0b3JlLE8uYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModGhpcy5kYXRhc2V0cygpKSxJLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlPU8pO3JldHVybiB0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZX07RC5wcm90b3R5cGUuX2xvY2FsT3JpZ2luQm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnRoaXMuaGVpZ2h0KCl9fX07RC5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihCKXtCPXRoaXMuX3BpeGVsUG9pbnQoQi5kYXR1bSwKQi5pbmRleCxCLmRhdGFzZXQpO3JldHVybnt4OkIueCx5OkIueSx3aWR0aDowLGhlaWdodDowfX07RC5wcm90b3R5cGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eT1mdW5jdGlvbihCKXtyZXR1cm57Ym91bmRzOnRoaXMuX2VudGl0eUJvdW5kcyhCKSxjb21wb25lbnQ6Qi5jb21wb25lbnQsZGF0YXNldDpCLmRhdGFzZXQsZGF0YXNldEluZGV4OkIuZGF0YXNldEluZGV4LGRhdHVtOkIuZGF0dW0saW5kZXg6Qi5pbmRleCxwb3NpdGlvbjpCLnBvc2l0aW9uLHNlbGVjdGlvbjpsLnNlbGVjdChCLmRyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKClbQi52YWxpZERhdHVtSW5kZXhdKX19O0QucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigicGxvdHMgbXVzdCBpbXBsZW1lbnQgZW50aXRpZXNBdCIpO307RC5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihCKXtCPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdChCKTsKcmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOnRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShCKX07RC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihCLEkpe3JldHVybiB0aGlzLmVudGl0aWVzSW5Cb3VuZHMobnVsbD09ST97eDpCLnRvcExlZnQueCx5OkIudG9wTGVmdC55LHdpZHRoOkIuYm90dG9tUmlnaHQueC1CLnRvcExlZnQueCxoZWlnaHQ6Qi5ib3R0b21SaWdodC55LUIudG9wTGVmdC55fTp7eDpCLm1pbix5OkkubWluLHdpZHRoOkIubWF4LUIubWluLGhlaWdodDpJLm1heC1JLm1pbn0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5Cb3VuZHMoQikpcmV0dXJuIEIubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHM9CmZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5YQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5ZQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7Qi5vZmZVcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9OwpELnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEIpe0Iub25VcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub25VcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9O0QucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm57fX07RC5fc2NhbGVkQWNjZXNzb3I9ZnVuY3Rpb24oQil7dmFyIEk9Qi5zY2FsZSxOPUIuYWNjZXNzb3IsTz1CLnBvc3RTY2FsZSxIPW51bGw9PUk/TjpmdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkuc2NhbGUoTihLLE0sTCkpfTtyZXR1cm4gbnVsbD09Tz9IOmZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTyhIKEssTSxMKSxLLE0sTCl9fTtELnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbigpe3JldHVybnt4OjAseTowfX07RC5wcm90b3R5cGUuX2FuaW1hdGVPbk5leHRSZW5kZXI9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGUmJnRoaXMuX2RhdGFDaGFuZ2VkfTtyZXR1cm4gRH0oZC5Db21wb25lbnQpO2guX0FOSU1BVElPTl9NQVhfRFVSQVRJT049NjAwO2YuUGxvdD1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhwKXtmb3IodmFyIG0gaW4gcClmLmhhc093blByb3BlcnR5KG0pfHwoZlttXT1wW21dKX1kPWgoMTA1KTtmLlRpY2tHZW5lcmF0b3JzPWQ7ayhoKDU0KSk7ayhoKDEwMSkpO2soaCgxMDIpKTtrKGgoMTAzKSk7ayhoKDEwNCkpO2soaCgxMDYpKTt2YXIgdD1oKDU0KSxsPWgoMTEpO2YuaXNUcmFuc2Zvcm1hYmxlPWZ1bmN0aW9uKHApe3JldHVybiBwIGluc3RhbmNlb2YgbC5RdWFudGl0YXRpdmVTY2FsZXx8cCBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoMzApLGw9aCgwKSxwPWgoMTIpO2Q9aCgxMCk7Zi5YQWxpZ25tZW50PWQubWFrZUVudW0oWyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXSk7CmYuWUFsaWdubWVudD1kLm1ha2VFbnVtKFsidG9wIiwiY2VudGVyIiwiYm90dG9tIl0pO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKCl7dGhpcy5fb3ZlcmZsb3dIaWRkZW49ITE7dGhpcy5fb3JpZ2luPXt4OjAseTowfTt0aGlzLl94QWxpZ25tZW50PSJsZWZ0Ijt0aGlzLl95QWxpZ25tZW50PSJ0b3AiO3RoaXMuX2lzQW5jaG9yZWQ9dGhpcy5faXNTZXR1cD0hMTt0aGlzLl9jc3NDbGFzc2VzPW5ldyBsLlNldDt0aGlzLl9kZXN0cm95ZWQ9ITE7dGhpcy5fb25BbmNob3JDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fb25EZXRhY2hDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fY3NzQ2xhc3Nlcy5hZGQoImNvbXBvbmVudCIpfW0ucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihuKXtuPXAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkNhbid0IHJldXNlIGRlc3Ryb3koKS1lZCBDb21wb25lbnRzISIpO3RoaXMuaXNSb290KCkmJgoodGhpcy5fcm9vdEVsZW1lbnQ9bix0aGlzLl9yb290RWxlbWVudC5jbGFzc2VkKCJwbG90dGFibGUiLCEwKSk7bnVsbCE9dGhpcy5fZWxlbWVudD9uLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50Lm5vZGUoKSk6KHRoaXMuX2VsZW1lbnQ9bi5hcHBlbmQoImRpdiIpLHRoaXMuX3NldHVwKCkpO3RoaXMuX2lzQW5jaG9yZWQ9ITA7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25BbmNob3I9ZnVuY3Rpb24obil7dGhpcy5faXNBbmNob3JlZCYmbih0aGlzKTt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkFuY2hvcj1mdW5jdGlvbihuKXt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5faXNTZXR1cHx8KHRoaXMuX2Nzc0NsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihxKXtuLl9lbGVtZW50LmNsYXNzZWQocSwKITApfSksdGhpcy5fY3NzQ2xhc3Nlcz1uZXcgbC5TZXQsdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiYmFja2dyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9jb250ZW50PXRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJjb250ZW50IiwhMCksdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiZm9yZWdyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9vdmVyZmxvd0hpZGRlbj90aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4iLCEwKTp0aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIiwhMCksdGhpcy5faXNTZXR1cD0hMCl9O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9fTttLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihuLHEsdSl7aWYobnVsbD09bnx8bnVsbD09cXx8bnVsbD09dSl7aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiYW5jaG9yKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGVMYXlvdXQoKSIpO2lmKG51bGwhPXRoaXMuX3Jvb3RFbGVtZW50KW49e3g6MCx5OjB9LHU9dGhpcy5fcm9vdEVsZW1lbnQubm9kZSgpLHE9bC5ET00uZWxlbWVudFdpZHRoKHUpLHU9bC5ET00uZWxlbWVudEhlaWdodCh1KTtlbHNlIHRocm93IEVycm9yKCJudWxsIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIHRvIGNvbXB1dGVMYXlvdXQoKSBvbiBhIG5vbi1yb290LCB1bmFuY2hvcmVkIG5vZGUiKTt9dmFyIHg9dGhpcy5fc2l6ZUZyb21PZmZlcihxLHUpLEE9eC5oZWlnaHQ7eD14LndpZHRoO3RoaXMuc2V0Qm91bmRzKHgsQSxuLngrKHEteCkqbS5feEFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3hBbGlnbm1lbnRdLG4ueSsodS1BKSptLl95QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feUFsaWdubWVudF0pOwpyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuc2V0Qm91bmRzPWZ1bmN0aW9uKG4scSx1LHgpe3ZvaWQgMD09PXUmJih1PTApO3ZvaWQgMD09PXgmJih4PTApO3RoaXMuX3dpZHRoPW47dGhpcy5faGVpZ2h0PXE7dGhpcy5fb3JpZ2luPXt4OnUseTp4fTtudWxsIT10aGlzLl9lbGVtZW50JiZ0aGlzLl9lbGVtZW50LnN0eWxlcyh7bGVmdDp1KyJweCIsaGVpZ2h0OnErInB4Iix0b3A6eCsicHgiLHdpZHRoOm4rInB4In0pO251bGwhPXRoaXMuX3Jlc2l6ZUhhbmRsZXImJnRoaXMuX3Jlc2l6ZUhhbmRsZXIoe3dpZHRoOm4saGVpZ2h0OnF9KX07bS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obixxKXt2YXIgdT10aGlzLnJlcXVlc3RlZFNwYWNlKG4scSk7cmV0dXJue3dpZHRoOnRoaXMuZml4ZWRXaWR0aCgpP01hdGgubWluKG4sdS5taW5XaWR0aCk6bixoZWlnaHQ6dGhpcy5maXhlZEhlaWdodCgpP01hdGgubWluKHEsdS5taW5IZWlnaHQpOnF9fTttLnByb3RvdHlwZS5yZW5kZXI9CmZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmMDw9dGhpcy53aWR0aCgpJiYwPD10aGlzLmhlaWdodCgpJiZ0LnJlZ2lzdGVyVG9SZW5kZXIodGhpcyk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX07bS5wcm90b3R5cGUuX3NjaGVkdWxlQ29tcHV0ZUxheW91dD1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJnQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyl9O20ucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKG4pe3RoaXMuX3Jlc2l6ZUhhbmRsZXI9bjtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmKHRoaXMuaXNSb290KCk/dGhpcy5fc2NoZWR1bGVDb21wdXRlTGF5b3V0KCk6CnRoaXMucGFyZW50KCkucmVkcmF3KCkpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt9O20ucHJvdG90eXBlLnJlbmRlclRvPWZ1bmN0aW9uKG4pe3RoaXMuZGV0YWNoKCk7aWYobnVsbCE9bil7bj0ic3RyaW5nIj09PXR5cGVvZiBuP2suc2VsZWN0KG4pOm4gaW5zdGFuY2VvZiBFbGVtZW50P2suc2VsZWN0KG4pOnAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZighbi5ub2RlKCl8fG51bGw9PW4ubm9kZSgpLm5vZGVOYW1lKXRocm93IEVycm9yKCJQbG90dGFibGUgcmVxdWlyZXMgYSB2YWxpZCBFbGVtZW50IHRvIHJlbmRlclRvIik7aWYoInN2ZyI9PT1uLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIDMueCBhbmQgbGF0ZXIgY2FuIG9ubHkgcmVuZGVyVG8gYW4gSFRNTCBjb21wb25lbnQ7IHBhc3MgYSBkaXYgaW5zdGVhZCEiKTt0aGlzLmFuY2hvcihuKX1pZihudWxsPT10aGlzLl9lbGVtZW50KXRocm93IEVycm9yKCJJZiBhIENvbXBvbmVudCBoYXMgbmV2ZXIgYmVlbiByZW5kZXJlZCBiZWZvcmUsIHRoZW4gcmVuZGVyVG8gbXVzdCBiZSBnaXZlbiBhIG5vZGUgdG8gcmVuZGVyIHRvLCBvciBhIGQzLlNlbGVjdGlvbiwgb3IgYSBzZWxlY3RvciBzdHJpbmciKTsKdC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKTt0LmZsdXNoKCl9O20ucHJvdG90eXBlLnhBbGlnbm1lbnQ9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5feEFsaWdubWVudDtuPW4udG9Mb3dlckNhc2UoKTtpZihudWxsPT1tLl94QWxpZ25Ub1Byb3BvcnRpb25bbl0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIituKTt0aGlzLl94QWxpZ25tZW50PW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueUFsaWdubWVudD1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl95QWxpZ25tZW50O249bi50b0xvd2VyQ2FzZSgpO2lmKG51bGw9PW0uX3lBbGlnblRvUHJvcG9ydGlvbltuXSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiK24pO3RoaXMuX3lBbGlnbm1lbnQ9bjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5oYXNDbGFzcz1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09Cm4/ITE6bnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmhhcyhuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobil9O20ucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuYWRkKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCEwKSl9O20ucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuZGVsZXRlKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCExKSl9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQobnVsbCk7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9pc0FuY2hvcmVkPQohMTt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vbkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbihuKXtpZih2b2lkIDA9PT1uKXJldHVybiB0aGlzLl9wYXJlbnQ7aWYobnVsbCE9PW4mJiFuLmhhcyh0aGlzKSl0aHJvdyBFcnJvcigiUGFzc2VkIGludmFsaWQgcGFyZW50Iik7dGhpcy5fcGFyZW50PW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbigpe3ZhciBuPXRoaXMub3JpZ2luKCk7cmV0dXJue3RvcExlZnQ6bixib3R0b21SaWdodDp7eDpuLngrdGhpcy53aWR0aCgpLHk6bi55K3RoaXMuaGVpZ2h0KCl9fX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3llZD0KITA7dGhpcy5kZXRhY2goKX07bS5wcm90b3R5cGUud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9O20ucHJvdG90eXBlLmhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oZWlnaHR9O20ucHJvdG90eXBlLm9yaWdpbj1mdW5jdGlvbigpe3JldHVybnt4OnRoaXMuX29yaWdpbi54LHk6dGhpcy5fb3JpZ2luLnl9fTttLnByb3RvdHlwZS5vcmlnaW5Ub1Jvb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcy5vcmlnaW4oKSxxPXRoaXMucGFyZW50KCk7bnVsbCE9cTspe3ZhciB1PXEub3JpZ2luKCk7bi54Kz11Lng7bi55Kz11Lnk7cT1xLnBhcmVudCgpfXJldHVybiBufTttLnByb3RvdHlwZS5yb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXM7IW4uaXNSb290KCk7KW49bi5wYXJlbnQoKTtyZXR1cm4gbn07bS5wcm90b3R5cGUuaXNSb290PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMucGFyZW50KCl9O20ucHJvdG90eXBlLmZvcmVncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcn07Cm0ucHJvdG90eXBlLmNvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudH07bS5wcm90b3R5cGUuZWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50fTttLnByb3RvdHlwZS5yb290RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3QoKS5fcm9vdEVsZW1lbnR9O20ucHJvdG90eXBlLmJhY2tncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcn07cmV0dXJuIG19KCk7ZC5feEFsaWduVG9Qcm9wb3J0aW9uPXtsZWZ0OjAsY2VudGVyOi41LHJpZ2h0OjF9O2QuX3lBbGlnblRvUHJvcG9ydGlvbj17dG9wOjAsY2VudGVyOi41LGJvdHRvbToxfTtmLkNvbXBvbmVudD1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNTkpKTtrKGgoNjIpKTtrKGgoMTMzKSk7ayhoKDIxKSk7ayhoKDY0KSk7ayhoKDY2KSl9LApmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGssdCl7dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeT1rO3RoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnk9dH1oLnByb3RvdHlwZS51c2VTVkc9ZnVuY3Rpb24oayl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt2YXIgdD10aGlzLl9zdmdEcmF3ZXJGYWN0b3J5KCk7dC5hdHRhY2hUbyhrKTt0aGlzLl9jdXJyZW50RHJhd2VyPXR9O2gucHJvdG90eXBlLnVzZUNhbnZhcz1mdW5jdGlvbihrKXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpO3RoaXMuX2N1cnJlbnREcmF3ZXI9dGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeShrLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKX07aC5wcm90b3R5cGUuZ2V0RHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXJ9O2gucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe251bGwhPQp0aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpfTtoLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGssdCl7dGhpcy5fY3VycmVudERyYXdlci5kcmF3KGssdCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleChrKX07cmV0dXJuIGh9KCk7Zi5Qcm94eURyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNzApKTtrKGgoNzEpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7dm9pZCAwPT09cCYmKHA9Myk7dChwKTtyZXR1cm4gZnVuY3Rpb24obSl7cmV0dXJuIG0udG9GaXhlZChwKX19CmZ1bmN0aW9uIHQocCl7aWYoMD5wfHwyMDxwKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyMCIpO2lmKHAhPT1NYXRoLmZsb29yKHApKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYW4gaW50ZWdlciIpO312YXIgbD1oKDEpO2YuY3VycmVuY3k9ZnVuY3Rpb24ocCxtLG4pe3ZvaWQgMD09PXAmJihwPTIpO3ZvaWQgMD09PW0mJihtPSIkIik7dm9pZCAwPT09biYmKG49ITApO3ZhciBxPWsocCk7cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PXEoTWF0aC5hYnModSkpOyIiIT09eCYmKHg9bj9tK3g6eCttLDA+dSYmKHg9Ii0iK3gpKTtyZXR1cm4geH19O2YuZml4ZWQ9aztmLmdlbmVyYWw9ZnVuY3Rpb24oKXt2YXIgcDt2b2lkIDA9PT1wJiYocD0zKTt0KHApO3JldHVybiBmdW5jdGlvbihtKXtpZigibnVtYmVyIj09PXR5cGVvZiBtKXt2YXIgbj1NYXRoLnBvdygxMCxwKTtyZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobSoKbikvbil9cmV0dXJuIFN0cmluZyhtKX19O2YuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ocCl7cmV0dXJuIFN0cmluZyhwKX19O2YucGVyY2VudGFnZT1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0wKTt2YXIgbT1rKHApO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcT1uLnRvU3RyaW5nKCk7cT1NYXRoLnBvdygxMCxxLmxlbmd0aC0ocS5pbmRleE9mKCIuIikrMSkpO3JldHVybiBtKHBhcnNlSW50KCgxMDAqbipxKS50b1N0cmluZygpLDEwKS9xKSsiJSJ9fTtmLnNpU3VmZml4PWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBsLmZvcm1hdCgiLiIrcCsicyIpKG0pfX07Zi5zaG9ydFNjYWxlPWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7dmFyIG09bC5mb3JtYXQoIi4iK3ArImUiKSxuPWwuZm9ybWF0KCIuIitwKyJmIikscT1NYXRoLnBvdygxMCwxOCksdT1NYXRoLnBvdygxMCwtcCk7CnJldHVybiBmdW5jdGlvbih4KXt2YXIgQT1NYXRoLmFicyh4KTtpZigoQTx1fHxBPj1xKSYmMCE9PUEpcmV0dXJuIG0oeCk7Zm9yKHZhciB5PS0xO0E+PU1hdGgucG93KDFFMyx5KzIpJiY0Pnk7KXkrKztBPS0xPT09eT9uKHgpOm4oeC9NYXRoLnBvdygxRTMseSsxKSkrIktNQlRRIlt5XTtpZigwPHgmJiIxMDAwIj09PUEuc3Vic3RyKDAsNCl8fDA+eCYmIi0xMDAwIj09PUEuc3Vic3RyKDAsNSkpND55Pyh5KyssQT1uKHgvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV0pOkE9bSh4KTtyZXR1cm4gQX19O2YubXVsdGlUaW1lPWZ1bmN0aW9uKCl7dmFyIHA9W3tzcGVjaWZpZXI6Ii4lTCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNaWxsaXNlY29uZHMoKX19LHtzcGVjaWZpZXI6IjolUyIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRTZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiIlSTolTSIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09Cm0uZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24obSl7cmV0dXJuIDAhPT1tLmdldERheSgpJiYxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihtKXt2YXIgbj1wLmZpbHRlcihmdW5jdGlvbihxKXtyZXR1cm4gcS5wcmVkaWNhdGUobSl9KTtyZXR1cm4gbC50aW1lRm9ybWF0KDA8bi5sZW5ndGg/blswXS5zcGVjaWZpZXI6IiVZIikobSl9fTtmLnRpbWU9ZnVuY3Rpb24ocCl7cmV0dXJuIGwudGltZUZvcm1hdChwKX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9aCgwKTsKZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCxtKXt0aGlzLl9yb290PWsuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpO3RoaXMuX2NsYXNzTmFtZT1tO3RoaXMuX3N2Z0VsZW1lbnROYW1lPXB9bC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihwLG0pe3ZhciBuPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKHApO3ZhciBxPTA7bS5mb3JFYWNoKGZ1bmN0aW9uKHUpe3QuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZHJhd1N0ZXAodSl9LHEpO3ErPXUuYW5pbWF0b3IudG90YWxUaW1lKHAubGVuZ3RoKX0pfTtsLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKTtyZXR1cm4gdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzfTsKbC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5nZXRWaXN1YWxQcmltaXRpdmVzKClbcF19O2wucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3Jvb3QucmVtb3ZlKCl9O2wucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKHApe3Aubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3Qubm9kZSgpKX07bC5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fTtsLnByb3RvdHlwZS5zZWxlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdmdFbGVtZW50TmFtZX07bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt9O2wucHJvdG90eXBlLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHM9ZnVuY3Rpb24ocCl7cD1wLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbnVsbCE9bX0pO3A9dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKHApOwp0aGlzLl9zZWxlY3Rpb249cC5lbnRlcigpLmFwcGVuZCh0aGlzLl9zdmdFbGVtZW50TmFtZSkubWVyZ2UocCk7cC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGw7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsITApO3RoaXMuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXModGhpcy5fc2VsZWN0aW9uKX07bC5wcm90b3R5cGUuX2RyYXdTdGVwPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXM7WyJmaWxsIiwic3Ryb2tlIl0uZm9yRWFjaChmdW5jdGlvbihuKXtudWxsIT1wLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3Jbbl0mJm0uX3NlbGVjdGlvbi5hdHRyKG4scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dKX0pO3AuYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKTtudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwKITApfTtyZXR1cm4gbH0oKTtmLlNWR0RyYXdlcj1kfSxmdW5jdGlvbihkLGYpe2YubWFrZUVudW09ZnVuY3Rpb24oaCl7cmV0dXJuIGgucmVkdWNlKGZ1bmN0aW9uKGssdCl7a1t0XT10O3JldHVybiBrfSx7fSl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0sbil7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiYobVt1XT1uW3VdKTttLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihxLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcSl9LHQ9aCgxKSxsPWgoMjYpLHA9aCgwKTtkPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIG4oKXt2YXIgcT1tLmNhbGwodGhpcyl8fHRoaXM7cS5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih1KXtyZXR1cm4gdS5kZWZhdWx0VGlja3MoKX07cS5fcGFkUHJvcG9ydGlvbj0uMDU7cS5fc25hcHBpbmdEb21haW5FbmFibGVkPQohMDtxLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycz1uZXcgcC5TZXQ7cmV0dXJuIHF9ayhuLG0pO24ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9kb21haW5NYXg9dGhpcy5fZG9tYWluTWluPW51bGw7bS5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpfTtuLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbiYmbnVsbCE9dGhpcy5fZG9tYWluTWF4KXRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1heF0pO2Vsc2V7dmFyIHE9dGhpcy5fZ2V0RXh0ZW50KCk7bnVsbCE9dGhpcy5fZG9tYWluTWluPyhxPXFbMV0sdGhpcy5fZG9tYWluTWluPj1xJiYocT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbixxXSkpOgpudWxsIT10aGlzLl9kb21haW5NYXg/KHE9cVswXSx0aGlzLl9kb21haW5NYXg8PXEmJihxPXRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NYXgsdGhpcy5fZG9tYWluTWF4XSlbMF0pLHRoaXMuX3NldERvbWFpbihbcSx0aGlzLl9kb21haW5NYXhdKSk6bS5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUuY2FsbCh0aGlzKX19O24ucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24ocSl7dm9pZCAwPT09cSYmKHE9ITEpO3E9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMocSk7dmFyIHU9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1xLmxlbmd0aCYmKHE9W3AuTWF0aC5taW4ocSx1WzBdKSxwLk1hdGgubWF4KHEsdVsxXSldLHU9dGhpcy5fcGFkRG9tYWluKHEpKTtyZXR1cm4gdX07bi5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciBxPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbiYmCihxWzBdPXRoaXMuX2RvbWFpbk1pbik7bnVsbCE9dGhpcy5fZG9tYWluTWF4JiYocVsxXT10aGlzLl9kb21haW5NYXgpO3JldHVybiBxfTtuLnByb3RvdHlwZS5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZChxKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O24ucHJvdG90eXBlLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24ocSl7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZGVsZXRlKHEpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07bi5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKDA+cSl0aHJvdyBFcnJvcigicGFkUHJvcG9ydGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpO3RoaXMuX3BhZFByb3BvcnRpb249cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CnJldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcGFkRG9tYWluPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7aWYocVswXS52YWx1ZU9mKCk9PT1xWzFdLnZhbHVlT2YoKSlyZXR1cm4gdGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4ocSk7aWYoMD09PXRoaXMuX3BhZFByb3BvcnRpb24pcmV0dXJuIHE7dmFyIHg9dGhpcy5fcGFkUHJvcG9ydGlvbi8yLEE9cVswXSx5PXFbMV0sdz0hMSxDPSExO3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24oRCl7RCh1KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0IudmFsdWVPZigpPT09QS52YWx1ZU9mKCkmJih3PSEwKTtCLnZhbHVlT2YoKT09PXkudmFsdWVPZigpJiYoQz0hMCl9KX0pO3ZhciBHPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihxKTtxPXc/QTp0aGlzLmludmVydCh0aGlzLnNjYWxlKEEpLSh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3g9Qz8KeTp0aGlzLmludmVydCh0aGlzLnNjYWxlKHkpKyh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihHKTtyZXR1cm4gdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW3EseF0pOltxLHhdfTtuLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24ocSl7bnVsbCE9cSYmKHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD1xLHRoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSl9O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihxKXtyZXR1cm4gcX07bi5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydCIpO307bi5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKHEpe251bGwhPXEmJih0aGlzLl9kb21haW5NaW49cVswXSx0aGlzLl9kb21haW5NYXg9cVsxXSk7CnJldHVybiBtLnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLHEpfTtuLnByb3RvdHlwZS5kb21haW5NaW49ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5kb21haW4oKVswXTt0aGlzLl9kb21haW5NaW49cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmRvbWFpbk1heD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLmRvbWFpbigpWzFdO3RoaXMuX2RvbWFpbk1heD1xO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24ocSl7cT10LmV4dGVudChxLmZpbHRlcihmdW5jdGlvbih1KXtyZXR1cm4gcC5NYXRoLmlzVmFsaWROdW1iZXIoK3UpfSkpO3JldHVybiBudWxsPT1xWzBdfHxudWxsPT1xWzFdP1tdOnF9O24ucHJvdG90eXBlLnpvb209ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24oQSl7cmV0dXJuIHguaW52ZXJ0KGwuem9vbU91dChBLApxLHUpKX0pKX07bi5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcChmdW5jdGlvbih4KXtyZXR1cm4gdS5pbnZlcnQoeCtxKX0pKX07bi5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZVRyYW5zZm9ybWF0aW9uIik7fTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydGVkVHJhbnNmb3JtYXRpb24iKTt9O24ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRXh0ZW50Iik7fTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpOwp9O24ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNldFRyYW5zZm9ybWF0aW9uRG9tYWluIik7fTtuLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIHAuTWF0aC5pc05hTih4KXx8SW5maW5pdHk9PT14fHwtSW5maW5pdHk9PT14fXUocVswXSl8fHUocVsxXSk/cC5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMscSl9O24ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RGVmYXVsdFRpY2tzIik7fTtuLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfTsKbi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKTt9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iik7fTtuLnByb3RvdHlwZS50aWNrR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHE9UGxvdHRhYmxlLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpO251bGwhPXEmJih0aGlzLl90aWNrR2VuZXJhdG9yPXEpfTtyZXR1cm4gbn0oaCgxNykuU2NhbGUpO2QuX0RFRkFVTFRfTlVNX1RJQ0tTPTEwO2YuUXVhbnRpdGF0aXZlU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQuYXR0cnMpe2lmKG51bGw9PXQubm9kZXMpe3ZhciBsPVtdO3QuZWFjaChmdW5jdGlvbigpe2wucHVzaCh0aGlzKX0pOwpyZXR1cm4gay5zZWxlY3RBbGwobCl9cmV0dXJuIGsuc2VsZWN0QWxsKHQubm9kZXMoKSl9cmV0dXJuIHR9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoODMpKTtrKGgoODQpKTtrKGgoODUpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDQ0KSk7ayhoKDQ1KSk7ayhoKDQ2KSk7ayhoKDE4KSk7ayhoKDYpKTtrKGgoMzMpKTtrKGgoMzQpKTtrKGgoNDcpKTtrKGgoOSkpO2soaCg0OCkpfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7dmFyIGs9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gay5fYW5jaG9yKHQpfTt0aGlzLl9lbmFibGVkPSEwfWgucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKGspe3RoaXMuX2Rpc2Nvbm5lY3QoKTsKdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1rO3RoaXMuX2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbigpe3RoaXMuZGV0YWNoKCl9O2gucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX2Rpc2Nvbm5lY3QoKTt0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGw7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fZW5hYmxlZDsodGhpcy5fZW5hYmxlZD1rKT90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMH07aC5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMX07aC5wcm90b3R5cGUuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2U9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vcmlnaW5Ub1Jvb3QoKTsKcmV0dXJue3g6ay54LXQueCx5OmsueS10Lnl9fTtoLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24oayl7cmV0dXJuIDA8PWsueCYmMDw9ay55JiZrLng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmay55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtoLnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCl0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9uQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07aC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl91bmFuY2hvcigpO251bGwhPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8mJnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub2ZmQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07cmV0dXJuIGh9KCk7CmYuSW50ZXJhY3Rpb249ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCg1MiksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSgpe3ZhciB1PW4uY2FsbCh0aGlzKXx8dGhpczt1Ll9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3UuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dS5fZGVmZXJyZWRSZW5kZXJpbmc9ITE7dS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybT1mdW5jdGlvbih4LEEseSx3KXt1Ll9pc0FuY2hvcmVkJiYobnVsbCE9dS5fcmVuZGVyQXJlYSYmdS5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLAoidHJhbnNsYXRlKCIreCsiLCAiK0ErIikgc2NhbGUoIit5KyIsICIrdysiKSIpLG51bGwhPXUuX2NhbnZhcyYmdS5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit4KyJweCwgIitBKyJweCkgc2NhbGUoIit5KyIsICIrdysiKSIpKX07dS5hZGRDbGFzcygieHktcGxvdCIpO3UuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKX07dS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiB1Ll9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpfTt1Ll9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe2lmKHUuZGVmZXJyZWRSZW5kZXJpbmcoKSl7dmFyIHg9dS54KCkmJnUueCgpLnNjYWxlLEE9dS55KCkmJnUueSgpLnNjYWxlO3UuX2RlZmVycmVkUmVuZGVyZXIudXBkYXRlRG9tYWlucyh4LEEpfWVsc2UgdS5yZW5kZXIoKX07CnUuX2RlZmVycmVkUmVuZGVyZXI9bmV3IHAuRGVmZXJyZWRSZW5kZXJlcihmdW5jdGlvbigpe3JldHVybiB1LnJlbmRlcigpfSx1Ll9hcHBseURlZmVycmVkUmVuZGVyaW5nVHJhbnNmb3JtKTtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpO3JldHVybiBuLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKX07cS5wcm90b3R5cGUuZGVmZXJyZWRSZW5kZXJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmd9O3EucHJvdG90eXBlLng9ZnVuY3Rpb24odSx4LEEpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHEuX1hfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkocS5fWF9LRVksdSx4LEEpO3U9dGhpcy53aWR0aCgpO251bGwhPXgmJm51bGwhPXUmJngucmFuZ2UoWzAsdV0pOwp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS55PWZ1bmN0aW9uKHUseCxBKXtpZihudWxsPT11KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChxLl9ZX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHEuX1lfS0VZLHUseCxBKTt1PXRoaXMuaGVpZ2h0KCk7bnVsbCE9eCYmbnVsbCE9dSYmKHggaW5zdGFuY2VvZiB0LkNhdGVnb3J5P3gucmFuZ2UoWzAsdV0pOngucmFuZ2UoW3UsMF0pKTt0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odSl7cmV0dXJuIngiPT09dSYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOgoieSI9PT11JiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluP3RoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iik6bnVsbH07cS5wcm90b3R5cGUuX21ha2VGaWx0ZXJCeVByb3BlcnR5PWZ1bmN0aW9uKHUpe3U9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodSk7aWYobnVsbCE9dSl7dmFyIHg9dS5hY2Nlc3NvcixBPXUuc2NhbGU7aWYobnVsbCE9QSlyZXR1cm4gZnVuY3Rpb24oeSx3LEMpe3ZhciBHPUEucmFuZ2UoKTtyZXR1cm4gbC5NYXRoLmluUmFuZ2UoQS5zY2FsZSh4KHksdyxDKSksR1swXSxHWzFdKX19cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih1LHgpe24ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdSx4KTt1Lm9mZlVwZGF0ZSh4PT09cS5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX07CnEucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odSx4KXtuLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyx1LHgpO3Uub25VcGRhdGUoeD09PXEuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9O3EucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKTt0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/CiJ4Ijp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPyJ5Ijoibm9uZSI7c3dpdGNoKHUpe2Nhc2UgIngiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITA7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMTt0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpO2JyZWFrO2Nhc2UgInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMDt0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2UgIm5vbmUiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdSsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKTt9cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24odSx4LEEpe24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLAp1LHgsQSk7dT0odT10aGlzLngoKSkmJnUuc2NhbGU7bnVsbCE9dSYmdS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTt1PSh1PXRoaXMueSgpKSYmdS5zY2FsZTtudWxsIT11JiYodSBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnk/dS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk6dS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSkpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkuc2NhbGU7bnVsbCE9dSYmdS5hdXRvRG9tYWluKCl9O3EucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdT10aGlzLnkoKS5zY2FsZTtudWxsIT11JiZ1LmF1dG9Eb21haW4oKX07cS5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTtyZXR1cm4gdGhpc307CnEucHJvdG90eXBlLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWD1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKX07cS5wcm90b3R5cGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbigpfTtxLnByb3RvdHlwZS5fcHJvamVjdG9yc1JlYWR5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkseD10aGlzLnkoKTtyZXR1cm4gbnVsbCE9dSYmbnVsbCE9dS5hY2Nlc3NvciYmbnVsbCE9eCYmbnVsbCE9eC5hY2Nlc3Nvcn07cS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHc9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnJldHVybnt4OnkodSx4LEEpLHk6dyh1LHgsQSl9fTtxLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoeSx3LEMpe3ZhciBHPW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC54KCkpKHksdyxDKTt5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC55KCkpKHksdyxDKTtyZXR1cm4gbC5NYXRoLmlzVmFsaWROdW1iZXIoRykmJmwuTWF0aC5pc1ZhbGlkTnVtYmVyKHkpfXZhciB4PXRoaXMsQT1uLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHkpe0Euc2V0KHksQS5nZXQoeSkuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIHUodyxDLHkpfSkpfSk7cmV0dXJuIEF9O3JldHVybiBxfShtLlBsb3QpO2QuX1hfS0VZPSJ4IjtkLl9ZX0tFWT0ieSI7Zi5YWVBsb3Q9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0KITA7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycz1uZXcgay5TZXR9dC5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07dC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKGwpe3ZhciBwPXRoaXM7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBtPVtdO3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24obil7bj1uKHAsbCk7bT1tLmNvbmNhdChuKX0pO3JldHVybiBtfTt0LnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119O3QucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5hZGQobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKGwpOwpyZXR1cm4gdGhpc307dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07dC5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwO3RoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSl9O3QucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHkmJnRoaXMuYXV0b0RvbWFpbigpfTt0LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpO307dC5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07dC5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2dldERvbWFpbigpOwp0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMTt0aGlzLl9zZXREb21haW4obCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpO307dC5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihsKXt0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzfHwodGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMCx0aGlzLl9iYWNraW5nU2NhbGVEb21haW4obCksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSExKX07dC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfYmFja2luZ0RvbWFpbiIpO307dC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZ2V0UmFuZ2UoKTsKdGhpcy5fc2V0UmFuZ2UobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfc2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24obCl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuYWRkKGwpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihsKXt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5kZWxldGUobCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07CnJldHVybiB0fSgpO2YuU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocSx1LHgsQSl7Zm9yKHZhciB5PXt9LHc9MDt3PHUubGVuZ3RoO3crKyl7dmFyIEM9dVt3XTtxLmhhc093blByb3BlcnR5KEMpJiYoeVtDXT1xW0NdKHgsQSkpfXJldHVybiB5fWZ1bmN0aW9uIHQocSl7cmV0dXJuKG51bGwhPXFbInN0cm9rZS1vcGFjaXR5Il0/cGFyc2VGbG9hdChxWyJzdHJva2Utb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBsKHEpe3JldHVybihudWxsIT1xWyJmaWxsLW9wYWNpdHkiXT9wYXJzZUZsb2F0KHFbImZpbGwtb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBwKHEpe3JldHVybiBudWxsIT1xWyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHFbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIG0ocSx1KXtpZih1LnN0cm9rZSl7cS5saW5lV2lkdGg9CnAodSk7dmFyIHg9bi5jb2xvcih1LnN0cm9rZSk7eC5vcGFjaXR5Kj10KHUpO3Euc3Ryb2tlU3R5bGU9eC50b1N0cmluZygpO3Euc3Ryb2tlKCl9dS5maWxsJiYoeD1uLmNvbG9yKHUuZmlsbCkseC5vcGFjaXR5Kj1sKHUpLHEuZmlsbFN0eWxlPXgudG9TdHJpbmcoKSxxLmZpbGwoKSl9dmFyIG49aCgxKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcSh1LHgpe3RoaXMuX2NvbnRleHQ9dTt0aGlzLl9kcmF3U3RlcD14fXEucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfTtxLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHUseCl7eD14W3gubGVuZ3RoLTFdLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3I7dGhpcy5fY29udGV4dC5zYXZlKCk7dGhpcy5fZHJhd1N0ZXAodGhpcy5fY29udGV4dCx1LHgpO3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfTtxLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3EucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9CmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307cmV0dXJuIHF9KCk7Zi5DYW52YXNEcmF3ZXI9ZDtmLkNvbnRleHRTdHlsZUF0dHJzPSJmaWxsLW9wYWNpdHkgZmlsbCBvcGFjaXR5IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCBzdHJva2UiLnNwbGl0KCIgIik7Zi5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24ocSx1LHgsQSl7cmV0dXJuIGsocSxmLkNvbnRleHRTdHlsZUF0dHJzLmNvbmNhdCh1KSx4LEEpfTtmLnJlc29sdmVBdHRyaWJ1dGVzPWs7Zi5nZXRTdHJva2VXaWR0aD1wO2YucmVuZGVyQXJlYT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpO3EubGluZUpvaW49InJvdW5kIjttKHEsQSk7cS5yZXN0b3JlKCl9O2YucmVuZGVyTGluZT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpOwpxLmxpbmVKb2luPSJyb3VuZCI7bShxLEEpO3EucmVzdG9yZSgpfTtmLnJlbmRlclBhdGhXaXRoU3R5bGU9bX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDUwKSk7ayhoKDI3KSk7ayhoKDUxKSk7ayhoKDkzKSk7ayhoKDUzKSk7ayhoKDk0KSk7ayhoKDk1KSk7ayhoKDk2KSk7ayhoKDk3KSk7ayhoKDk4KSk7ayhoKDk5KSk7ayhoKDEwMCkpfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoOTIpKTtrKGgoOTEpKTtkPWgoNDkpO2Yuc2lnbj1kLnNpZ259LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzQpKTtrKGgoMTM1KSk7ayhoKDEzNikpO2soaCgxMzcpKX0sZnVuY3Rpb24oZCwKZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJihuW3hdPXFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDEpLGw9aCg1KTtkPWgoNCk7dmFyIHA9aCg4KSxtPWgoMCk7aD1oKDEwKTtmLkF4aXNPcmllbnRhdGlvbj1oLm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO2g9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1LHgpe3ZhciBBPW4uY2FsbCh0aGlzKXx8dGhpcztBLl9lbmRUaWNrTGVuZ3RoPTU7QS5faW5uZXJUaWNrTGVuZ3RoPTU7QS5fdGlja0xhYmVsUGFkZGluZz0xMDtBLl9tYXJnaW49MTU7QS5fc2hvd0VuZFRpY2tMYWJlbHM9ITE7QS5fYW5ub3RhdGlvbnNFbmFibGVkPSExO0EuX2Fubm90YXRpb25UaWVyQ291bnQ9CjE7aWYobnVsbD09dXx8bnVsbD09eCl0aHJvdyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpO0EuX3NjYWxlPXU7QS5vcmllbnRhdGlvbih4KTtBLl9zZXREZWZhdWx0QWxpZ25tZW50KCk7QS5hZGRDbGFzcygiYXhpcyIpO0EuaXNIb3Jpem9udGFsKCk/QS5hZGRDbGFzcygieC1heGlzIik6QS5hZGRDbGFzcygieS1heGlzIik7QS5mb3JtYXR0ZXIocC5pZGVudGl0eSgpKTtBLl9yZXNjYWxlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQS5fcmVzY2FsZSgpfTtBLl9zY2FsZS5vblVwZGF0ZShBLl9yZXNjYWxlQ2FsbGJhY2spO0EuX2Fubm90YXRlZFRpY2tzPVtdO0EuX2Fubm90YXRpb25Gb3JtYXR0ZXI9cC5pZGVudGl0eSgpO3JldHVybiBBfWsocSxuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZXNjYWxlQ2FsbGJhY2spfTsKcS5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih1KXtpZihudWxsIT11KXtmb3IodmFyIHg7bnVsbCE9dSYmdS5jbGFzc0xpc3QmJnZvaWQgMD09PXg7KXUuY2xhc3NMaXN0LmNvbnRhaW5zKHEuVElDS19MQUJFTF9DTEFTUyk/eD11OnU9dS5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT11P3ZvaWQgMDp0LnNlbGVjdCh1KS5kYXR1bSgpfX07cS5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX07cS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHU9MCx4PTA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoeD10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBBPQp0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORzt4Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpfX1lbHNlIHU9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihBPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HLHUrPUEqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkpO3JldHVybnttaW5XaWR0aDp1LG1pbkhlaWdodDp4fX07cS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKX07cS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSG9yaXpvbnRhbCgpfTtxLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHUseCxBKXtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx1LHgsQSk7dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLl9zY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHUseCl7dmFyIEE9dGhpcy5yZXF1ZXN0ZWRTcGFjZSh1LHgpO3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpP3t3aWR0aDp1LGhlaWdodDpBLm1pbkhlaWdodH06e2hlaWdodDp4LHdpZHRoOkEubWluV2lkdGh9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90aWNrTWFya0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCk7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyPQp0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIHU9dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsCiEwKTt1PW5ldyBsLlN2Z0NvbnRleHQodS5ub2RlKCkpO3RoaXMuX2Fubm90YXRpb25NZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHUpO3RoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IGwuV3JpdGVyKHRoaXMuX2Fubm90YXRpb25NZWFzdXJlcix1KX07cS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLl9nZXRUaWNrVmFsdWVzKCkseD10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5kYXRhKHUpLEE9eC5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHgpO0EuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpO3Quc2VsZWN0KEEubm9kZXMoKVswXSkuY2xhc3NlZChxLkVORF9USUNLX01BUktfQ0xBU1MsITApLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCghMCkpOwp0LnNlbGVjdChBLm5vZGVzKClbdS5sZW5ndGgtMV0pLmNsYXNzZWQocS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTt4LmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc307cS5wcm90b3R5cGUuYW5ub3RhdGlvbkZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyO3RoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI9dTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0aW9uc0VuYWJsZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZH07cS5wcm90b3R5cGUuYW5ub3RhdGlvblRpZXJDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50fTtxLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIHkoYWEpO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIHkoYWEpLUQuZ2V0KGFhKS5oZWlnaHR9fWZ1bmN0aW9uIHgoYWEpe3JldHVybiBPLmhhcyhhYSk/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIEEoYWEpe3JldHVybiBDLl9zY2FsZS5zY2FsZShhYSl9ZnVuY3Rpb24geShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIE4uZ2V0KGFhKSpJK0s7Y2FzZSAidG9wIjpjYXNlICJsZWZ0IjpyZXR1cm4gSC0KSy1OLmdldChhYSkqSX19ZnVuY3Rpb24gdyhhYSxsYSxaKXthYT1hYS5zZWxlY3RBbGwoIi4iK1opLmRhdGEoQik7bGE9YWEuZW50ZXIoKS5hcHBlbmQobGEpLmNsYXNzZWQoWiwhMCkubWVyZ2UoYWEpO2FhLmV4aXQoKS5yZW1vdmUoKTtyZXR1cm4gbGF9dmFyIEM9dGhpcyxHPXEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxEPW5ldyBtLk1hcCxCPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtCLmZvckVhY2goZnVuY3Rpb24oYWEpe3ZhciBsYT1DLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZShDLmFubm90YXRpb25Gb3JtYXR0ZXIoKShhYSkpO0Quc2V0KGFhLHt3aWR0aDpsYS53aWR0aCsyKkcsaGVpZ2h0OmxhLmhlaWdodCsyKkd9KX0pO3ZhciBJPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqRyxOPXRoaXMuX2Fubm90YXRpb25Ub1RpZXIoRCksTz1uZXcgbS5TZXQsSD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMud2lkdGgoKSxLPXRoaXMuX2NvcmVTaXplKCksTT1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChILUspL0kpKTtOLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpeygtMT09PWFhfHxhYT49TSkmJk8uYWRkKGxhKX0pO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnZhciBMPTA7YnJlYWs7Y2FzZSAidG9wIjpMPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAibGVmdCI6TD10aGlzLndpZHRoKCl9dmFyIFE9dGhpcy5pc0hvcml6b250YWwoKTt3KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixxLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOlE/QTpMLHgyOlE/QTp5LHkxOlE/TDpBLHkyOlE/eTpBLHZpc2liaWxpdHk6eH0pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwKImNpcmNsZSIscS5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUykuYXR0cnMoe2N4OlE/QTpMLGN5OlE/TDpBLHI6M30pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLHEuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpRP0E6dSx5OlE/dTpBLHdpZHRoOlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkud2lkdGh9OmZ1bmN0aW9uKGFhKXtyZXR1cm4gRC5nZXQoYWEpLmhlaWdodH0saGVpZ2h0OlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkuaGVpZ2h0fTpmdW5jdGlvbihhYSl7cmV0dXJuIEQuZ2V0KGFhKS53aWR0aH0sdmlzaWJpbGl0eTp4fSk7dmFyIFQ9dGhpcy5fYW5ub3RhdGlvbldyaXRlcixYPXRoaXMuYW5ub3RhdGlvbkZvcm1hdHRlcigpO0w9dyh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGFiZWwtY29udGFpbmVyIiksImciLHEuQU5OT1RBVElPTl9MQUJFTF9DTEFTUyk7Ckwuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKTtMLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24oYWEpe3ZhciBsYT1RP0EoYWEpOnUoYWEpO2FhPVE/dShhYSk6QShhYSk7cmV0dXJuInRyYW5zbGF0ZSgiK2xhKyIsIithYSsiKSJ9LHZpc2liaWxpdHk6eH0pLmVhY2goZnVuY3Rpb24oYWEpe1Qud3JpdGUoWChhYSksUT9ELmdldChhYSkud2lkdGg6RC5nZXQoYWEpLmhlaWdodCxRP0QuZ2V0KGFhKS5oZWlnaHQ6RC5nZXQoYWEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpRPzA6OTB9LHQuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07cS5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLHg9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gbS5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oQSl7cmV0dXJuIG51bGw9PUE/ITE6bS5NYXRoLmluUmFuZ2UodS5fc2NhbGUuc2NhbGUoQSksCnhbMF0seFsxXSl9KSl9O3EucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB1PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCkseD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4oeCx1KX07cS5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtxLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih1KXt2YXIgeD10aGlzLEE9W1tdXSx5PW5ldyBtLk1hcCx3PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEc9eC5fc2NhbGUuc2NhbGUoQyksCkQ9dS5nZXQoQykud2lkdGg7aWYoMD5HfHxHK0Q+dyl5LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihOKXtyZXR1cm4gQVtOXS5zb21lKGZ1bmN0aW9uKE8pe3ZhciBIPXguX3NjYWxlLnNjYWxlKE8pO089dS5nZXQoTykud2lkdGg7cmV0dXJuIEcrRD49SCYmRzw9SCtPfSl9LEk9MDtCKEkpOylJKyssQS5sZW5ndGg9PT1JJiZBLnB1c2goW10pO0FbSV0ucHVzaChDKTt5LnNldChDLEkpfX0pO3JldHVybiB5fTtxLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKcS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB1PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dS54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp1LngyPXRoaXMud2lkdGgoKTt1LnkxPXRoaXMuaGVpZ2h0KCk7dS55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnUueDE9dGhpcy53aWR0aCgpO3UueDI9dGhpcy53aWR0aCgpO3UueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dS55Mj10aGlzLmhlaWdodCgpfXJldHVybiB1fTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIEEuX3NjYWxlLnNjYWxlKHcpfXZhciBBPXRoaXM7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB5PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh5LngxPQp4LHkueDI9eCk6KHkueTE9eCx5LnkyPXgpO3U9dT90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6eS55Mj11O2JyZWFrO2Nhc2UgInRvcCI6eS55MT10aGlzLmhlaWdodCgpO3kueTI9dGhpcy5oZWlnaHQoKS11O2JyZWFrO2Nhc2UgImxlZnQiOnkueDE9dGhpcy53aWR0aCgpO3kueDI9dGhpcy53aWR0aCgpLXU7YnJlYWs7Y2FzZSAicmlnaHQiOnkueDI9dX1yZXR1cm4geX07cS5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpxLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtxLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07cS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtxLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3EucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD51KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dSl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj11O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3U9dS50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dSYmImJvdHRvbSIhPT0KdSYmImxlZnQiIT09dSYmInJpZ2h0IiE9PXUpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnEucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKTt4LmVtcHR5KCl8fHguZWFjaChmdW5jdGlvbigpe20uRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1KXx8dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX01BUktfQ0xBU1MpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgQT10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT1BfHwidmlzaWJsZSI9PT1BfSkuZGF0YSgpO3UuZWFjaChmdW5jdGlvbihBKXstMT09PXguaW5kZXhPZihBKSYmdC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHF9KGQuQ29tcG9uZW50KTtoLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2guVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2guVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7aC5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7aC5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7aC5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2guQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2guX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2YuQXhpcz1ofSxmdW5jdGlvbihkLGYpe2YuU0hPV19XQVJOSU5HUz0hMDtmLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfXQucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgbD1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxwPTA7cDxsLmxlbmd0aDtwKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbFtwXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07dC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgbD10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O3QucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O3QucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdLmFkZChwKTt0aGlzLl9jb25uZWN0KCl9O3QucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXS5kZWxldGUocCk7dGhpcy5fZGlzY29ubmVjdCgpfTt0LnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGwpe2Zvcih2YXIgcD1bXSxtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMV09YXJndW1lbnRzW21dO209dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXTtudWxsIT1tJiZtLmNhbGxDYWxsYmFja3MuYXBwbHkobSxwKX07cmV0dXJuIHR9KCk7Zi5EaXNwYXRjaGVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fAooZltsXT10W2xdKX1rKGgoODcpKTtrKGgoODgpKTtrKGgoNDApKTtrKGgoODkpKTtrKGgoOTApKTtkPWgoMjYpO2Yuem9vbU91dD1kLnpvb21PdXR9LGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaChuLHEsdSl7cmV0dXJuIHUtKHUtbikqcX1mdW5jdGlvbiBrKG4scSx1KXtyZXR1cm4obipxLXUpLyhxLTEpfWZ1bmN0aW9uIHQobixxLHUseCl7dmFyIEE9MTxxO3U9QT94OnU7aWYobnVsbD09dSlyZXR1cm4gcTtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oQT9NYXRoLm1pbjpNYXRoLm1heCkocSx1L01hdGguYWJzKG5bMV0tblswXSkpfWZ1bmN0aW9uIGwobixxLHUseCxBKXtpZigxPj1xKXJldHVybntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX07aWYobnVsbD09eCYmbnVsbD09QSlyZXR1cm57Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9O3ZhciB5PXAobiksdz1tKG4pLEM9dz9JbmZpbml0eTotSW5maW5pdHk7dz13Py1JbmZpbml0eTpJbmZpbml0eTt4PW51bGw9PQp4P0M6eDtBPW51bGw9PUE/dzpBO3c9bi5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9d1swXTt3PXdbMV07QT1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQSk7dz1uLnNjYWxlVHJhbnNmb3JtYXRpb24odyk7dmFyIEc9aCh3LHEsdSk7eD1uLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7bj1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1oKG4scSx1KTtyZXR1cm4gTWF0aC5hYnMoRy1DKT5NYXRoLmFicyhBLXgpPyhxPShBLXgpLyh3LW4pLDEhPT1xP3tjZW50ZXJQb2ludDprKHcscSxBKSx6b29tQW1vdW50OnF9OntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX0pOkc+QSE9eT97Y2VudGVyUG9pbnQ6ayh3LHEsQSksem9vbUFtb3VudDpxfTpDPHghPXk/e2NlbnRlclBvaW50OmsobixxLHgpLHpvb21BbW91bnQ6cX06e2NlbnRlclBvaW50OnUsem9vbUFtb3VudDpxfX1mdW5jdGlvbiBwKG4pe249bi5yYW5nZSgpO3JldHVybiBuWzFdPG5bMF19ZnVuY3Rpb24gbShuKXtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIG5bMV08blswXX1mLnpvb21PdXQ9aDtmLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihuLHEsdSx4LEEseSx3KXtxPXQobixxLHgsQSk7cmV0dXJuIGwobixxLHUseSx3KX07Zi5jb25zdHJhaW5ab29tRXh0ZW50cz10O2YuY29uc3RyYWluWm9vbVZhbHVlcz1sO2YuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihuLHEsdSx4KXt2YXIgQT1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseT1BWzBdLHc9QVsxXTtBPXAobik7MDxxIT09QT8odT14LG51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih3KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWF4Ok1hdGgubWluKSh5K3EsbikteSkpOm51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih5KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWluOk1hdGgubWF4KSh5K3EsbikteSk7cmV0dXJuIHF9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhJLApOLE8pe3ZhciBIPUkuc2NhbGU7aWYoSCBpbnN0YW5jZW9mIHkuQ2F0ZWdvcnkpTz1ILnJhbmdlQmFuZCgpO2Vsc2V7dmFyIEs9SS5hY2Nlc3NvcjtJPWwuc2V0KEMuQXJyYXkuZmxhdHRlbihOLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsUSl7cmV0dXJuIEsoTCxRLE0pfSkuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBudWxsIT1MfSkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiBMLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuK019KTtJLnNvcnQoZnVuY3Rpb24oTSxMKXtyZXR1cm4gTS1MfSk7ST1JLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5zY2FsZShNKX0pO0k9bC5wYWlycyhJKTtPPUMuTWF0aC5taW4oSSxmdW5jdGlvbihNKXtyZXR1cm4gTWF0aC5hYnMoTVsxXS1NWzBdKX0sTypCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7Tyo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gT30KdmFyIHQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEksTil7ZnVuY3Rpb24gTygpe3RoaXMuY29uc3RydWN0b3I9SX1mb3IodmFyIEggaW4gTilOLmhhc093blByb3BlcnR5KEgpJiYoSVtIXT1OW0hdKTtJLnByb3RvdHlwZT1udWxsPT09Tj9PYmplY3QuY3JlYXRlKE4pOihPLnByb3RvdHlwZT1OLnByb3RvdHlwZSxuZXcgTyl9LGw9aCgxKSxwPWgoNSksbT1oKDcpLG49aCg4KSxxPWgoMTQpLHU9aCg2KSx4PWgoMzQpLEE9aCgyMCkseT1oKDMpLHc9aCgxMSksQz1oKDApO2Q9aCgxMCk7dmFyIEc9aCgxOSksRD1oKDIpO2g9aCgxNik7Zi5CYXJPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2YuTGFiZWxzUG9zaXRpb249ZC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtmLkJhckFsaWdubWVudD1kLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSSl7ZnVuY3Rpb24gTihPKXt2b2lkIDA9PT0KTyYmKE89InZlcnRpY2FsIik7dmFyIEg9SS5jYWxsKHRoaXMpfHx0aGlzO0guX2xhYmVsRm9ybWF0dGVyPW4uaWRlbnRpdHkoKTtILl9sYWJlbHNFbmFibGVkPSExO0guX2xhYmVsc1Bvc2l0aW9uPWYuTGFiZWxzUG9zaXRpb24uZW5kO0guX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0guX2JhckFsaWdubWVudD0ibWlkZGxlIjtILl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9QS5tZW1vaXplKGspO0guX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7SC5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09TyYmImhvcml6b250YWwiIT09Tyl0aHJvdyBFcnJvcihPKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0guX2lzVmVydGljYWw9InZlcnRpY2FsIj09PU87SC5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBtLk51bGwpO0guYXR0cigiZmlsbCIsKG5ldyB5LkNvbG9yKS5yYW5nZSgpWzBdKTtILmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEguX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtILl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7SC5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0guYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEh9dChOLEkpO04ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oTyxILEspe0kucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLE8sSCxLKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLng9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09SD9JLnByb3RvdHlwZS54LmNhbGwodGhpcyxPKTpJLnByb3RvdHlwZS54LmNhbGwodGhpcyxPLEgpO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS55PWZ1bmN0aW9uKE8sSCl7aWYobnVsbD09Ck8pcmV0dXJuIEkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1IP0kucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8pOkkucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8sSCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O04ucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O04ucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChOLl9CQVJfRU5EX0tFWSl9O04ucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtOLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtOLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4LlJlY3RhbmdsZVNWR0RyYXdlcihOLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKE8pe3JldHVybiBuZXcgcS5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoTyl9KX07Ti5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtOLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBPPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIE8/TyBpbnN0YW5jZW9mIHkuVGltZT9uZXcgRGF0ZSgwKTowOjB9O04ucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsTyl9O04ucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKE8pe0kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxPKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxPKX07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLE8pO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0kucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKTyk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkO3RoaXMuX2xhYmVsc0VuYWJsZWQ9TztudWxsIT1IJiYodGhpcy5fbGFiZWxzUG9zaXRpb249SCk7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKE8pe2lmKG51bGw9PU8pcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oTyl7dmFyIEg9SS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsTyksSz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoTi5fTEFCRUxfQVJFQV9DTEFTUywKITApLE09bmV3IHAuU3ZnQ29udGV4dChLLm5vZGUoKSksTD1uZXcgcC5DYWNoZU1lYXN1cmVyKE0pO009bmV3IHAuV3JpdGVyKEwsTSk7dGhpcy5fbGFiZWxDb25maWcuc2V0KE8se2xhYmVsQXJlYTpLLG1lYXN1cmVyOkwsd3JpdGVyOk19KTtyZXR1cm4gSH07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxPKTt2YXIgSD10aGlzLl9sYWJlbENvbmZpZy5nZXQoTyk7bnVsbCE9SCYmKEgubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShPKSl9O04ucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhjYSxrYSxZLEVhKXtyZXR1cm4gSC5fcGl4ZWxQb2ludEJhcihhYShjYSxrYSxZKSxsYSxFYSl9CnZhciBNPUguX2lzVmVydGljYWw/Ty54Ok8ueSxMPUguX2lzVmVydGljYWw/Ty55Ok8ueCxRPUguYm91bmRzKCksVD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueC1RLnRvcExlZnQueH0sWD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueS1RLnRvcExlZnQueX0sYWE9RC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihILmxlbmd0aCgpKSxsYT1ILmxlbmd0aCgpLnNjYWxlLnNjYWxlKEguYmFzZWxpbmVWYWx1ZSgpKSxaPUluZmluaXR5LGJhPUluZmluaXR5LGVhO0guX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGNhKXt2YXIga2E9SC5fZW50aXR5Qm91bmRzKGNhKTtpZihDLkRPTS5pbnRlcnNlY3RzQkJveChULFgsa2EpKXt2YXIgWT0wLEVhPTA7aWYoIUMuRE9NLmludGVyc2VjdHNCQm94KE8ueCxPLnksa2EsLjUpKXtFYT1LKGNhLmRhdHVtLGNhLmluZGV4LGNhLmRhdGFzZXQsa2EpO1k9TWF0aC5hYnMoTS0oSC5faXNWZXJ0aWNhbD9FYS54OkVhLnkpKTsKdmFyIHZhPUguX2lzVmVydGljYWw/a2EueTprYS54O2thPXZhKyhILl9pc1ZlcnRpY2FsP2thLmhlaWdodDprYS53aWR0aCk7RWE9TD49dmEtLjUmJkw8PWthKy41PzA6TWF0aC5hYnMoTC0oSC5faXNWZXJ0aWNhbD9FYS55OkVhLngpKX1pZihZPFp8fFk9PT1aJiZFYTxiYSllYT1jYSxaPVksYmE9RWF9fSk7aWYodm9pZCAwIT09ZWEpcmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShlYSl9KX07Ti5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihPKXtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcoTy54LE8ueSl9O04ucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbihPLEgpe3ZhciBLPXRoaXMsTT1bXTt0aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtDLkRPTS5pbnRlcnNlY3RzQkJveChPLEgsSy5fZW50aXR5Qm91bmRzKEwpKSYmTS5wdXNoKEsuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShMKSl9KTsKcmV0dXJuIE19O04ucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgTz10aGlzLmxlbmd0aCgpLnNjYWxlO08gaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlJiYoTy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksTy5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX07Ti5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgTz10aGlzO3RoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChmdW5jdGlvbigpe3JldHVybiBJLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKE8pfSl9O04ucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOwpLPXt4MTp0aGlzLl9pc1ZlcnRpY2FsPzA6Syx5MTp0aGlzLl9pc1ZlcnRpY2FsP0s6MCx4Mjp0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTpLLHkyOnRoaXMuX2lzVmVydGljYWw/Szp0aGlzLmhlaWdodCgpfTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLEspO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE0pe3JldHVybiBILl9sYWJlbENvbmZpZy5nZXQoTSkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSk7dGhpcy5fbGFiZWxzRW5hYmxlZCYmQy5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBILl9kcmF3TGFiZWxzKCl9LE8pfTtOLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsTyk7aWYoIngiPT09TyYmdGhpcy5faXNWZXJ0aWNhbClPPXRoaXMueCgpOwplbHNle2lmKCJ5IiE9PU98fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIEs7Tz10aGlzLnkoKX1pZighKE8mJk8uc2NhbGUmJk8uc2NhbGUgaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gSzt2YXIgTT1PLnNjYWxlLEw9dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gSz1LLm1hcChmdW5jdGlvbihRKXtyZXR1cm4gbC5leHRlbnQoW00uaW52ZXJ0KEguX2dldFBvc2l0aW9uQXR0cihNLnNjYWxlKFFbMF0pLEwpKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzBdKSxMKStMKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzFdKSxMKSksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUVsxXSksTCkrTCldKX0pfTtOLnByb3RvdHlwZS5fZ2V0UG9zaXRpb25BdHRyPWZ1bmN0aW9uKE8sSCl7dGhpcy5faXNWZXJ0aWNhbHx8KE8tPUgsSCo9LTEpO3N3aXRjaCh0aGlzLl9iYXJBbGlnbm1lbnQpe2Nhc2UgInN0YXJ0IjpyZXR1cm4gTzsKY2FzZSAiZW5kIjpyZXR1cm4gTy1IO2RlZmF1bHQ6cmV0dXJuIE8tSC8yfX07Ti5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLmRhdGFzZXRzKCkuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gSC5nZXQoTCkuc29tZShmdW5jdGlvbihRLFQpe3JldHVybiBudWxsPT1RPyExOk8uX2RyYXdMYWJlbChRLFQsTCxLKX0pfSk7dGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUmJk0mJnRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBPLl9sYWJlbENvbmZpZy5nZXQoTCkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSl9O04ucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oTyxILEssTSl7dmFyIEw9dGhpcy5fbGFiZWxDb25maWcuZ2V0KEspLFE9TC5sYWJlbEFyZWEsVD1MLm1lYXN1cmVyO0w9TC53cml0ZXI7CnZhciBYPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsYWE9WChPLEgsSyk7WD10aGlzLmxlbmd0aCgpLnNjYWxlO3ZhciBsYT1udWxsIT1YP1guc2NhbGUoYWEpOmFhLFo9bnVsbCE9WD9YLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTp0aGlzLmJhc2VsaW5lVmFsdWUoKSxiYT17eDpNLngoTyxILEspLHk6TS55KE8sSCxLKX07WD17d2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX07YWE9dGhpcy5fbGFiZWxGb3JtYXR0ZXIoYWEsTyxILEspO1Q9VC5tZWFzdXJlKGFhKTt2YXIgZWE9dGhpcy5fc2hvdWxkU2hvd0xhYmVsT25CYXIoYmEsWCxUKTtiYT10aGlzLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXMoYmEsWCxULGVhLHRoaXMuX2lzVmVydGljYWw/bGE8PVo6bGE8Wik7bGE9YmEuY29udGFpbmVyRGltZW5zaW9ucztaPWJhLmxhYmVsQ29udGFpbmVyT3JpZ2luO2JhPWJhLmFsaWdubWVudDtPPU0uZmlsbChPLEgsSyk7UT10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihRLApaLGVhLE8pO0wud3JpdGUoYWEsbGEud2lkdGgsbGEuaGVpZ2h0LHt4QWxpZ246YmEueCx5QWxpZ246YmEueX0sUS5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP1gud2lkdGg8VC53aWR0aDpYLmhlaWdodDxULmhlaWdodH07Ti5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PWYuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTtPPXRoaXMuX2lzVmVydGljYWw/Ty55Ok8ueDt2YXIgTT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7SD10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpO0s9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoO3ZhciBMPU8rTTtMPkg/TT1ILU86MD5PJiYoTT1MKTtyZXR1cm4gSytOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjw9TX07Ti5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz0KZnVuY3Rpb24oTyxILEssTSxMKXtmdW5jdGlvbiBRKGthKXtzd2l0Y2goa2Epe2Nhc2UgInRvcExlZnQiOlo9VC5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCI7ZWErPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSO2NhKz1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjticmVhaztjYXNlICJjZW50ZXIiOmNhKz0oYWErbGEpLzI7YnJlYWs7Y2FzZSAiYm90dG9tUmlnaHQiOlo9VC5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGVhLT1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUixjYSs9YmEtTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVItbGF9fXZhciBUPXRoaXMsWD10aGlzLl9pc1ZlcnRpY2FsP08ueTpPLngsYWE9dGhpcy5faXNWZXJ0aWNhbD9ILmhlaWdodDpILndpZHRoLGxhPXRoaXMuX2lzVmVydGljYWw/Sy5oZWlnaHQ6Sy53aWR0aCxaPSJjZW50ZXIiLGJhPWFhLGVhPVgsY2E9WDtpZihNKXN3aXRjaCh0aGlzLl9sYWJlbHNQb3NpdGlvbil7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLnN0YXJ0Okw/ClEoImJvdHRvbVJpZ2h0Iik6USgidG9wTGVmdCIpO2JyZWFrO2Nhc2UgZi5MYWJlbHNQb3NpdGlvbi5taWRkbGU6USgiY2VudGVyIik7YnJlYWs7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLmVuZDpMP1EoInRvcExlZnQiKTpRKCJib3R0b21SaWdodCIpfWVsc2UgTD8oWj10aGlzLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixiYT1hYStOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitsYSxlYS09Ti5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2EtPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2xhKTooWj10aGlzLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsYmE9YWErTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2ErPWFhK04uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtyZXR1cm57Y29udGFpbmVyRGltZW5zaW9uczp7d2lkdGg6dGhpcy5faXNWZXJ0aWNhbD9ILndpZHRoOmJhLGhlaWdodDp0aGlzLl9pc1ZlcnRpY2FsP2JhOkguaGVpZ2h0fSxsYWJlbENvbnRhaW5lck9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsPwpPLng6ZWEseTp0aGlzLl9pc1ZlcnRpY2FsP2VhOk8ueX0sbGFiZWxPcmlnaW46e3g6dGhpcy5faXNWZXJ0aWNhbD9PLngrSC53aWR0aC8yLUsud2lkdGgvMjpjYSx5OnRoaXMuX2lzVmVydGljYWw/Y2E6Ty55K0guaGVpZ2h0LzItSy5oZWlnaHQvMn0sYWxpZ25tZW50Ont4OnRoaXMuX2lzVmVydGljYWw/ImNlbnRlciI6Wix5OnRoaXMuX2lzVmVydGljYWw/WjoiY2VudGVyIn19fTtOLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24oTyxILEssTSl7Tz1PLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0gueCsiLCAiK0gueSsiKSIpO0s/KE8uY2xhc3NlZCgib24tYmFyLWxhYmVsIiwhMCksSz0xLjYqQy5Db2xvci5jb250cmFzdCgid2hpdGUiLE0pPEMuQ29sb3IuY29udHJhc3QoImJsYWNrIixNKSxPLmNsYXNzZWQoSz8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCkpOk8uY2xhc3NlZCgib2ZmLWJhci1sYWJlbCIsITApO3JldHVybiBPfTsKTi5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIE89W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgSD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLE09dGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiO0hbdGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiXT1mdW5jdGlvbigpe3JldHVybiBLfTtIW01dPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O08ucHVzaCh7YXR0clRvUHJvamVjdG9yOkgsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoRy5BbmltYXRvci5SRVNFVCl9KX1PLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIE99O04ucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIE8oYmEsCmVhLGNhKXtyZXR1cm4gTWF0aC5hYnMoTS1YKGJhLGVhLGNhKSl9dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLE09dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksTD10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsUT10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsVD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksWD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMubGVuZ3RoKCkpLGFhPUtbTi5fQkFSX1RISUNLTkVTU19LRVldLGxhPUsuZ2FwLFo9bnVsbD09bGE/YWE6ZnVuY3Rpb24oYmEsZWEsY2Epe3JldHVybiBhYShiYSxlYSxjYSktbGEoYmEsZWEsY2EpfTtLLndpZHRoPXRoaXMuX2lzVmVydGljYWw/WjpPO0suaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/TzpaO0tbTF09ZnVuY3Rpb24oYmEsZWEsY2Epe2JhPVgoYmEsZWEsY2EpO3JldHVybiBiYT5NP006YmF9OwpLW1FdPWZ1bmN0aW9uKGJhLGVhLGNhKXtyZXR1cm4gSC5fZ2V0UG9zaXRpb25BdHRyKFQoYmEsZWEsY2EpLGFhKGJhLGVhLGNhKSl9O3JldHVybiBLfTtOLnByb3RvdHlwZS5fdXBkYXRlVGhpY2tuZXNzQXR0cj1mdW5jdGlvbigpe3ZhciBPPXRoaXMsSD10aGlzLnBvc2l0aW9uKCksSz10aGlzLmJhckVuZCgpO251bGwhPUgmJm51bGwhPUs/KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITEsdGhpcy5hdHRyKE4uX0JBUl9USElDS05FU1NfS0VZLGZ1bmN0aW9uKE0sTCxRKXt2YXIgVD1ILmFjY2Vzc29yKE0sTCxRKTtNPUsuYWNjZXNzb3IoTSxMLFEpO1Q9SC5zY2FsZT9ILnNjYWxlLnNjYWxlKFQpOlQ7TT1LLnNjYWxlP0suc2NhbGUuc2NhbGUoTSk6TTtyZXR1cm4gTWF0aC5hYnMoTS1UKX0pKToodGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMCx0aGlzLmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksZnVuY3Rpb24oKXtyZXR1cm4gTy5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKX07Ck4ucHJvdG90eXBlLl9iYXJQaXhlbFRoaWNrbmVzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzP3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcyh0aGlzLnBvc2l0aW9uKCksdGhpcy5kYXRhc2V0cygpLHRoaXMuX2lzVmVydGljYWw/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCkpOjA6MH07Ti5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oTyl7dm9pZCAwPT09TyYmKE89dGhpcy5kYXRhc2V0cygpKTtyZXR1cm4gdGhpcy5fcHJvamVjdG9yc1JlYWR5KCk/SS5wcm90b3R5cGUuZW50aXRpZXMuY2FsbCh0aGlzLE8pOltdfTtOLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKE8pe3JldHVybiB0aGlzLl9waXhlbEJvdW5kcyhPLmRhdHVtLE8uaW5kZXgsTy5kYXRhc2V0KX07Ti5wcm90b3R5cGUuX3BpeGVsQm91bmRzPWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKcmV0dXJue3g6TS54KE8sSCxLKSx5Ok0ueShPLEgsSyksd2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX19O04ucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9waXhlbEJvdW5kcyhPLEgsSyk7Tz0odGhpcy5faXNWZXJ0aWNhbD9ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTpELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSkoTyxILEspO0g9KHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCkuc2NhbGU6dGhpcy54KCkuc2NhbGUpLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTtyZXR1cm4gdGhpcy5fcGl4ZWxQb2ludEJhcihPLEgsTSl9O04ucHJvdG90eXBlLl9waXhlbFBvaW50QmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9pc1ZlcnRpY2FsKXt2YXIgTT1LLngrSy53aWR0aC8yO089Tzw9SD9LLnk6Sy55K0suaGVpZ2h0fWVsc2UgTT1PPj1IP0sueCtLLndpZHRoOksueCxPPUsueStLLmhlaWdodC8KMjtyZXR1cm57eDpNLHk6T319O04ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihPLEgpe0kucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsTyxIKX07Ti5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9bmV3IEMuTWFwLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLndpZHRoKCksTD10aGlzLmhlaWdodCgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKFEpe3ZhciBUPVEuZGF0YSgpLm1hcChmdW5jdGlvbihYLGFhKXtyZXR1cm4gTy5faXNEYXR1bU9uU2NyZWVuKEssTSxMLFgsYWEsUSk/WDpudWxsfSk7SC5zZXQoUSxUKX0pO3JldHVybiBIfTtOLnByb3RvdHlwZS5faXNEYXR1bU9uU2NyZWVuPWZ1bmN0aW9uKE8sSCxLLE0sTCxRKXt2YXIgVD1PLngoTSxMLFEpLFg9Ty55KE0sTCxRKSxhYT1PLndpZHRoKE0sTCxRKTtPPU8uaGVpZ2h0KE0sTCxRKTtyZXR1cm4gQy5NYXRoLmlzVmFsaWROdW1iZXIoVCkmJgpDLk1hdGguaXNWYWxpZE51bWJlcihYKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoYWEpJiZDLk1hdGguaXNWYWxpZE51bWJlcihPKT9DLk1hdGguYm91bmRzSW50ZXJzZWN0cyhULFgsYWEsTyxILEspOiExfTtyZXR1cm4gTn0oaC5YWVBsb3QpO0IuX0JBUl9USElDS05FU1NfUkFUSU89Ljk1O0IuX1NJTkdMRV9CQVJfRElNRU5TSU9OX1JBVElPPS40O0IuX0JBUl9BUkVBX0NMQVNTPSJiYXItYXJlYSI7Qi5fQkFSX0VORF9LRVk9ImJhckVuZCI7Qi5fQkFSX1RISUNLTkVTU19LRVk9IndpZHRoIjtCLl9MQUJFTF9BUkVBX0NMQVNTPSJiYXItbGFiZWwtdGV4dC1hcmVhIjtCLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUj0xMDtmLkJhcj1CfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHgsQSl7ZnVuY3Rpb24geSgpe3RoaXMuY29uc3RydWN0b3I9eH1mb3IodmFyIHcgaW4gQSlBLmhhc093blByb3BlcnR5KHcpJiYoeFt3XT1BW3ddKTt4LnByb3RvdHlwZT0KbnVsbD09PUE/T2JqZWN0LmNyZWF0ZShBKTooeS5wcm90b3R5cGU9QS5wcm90b3R5cGUsbmV3IHkpfSx0PWgoMSksbD1oKDUpLHA9aCg4KSxtPWgoMyksbj1oKDApO2Q9aCgxMCk7dmFyIHE9aCgyMik7Zi5UaW1lSW50ZXJ2YWw9ZC5tYWtlRW51bSgic2Vjb25kIG1pbnV0ZSBob3VyIGRheSB3ZWVrIG1vbnRoIHllYXIiLnNwbGl0KCIgIikpO2YuVGltZUF4aXNPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidG9wIiwiYm90dG9tIl0pO2YuVGllckxhYmVsUG9zaXRpb249ZC5tYWtlRW51bShbImJldHdlZW4iLCJjZW50ZXIiXSk7aD1mdW5jdGlvbih4KXtmdW5jdGlvbiBBKHksdyl7eT14LmNhbGwodGhpcyx5LHcpfHx0aGlzO3kuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1udWxsO3kuX3RpZXJMYWJlbFBvc2l0aW9ucz1bXTt5LmFkZENsYXNzKCJ0aW1lLWF4aXMiKTt5LnRpY2tMYWJlbFBhZGRpbmcoNSk7eS5heGlzQ29uZmlndXJhdGlvbnMoQS5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlMpOwp5LmFubm90YXRpb25Gb3JtYXR0ZXIocC50aW1lKCIlYSAlYiAlZCwgJVkiKSk7cmV0dXJuIHl9ayhBLHgpO0EucHJvdG90eXBlLnRpZXJMYWJlbFBvc2l0aW9ucz1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM7aWYoIXkuZXZlcnkoZnVuY3Rpb24odyl7cmV0dXJuImJldHdlZW4iPT09dy50b0xvd2VyQ2FzZSgpfHwiY2VudGVyIj09PXcudG9Mb3dlckNhc2UoKX0pKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBwb3NpdGlvbiBmb3IgdGllciBsYWJlbHMiKTt0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM9eTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtBLnByb3RvdHlwZS5tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249ZnVuY3Rpb24oeSl7aWYobnVsbD09eSlyZXR1cm4gdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uO3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj15O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLmN1cnJlbnRBeGlzQ29uZmlndXJhdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdfTtBLnByb3RvdHlwZS5heGlzQ29uZmlndXJhdGlvbnM9ZnVuY3Rpb24oeSl7aWYobnVsbCE9eSl7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zPXk7dGhpcy5fbnVtVGllcnM9bi5NYXRoLm1heCh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBHLmxlbmd0aH0pLDApO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX3NldHVwRG9tRWxlbWVudHMoKTt5PXRoaXMudGllckxhYmVsUG9zaXRpb25zKCk7Zm9yKHZhciB3PVtdLEM9MDtDPHRoaXMuX251bVRpZXJzO0MrKyl3LnB1c2goeVtDXXx8ImJldHdlZW4iKTt0aGlzLnRpZXJMYWJlbFBvc2l0aW9ucyh3KTt0aGlzLnJlZHJhdygpfX07QS5wcm90b3R5cGUuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4PQpmdW5jdGlvbigpe3ZhciB5PXRoaXMsdz10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoO3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7Rzx3JiZDLmV2ZXJ5KGZ1bmN0aW9uKEQpe3JldHVybiB5Ll9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb24oRCl9KSYmKHc9Ryl9KTt3PT09dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aCYmKG4uV2luZG93Lndhcm4oInpvb21lZCBvdXQgdG9vIGZhcjogY291bGQgbm90IGZpbmQgc3VpdGFibGUgaW50ZXJ2YWwgdG8gZGlzcGxheSBsYWJlbHMiKSwtLXcpO3JldHVybiB3fTtBLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih5KXtpZih5JiYoInJpZ2h0Ij09PXkudG9Mb3dlckNhc2UoKXx8ImxlZnQiPT09eS50b0xvd2VyQ2FzZSgpKSl0aHJvdyBFcnJvcih5KyIgaXMgbm90IGEgc3VwcG9ydGVkIG9yaWVudGF0aW9uIGZvciBUaW1lQXhpcyAtIG9ubHkgaG9yaXpvbnRhbCBvcmllbnRhdGlvbnMgYXJlIHN1cHBvcnRlZCIpOwpyZXR1cm4geC5wcm90b3R5cGUub3JpZW50YXRpb24uY2FsbCh0aGlzLHkpfTtBLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodD1mdW5jdGlvbigpe3ZhciB5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7dGhpcy5fdGllckhlaWdodHM9W107Zm9yKHZhciB3PTA7dzx0aGlzLl9udW1UaWVyczt3KyspdGhpcy5fdGllckhlaWdodHMucHVzaCh5K3RoaXMudGlja0xhYmVsUGFkZGluZygpKygiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/MDp0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSkpO3JldHVybiB0LnN1bSh0aGlzLl90aWVySGVpZ2h0cyl9O0EucHJvdG90eXBlLl9nZXRJbnRlcnZhbExlbmd0aD1mdW5jdGlvbih5KXt2YXIgdz10aGlzLl9zY2FsZS5kb21haW4oKVswXTt5PW0uVGltZS50aW1lSW50ZXJ2YWxUb0QzVGltZSh5LmludGVydmFsKS5vZmZzZXQodyx5LnN0ZXApO3JldHVybiB5PnRoaXMuX3NjYWxlLmRvbWFpbigpWzFdP3RoaXMud2lkdGgoKToKTWF0aC5hYnModGhpcy5fc2NhbGUuc2NhbGUoeSktdGhpcy5fc2NhbGUuc2NhbGUodykpfTtBLnByb3RvdHlwZS5fbWF4V2lkdGhGb3JJbnRlcnZhbD1mdW5jdGlvbih5KXtyZXR1cm4gdGhpcy5fbWVhc3VyZXIubWVhc3VyZSh5LmZvcm1hdHRlcihBLl9MT05HX0RBVEUpKS53aWR0aH07QS5wcm90b3R5cGUuX2NoZWNrVGltZUF4aXNUaWVyQ29uZmlndXJhdGlvbj1mdW5jdGlvbih5KXtpZihudWxsIT10aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb24pe3ZhciB3PUEuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbl0sQz1BLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt5LmludGVydmFsXTtpZihudWxsIT13JiZudWxsIT1DJiZDPHcpcmV0dXJuITF9dz10aGlzLl9tYXhXaWR0aEZvckludGVydmFsKHkpKzIqdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7cmV0dXJuIE1hdGgubWluKHRoaXMuX2dldEludGVydmFsTGVuZ3RoKHkpLAp0aGlzLndpZHRoKCkpPj13fTtBLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih5LHcpe3ZhciBDPXgucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx5LHcpO3k9dGhpcy5fdGllckhlaWdodHMucmVkdWNlKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEcrRD5DLmhlaWdodD9HOkcrRH0pO3c9dGhpcy5tYXJnaW4oKSsodGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSp0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpOjApO0MuaGVpZ2h0PU1hdGgubWluKEMuaGVpZ2h0LHkrdyk7cmV0dXJuIEN9O0EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3gucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3NldHVwRG9tRWxlbWVudHMoKX07QS5wcm90b3R5cGUuX3NldHVwRG9tRWxlbWVudHM9ZnVuY3Rpb24oKXt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK0EuVElNRV9BWElTX1RJRVJfQ0xBU1MpLnJlbW92ZSgpOwp0aGlzLl90aWVyTGFiZWxDb250YWluZXJzPVtdO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycz1bXTt0aGlzLl90aWVyQmFzZWxpbmVzPVtdO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5yZW1vdmUoKTtmb3IodmFyIHk9MDt5PHRoaXMuX251bVRpZXJzOysreSl7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChBLlRJTUVfQVhJU19USUVSX0NMQVNTLCEwKTt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLnB1c2gody5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycy5wdXNoKHcuYXBwZW5kKCJnIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJCYXNlbGluZXMucHVzaCh3LmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCkpfXk9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWVyTGFiZWxDb250YWluZXJzWzBdLm5vZGUoKSk7CnRoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIoeSl9O0EucHJvdG90eXBlLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXM9ZnVuY3Rpb24oeSl7cmV0dXJuIHRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh5LmludGVydmFsLHkuc3RlcCl9O0EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcztyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdLnJlZHVjZShmdW5jdGlvbih3LEMpe3JldHVybiB3LmNvbmNhdCh5Ll9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXMoQykpfSxbXSl9O0EucHJvdG90eXBlLl9jbGVhblRpZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB5PTA7eTx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLmxlbmd0aDt5KyspdGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeV0uc2VsZWN0QWxsKCIuIisKcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllckJhc2VsaW5lc1t5XS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfTtBLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oeSl7eT10aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoeS5pbnRlcnZhbCx5LnN0ZXApO3ZhciB3PXRoaXMuX3NjYWxlLmRvbWFpbigpLEM9eS5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcudmFsdWVPZigpfSk7LTE9PT1DLmluZGV4T2Yod1swXS52YWx1ZU9mKCkpJiZ5LnVuc2hpZnQod1swXSk7LTE9PT1DLmluZGV4T2Yod1sxXS52YWx1ZU9mKCkpJiZ5LnB1c2god1sxXSk7cmV0dXJuIHl9O0EucHJvdG90eXBlLl9yZW5kZXJUaWVyTGFiZWxzPWZ1bmN0aW9uKHksdyxDKXt2YXIgRz10aGlzLEQ9dGhpcy5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24odyksQj1bXTsiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ10mJgoxPT09dy5zdGVwP0QubWFwKGZ1bmN0aW9uKEssTSl7TSsxPj1ELmxlbmd0aHx8Qi5wdXNoKG5ldyBEYXRlKChEW00rMV0udmFsdWVPZigpLURbTV0udmFsdWVPZigpKS8yK0RbTV0udmFsdWVPZigpKSl9KTpCPUQ7eT15LnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQixmdW5jdGlvbihLKXtyZXR1cm4gU3RyaW5nKEsudmFsdWVPZigpKX0pO3ZhciBJPXkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCEwKTtJLmFwcGVuZCgidGV4dCIpO3ZhciBOPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPzA6dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dmFyIE89ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/dC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKzEpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKToiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXT8KdGhpcy5oZWlnaHQoKS10LnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKS10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKTp0aGlzLmhlaWdodCgpLXQuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQykpLXRoaXMudGlja0xhYmVsUGFkZGluZygpO0k9eS5tZXJnZShJKTt2YXIgSD1JLnNlbGVjdEFsbCgidGV4dCIpOzA8SC5zaXplKCkmJkguYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTisiLCIrTysiKSIpO3kuZXhpdCgpLnJlbW92ZSgpO0kuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihLKXtyZXR1cm4idHJhbnNsYXRlKCIrRy5fc2NhbGUuc2NhbGUoSykrIiwwKSJ9KTtDPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPyJtaWRkbGUiOiJzdGFydCI7SS5zZWxlY3RBbGwoInRleHQiKS50ZXh0KHcuZm9ybWF0dGVyKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpfTtBLnByb3RvdHlwZS5fcmVuZGVyVGlja01hcmtzPQpmdW5jdGlvbih5LHcpe3k9dGhpcy5fdGllck1hcmtDb250YWluZXJzW3ddLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh5KTt2YXIgQz15LmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh5KSxHPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpLEQ9dGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCx3KS5yZWR1Y2UoZnVuY3Rpb24oQixJKXtyZXR1cm4gQitJfSwwKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oRy55MT1ELEcueTI9RCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5pbm5lclRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t3XSkpOihHLnkxPXRoaXMuaGVpZ2h0KCktRCxHLnkyPXRoaXMuaGVpZ2h0KCktKEQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6CnRoaXMuX3RpZXJIZWlnaHRzW3ddKSkpO0MuYXR0cnMoRyk7ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/KEcueTE9RCxHLnkyPUQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3ddKSk6KEcueTE9dGhpcy5oZWlnaHQoKS1ELEcueTI9dGhpcy5oZWlnaHQoKS0oRCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbd10pKSk7dC5zZWxlY3QoQy5ub2RlcygpWzBdKS5hdHRycyhHKTt0LnNlbGVjdChDLm5vZGVzKClbQy5zaXplKCktMV0pLmF0dHJzKEcpO3Quc2VsZWN0KEMubm9kZXMoKVswXSkuY2xhc3NlZChxLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCk7dC5zZWxlY3QoQy5ub2RlcygpW0Muc2l6ZSgpLTFdKS5jbGFzc2VkKHEuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKTt5LmV4aXQoKS5yZW1vdmUoKX07CkEucHJvdG90eXBlLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3M9ZnVuY3Rpb24oeSl7eT10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEoeSk7dmFyIHc9eS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoeSksQz10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTtDLnkyPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMudGlja0xhYmVsUGFkZGluZygpOnRoaXMuaGVpZ2h0KCktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dy5hdHRycyhDKTt5LmV4aXQoKS5yZW1vdmUoKX07QS5wcm90b3R5cGUuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gMT50aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4P1tdOnRoaXMuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleC0KMV1bMF0pfTtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB5PXRoaXM7dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD10aGlzLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleCgpO3ZhciB3PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XTt0aGlzLl9jbGVhblRpZXJzKCk7dy5mb3JFYWNoKGZ1bmN0aW9uKEksTil7cmV0dXJuIHkuX3JlbmRlclRpZXJMYWJlbHMoeS5fdGllckxhYmVsQ29udGFpbmVyc1tOXSxJLE4pfSk7Zm9yKHZhciBDPXcubWFwKGZ1bmN0aW9uKEkpe3JldHVybiB5Ll9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbihJKX0pLEc9MCxEPTA7RDxNYXRoLm1heCh3Lmxlbmd0aCwxKTsrK0Qpe3ZhciBCPXRoaXMuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaCgpO0IueTErPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP0c6LUc7Qi55Mj1CLnkxOwp0aGlzLl90aWVyQmFzZWxpbmVzW0RdLmF0dHJzKEIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpO0crPXRoaXMuX3RpZXJIZWlnaHRzW0RdfUc9W107RD10aGlzLl9zY2FsZS5kb21haW4oKTtEPXRoaXMuX3NjYWxlLnNjYWxlKERbMV0pLXRoaXMuX3NjYWxlLnNjYWxlKERbMF0pOzEuNSp0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh3WzBdKT49RCYmKEc9dGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpKTt0aGlzLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3MoRyk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGllcnMoKTtmb3IoRD0wO0Q8dy5sZW5ndGg7KytEKXRoaXMuX3JlbmRlclRpY2tNYXJrcyhDW0RdLEQpLHRoaXMuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscyhEKTt0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuX2RyYXdBbm5vdGF0aW9ucygpOnRoaXMuX3JlbW92ZUFubm90YXRpb25zKCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWVycz0KZnVuY3Rpb24oKXt2YXIgeT10aGlzLHc9dGhpcy5oZWlnaHQoKSxDPTA7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIitBLlRJTUVfQVhJU19USUVSX0NMQVNTKS5hdHRyKCJ2aXNpYmlsaXR5IixmdW5jdGlvbihHLEQpe0MrPXkuX3RpZXJIZWlnaHRzW0RdO3JldHVybiBDPD13PyJpbmhlcml0IjoiaGlkZGVuIn0pfTtBLnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoSSl7cmV0dXJuIE1hdGguZmxvb3IoRy5sZWZ0KTw9TWF0aC5jZWlsKEkubGVmdCkmJk1hdGguZmxvb3IoRy50b3ApPD1NYXRoLmNlaWwoSS50b3ApJiZNYXRoLmZsb29yKEkucmlnaHQpPD1NYXRoLmNlaWwoRy5sZWZ0K0Mud2lkdGgoKSkmJk1hdGguZmxvb3IoSS5ib3R0b20pPD1NYXRoLmNlaWwoRy50b3ArQy5oZWlnaHQoKSl9dmFyIEM9dGhpcyxHPXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iKwpxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5ub2RlcygpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gSS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLEI7dGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5lYWNoKGZ1bmN0aW9uKEksTil7ST10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBPPXQuc2VsZWN0KHRoaXMpLEg9RFtOXSxLPURbTisxXTtOPW51bGwhPUImJm4uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLEIpO0g9bnVsbCE9SCYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksCkgpO0s9bnVsbCE9SyYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksSyk7IXcoSSl8fE58fEh8fEs/Ty5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpOihCPUksTy5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKSl9KX07QS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7eC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIEF9KHEuQXhpcyk7aC5USU1FX0FYSVNfVElFUl9DTEFTUz0idGltZS1heGlzLXRpZXIiO2guX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYPSh1PXt9LHVbZi5UaW1lSW50ZXJ2YWwuc2Vjb25kXT0wLHVbZi5UaW1lSW50ZXJ2YWwubWludXRlXT0xLHVbZi5UaW1lSW50ZXJ2YWwuaG91cl09Mix1W2YuVGltZUludGVydmFsLmRheV09Myx1W2YuVGltZUludGVydmFsLndlZWtdPTQsdVtmLlRpbWVJbnRlcnZhbC5tb250aF09NSx1W2YuVGltZUludGVydmFsLnllYXJdPQo2LHUpO2guX0RFRkFVTFRfVElNRV9BWElTX0NPTkZJR1VSQVRJT05TPVtbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxNSwKZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjMwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDo1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjE1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDozMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSwKc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjYsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDoxMixmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlYSAlZSIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVlIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJWIiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Nixmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJXkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjI1LGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEwMCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjAwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MDAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjFFMyxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV1dO2guX0xPTkdfREFURT1uZXcgRGF0ZSg5OTk5LDgsMjksMTIsNTksOTk5OSk7Zi5UaW1lPWg7dmFyIHV9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPQpwLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxMik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKCl7dmFyIG09bC5jYWxsKHRoaXMpfHx0aGlzO20uX2RldGFjaENhbGxiYWNrPWZ1bmN0aW9uKG4pe3JldHVybiBtLnJlbW92ZShuKX07cmV0dXJuIG19ayhwLGwpO3AucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihtKXt2YXIgbj10aGlzO209dC5jb2VyY2VFeHRlcm5hbEQzKG0pO2wucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsbSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gcS5hbmNob3Iobi5lbGVtZW50KCkpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIG0ucmVuZGVyKCl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImhhcygpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTt9O3AucHJvdG90eXBlLl9hZG9wdEFuZEFuY2hvcj0KZnVuY3Rpb24obSl7bS5wYXJlbnQodGhpcyk7bS5vbkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayk7dGhpcy5faXNBbmNob3JlZCYmbS5hbmNob3IodGhpcy5lbGVtZW50KCkpfTtwLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24obSl7dGhpcy5oYXMobSkmJihtLm9mZkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayksdGhpcy5fcmVtb3ZlKG0pLG0uZGV0YWNoKCksdGhpcy5yZWRyYXcoKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24oKXt9O3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIl9mb3JFYWNoKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpO307cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKG0pe3JldHVybiBtLmRlc3Ryb3koKX0pfTtwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9CmZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbS5pbnZhbGlkYXRlQ2FjaGUoKX0pfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuQ29tcG9uZW50Q29udGFpbmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEEpe24uYWRkKEEpO20uYWRkKEEpO3QoKX1mdW5jdGlvbiB0KCl7cXx8KHE9ITAseC5yZW5kZXIoKSl9dmFyIGw9aCgwKTtkPWgoMTApO3ZhciBwPWgoMzkpLG09bmV3IGwuU2V0LG49bmV3IGwuU2V0LHE9ITEsdT0hMTtmLlBvbGljeT1kLm1ha2VFbnVtKFsiaW1tZWRpYXRlIiwiYW5pbWF0aW9uRnJhbWUiLCJ0aW1lb3V0Il0pO3ZhciB4PW5ldyBwLkFuaW1hdGlvbkZyYW1lO2YucmVuZGVyUG9saWN5PWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHg7c3dpdGNoKEEpe2Nhc2UgZi5Qb2xpY3kuaW1tZWRpYXRlOng9bmV3IHAuSW1tZWRpYXRlO2JyZWFrO2Nhc2UgZi5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6eD1uZXcgcC5BbmltYXRpb25GcmFtZTsKYnJlYWs7Y2FzZSBmLlBvbGljeS50aW1lb3V0Ong9bmV3IHAuVGltZW91dDticmVhaztkZWZhdWx0OmwuV2luZG93Lndhcm4oIlVucmVjb2duaXplZCByZW5kZXJQb2xpY3k6ICIrQSl9fTtmLnJlZ2lzdGVyVG9SZW5kZXI9ZnVuY3Rpb24oQSl7dSYmbC5XaW5kb3cud2FybigiUmVnaXN0ZXJlZCB0byByZW5kZXIgd2hpbGUgb3RoZXIgY29tcG9uZW50cyBhcmUgZmx1c2hpbmc6IHJlcXVlc3QgbWF5IGJlIGlnbm9yZWQiKTttLmFkZChBKTt0KCl9O2YucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXI9aztmLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0PWZ1bmN0aW9uKEEpe2soQSl9O2YuZmx1c2g9ZnVuY3Rpb24oKXtpZihxKXtuLmZvckVhY2goZnVuY3Rpb24oeSl7cmV0dXJuIHkuY29tcHV0ZUxheW91dCgpfSk7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3JldHVybiB5LnJlbmRlcigpfSk7dT0hMDt2YXIgQT1uZXcgbC5TZXQ7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3RyeXt5LnJlbmRlckltbWVkaWF0ZWx5KCl9Y2F0Y2godyl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB3Owp9LDApLEEuYWRkKHkpfX0pO249bmV3IGwuU2V0O209QTt1PXE9ITF9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jaXJjbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbENpcmNsZSkuc2l6ZShNYXRoLlBJKk1hdGgucG93KGwvMiwyKSl9fTtmLnNxdWFyZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3F1YXJlKS5zaXplKE1hdGgucG93KGwsMikpfX07Zi5jcm9zcz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sQ3Jvc3MpLnNpemUoNS85Kk1hdGgucG93KGwsMikpfX07Zi5kaWFtb25kPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xEaWFtb25kKS5zaXplKE1hdGgudGFuKE1hdGguUEkvNikqTWF0aC5wb3cobCwyKS8KMil9fTtmLnRyaWFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xUcmlhbmdsZSkuc2l6ZShNYXRoLnNxcnQoMykqTWF0aC5wb3cobC8yLDIpKX19O2Yuc3Rhcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3Rhcikuc2l6ZSguODkwODEzMDkxNTI5Mjg1MipNYXRoLnBvdyhsLzIsMikpfX07dmFyIHQ9MyooMS9NYXRoLnNxcnQoMTIpLzIrMSk7Zi53eWU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFd5ZSkuc2l6ZSh0Kk1hdGgucG93KGwvMi40LDIpKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT0KcVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMjUpLGw9aCgwKSxwPWgoMTIpLG09aCgzNyk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7dmFyIHU9bi5jYWxsKHRoaXMpfHx0aGlzO3UuX2RldGVjdGlvblJhZGl1cz0zO3UuX3Jlc2l6YWJsZT0hMTt1Ll9tb3ZhYmxlPSExO3UuX2hhc0Nvcm5lcnM9ITA7dS5hZGRDbGFzcygiZHJhZy1ib3gtbGF5ZXIiKTt1Ll9kcmFnSW50ZXJhY3Rpb249bmV3IHQuRHJhZzt1Ll9zZXRVcENhbGxiYWNrcygpO3UuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh1KTt1Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt1Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5fc2V0VXBDYWxsYmFja3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KEksCk4pezA9PT1CJiZJLng9PT1OLngmJkkueT09PU4ueSYmeS5ib3hWaXNpYmxlKCExKTt5Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24geChJLE4pe3N3aXRjaChCKXtjYXNlIDA6Ry54PU4ueDtHLnk9Ti55O2JyZWFrO2Nhc2UgMTp3LmJvdHRvbT9HLnk9Ti55OncudG9wJiYoQy55PU4ueSk7dy5yaWdodD9HLng9Ti54OncubGVmdCYmKEMueD1OLngpO2JyZWFrO2Nhc2UgMjpJPU4ueC1ELng7dmFyIE89Ti55LUQueTtDLngrPUk7Qy55Kz1PO0cueCs9STtHLnkrPU87RD1OfXkuX3NldEJvdW5kcyh7dG9wTGVmdDpDLGJvdHRvbVJpZ2h0Okd9KTt5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChDLngpLHkueFNjYWxlKCkuaW52ZXJ0KEcueCldKTt5Ll95Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnlTY2FsZSgpJiYKeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoQy55KSx5LnlTY2FsZSgpLmludmVydChHLnkpXSk7eS5yZW5kZXIoKTt5Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24gQShJKXt3PXkuX2dldFJlc2l6aW5nRWRnZXMoSSk7dmFyIE49eS5ib3VuZHMoKTtOPU4udG9wTGVmdC54PD1JLngmJkkueDw9Ti5ib3R0b21SaWdodC54JiZOLnRvcExlZnQueTw9SS55JiZJLnk8PU4uYm90dG9tUmlnaHQueTt5LmJveFZpc2libGUoKSYmKHcudG9wfHx3LmJvdHRvbXx8dy5sZWZ0fHx3LnJpZ2h0KT9CPTE6eS5ib3hWaXNpYmxlKCkmJnkubW92YWJsZSgpJiZOP0I9MjooQj0wLHkuX3NldEJvdW5kcyh7dG9wTGVmdDpJLGJvdHRvbVJpZ2h0Okl9KSx5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChJLngpLHkueFNjYWxlKCkuaW52ZXJ0KEkueCldKSwKeS5feUJvdW5kc01vZGU9PT1tLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS55U2NhbGUoKSYmeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoSS55KSx5LnlTY2FsZSgpLmludmVydChJLnkpXSkseS5yZW5kZXIoKSk7eS5ib3hWaXNpYmxlKCEwKTtOPXkuYm91bmRzKCk7Qz17eDpOLnRvcExlZnQueCx5Ok4udG9wTGVmdC55fTtHPXt4Ok4uYm90dG9tUmlnaHQueCx5Ok4uYm90dG9tUmlnaHQueX07RD1JO3kuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKE4pfXZhciB5PXRoaXMsdyxDLEcsRCxCPTA7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KEEpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoeCk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCh1KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KEEpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHgpOwp5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ0VuZCh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KCl7cmV0dXJuIHguX2JveC5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSl9dmFyIHg9dGhpcztuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlVD11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUI9dSgpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VMPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlUj11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7aWYodGhpcy5faGFzQ29ybmVycyl7dmFyIEE9ZnVuY3Rpb24oKXtyZXR1cm4geC5fYm94LmFwcGVuZCgiY2lyY2xlIikuc3R5bGVzKHtvcGFjaXR5OjAsCmZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19O3EucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHUpe3ZhciB4PXt0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiB4O3ZhciBBPXRoaXMuYm91bmRzKCkseT1BLnRvcExlZnQueSx3PUEuYm90dG9tUmlnaHQueSxDPUEudG9wTGVmdC54O0E9QS5ib3R0b21SaWdodC54O3ZhciBHPXRoaXMuX2RldGVjdGlvblJhZGl1czsKQy1HPD11LngmJnUueDw9QStHJiYoeC50b3A9eS1HPD11LnkmJnUueTw9eStHLHguYm90dG9tPXctRzw9dS55JiZ1Lnk8PXcrRyk7eS1HPD11LnkmJnUueTw9dytHJiYoeC5sZWZ0PUMtRzw9dS54JiZ1Lng8PUMrRyx4LnJpZ2h0PUEtRzw9dS54JiZ1Lng8PUErRyk7cmV0dXJuIHh9O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLmJveFZpc2libGUoKSl7dmFyIHU9dGhpcy5ib3VuZHMoKSx4PXUudG9wTGVmdC55LEE9dS5ib3R0b21SaWdodC55LHk9dS50b3BMZWZ0Lng7dT11LmJvdHRvbVJpZ2h0Lng7dGhpcy5fZGV0ZWN0aW9uRWRnZVQuYXR0cnMoe3gxOnkseTE6eCx4Mjp1LHkyOngsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlQi5hdHRycyh7eDE6eSx5MTpBLHgyOnUseTI6QSwic3Ryb2tlLXdpZHRoIjoyKgp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6eSx5MTp4LHgyOnkseTI6QSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTp1LHkxOngseDI6dSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDp5LGN5Ongscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6dSxjeTp4LHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnksY3k6QSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDp1LGN5OkEscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9OwpxLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTtxLnByb3RvdHlwZS5yZXNpemFibGU9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fcmVzaXphYmxlO3RoaXMuX3Jlc2l6YWJsZT11O3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKHUpe3UmJnRoaXMuZW5hYmxlZCgpPyh0aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIikpOih0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIikpfTtxLnByb3RvdHlwZS5tb3ZhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vdmFibGV9O3EucHJvdG90eXBlLl9zZXRNb3ZhYmxlQ2xhc3M9ZnVuY3Rpb24oKXt0aGlzLm1vdmFibGUoKSYmdGhpcy5lbmFibGVkKCk/CnRoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9O3EucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQodSl9O3EucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHUpfTtxLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQodSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodSl9O3EucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh1KX07cS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh1KX07cS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn07CnEucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh1KTt0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpO3RoaXMuX3NldE1vdmFibGVDbGFzcygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oeCl7cmV0dXJuIHUuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHgpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHgpe3JldHVybiB1Ll9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh4KX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih4KXtyZXR1cm4gdS5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUoeCl9KTsKdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3EucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7bi5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbih1KXt1PXAuY29lcmNlRXh0ZXJuYWxEMyh1KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7bi5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyx1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3Jlc2V0U3RhdGU9ZnVuY3Rpb24oKXt0aGlzLmJvdW5kcyh7dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSl9O3JldHVybiBxfShoKDQzKS5TZWxlY3Rpb25Cb3hMYXllcik7Zi5EcmFnQm94TGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gcC5jYWxsKHRoaXMsInBhdGgiLCJsaW5lIil8fHRoaXN9ayhtLHApO20ucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKG4pe24uc3R5bGUoImZpbGwiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5MaW5lU1ZHRHJhd2VyPWQ7dmFyIGw9WyJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiXTtmLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXA9CmZ1bmN0aW9uKHApe3JldHVybiBmdW5jdGlvbihtLG4scSl7cT10LnJlc29sdmVBdHRyaWJ1dGVzKHEsbCxuWzBdLDApO3QucmVuZGVyTGluZShtLHAoKSxuWzBdLHEpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7dm9pZCAwPT09biYmKG49IiIpO3ZhciBxPXAuY2FsbCh0aGlzLCJyZWN0IiwiIil8fHRoaXM7cS5fcm9vdENsYXNzTmFtZT1uO3EuX3Jvb3QuY2xhc3NlZChxLl9yb290Q2xhc3NOYW1lLCEwKTtyZXR1cm4gcX1rKG0scCk7cmV0dXJuIG19KGgoOSkuU1ZHRHJhd2VyKTtmLlJlY3RhbmdsZVNWR0RyYXdlcj0KZDt2YXIgbD1bIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXTtmLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKHAsbSxuKXtwLnNhdmUoKTttLmZvckVhY2goZnVuY3Rpb24ocSx1KXtudWxsIT1xJiYocT10LnJlc29sdmVBdHRyaWJ1dGVzU3Vic2V0V2l0aFN0eWxlcyhuLGwscSx1KSxwLmJlZ2luUGF0aCgpLHAucmVjdChxLngscS55LHEud2lkdGgscS5oZWlnaHQpLHQucmVuZGVyUGF0aFdpdGhTdHlsZShwLHEpKX0pO3AucmVzdG9yZSgpfTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7cmV0dXJuIHAuY2FsbCh0aGlzLG4sZi5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCl8fHRoaXN9ayhtLHApO3JldHVybiBtfSh0LkNhbnZhc0RyYXdlcik7Zi5SZWN0YW5nbGVDYW52YXNEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7bC5TSE9XX1dBUk5JTkdTJiZjb25zb2xlLndhcm4ocCl9ZnVuY3Rpb24gdChwLG0pe2Zvcih2YXIgbj1bXSxxPTI7cTxhcmd1bWVudHMubGVuZ3RoO3ErKyluW3EtCjJdPWFyZ3VtZW50c1txXTtyZXR1cm4gMD09PW0/KHAobiksLTEpOndpbmRvdy5zZXRUaW1lb3V0KHAsbSxuKX12YXIgbD1oKDIzKTtmLndhcm49aztmLnNldFRpbWVvdXQ9dDtmLmRlYm91bmNlPWZ1bmN0aW9uKHAsbSxuKXtmdW5jdGlvbiBxKCl7bS5hcHBseShuLHgpfXZhciB1PW51bGwseD1bXTtyZXR1cm4gZnVuY3Rpb24oKXt4PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Y2xlYXJUaW1lb3V0KHUpO3U9dChxLHApfX07Zi5kZXByZWNhdGVkPWZ1bmN0aW9uKHAsbSxuKXt2b2lkIDA9PT1uJiYobj0iIik7aygiTWV0aG9kICIrcCsiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAiK20rIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK24pfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrKXt0aGlzLnJ1bGVyPW51bGwhPWsuY3JlYXRlUnVsZXI/ay5jcmVhdGVSdWxlcigpOmt9aC5wcm90b3R5cGUubWVhc3VyZT0KZnVuY3Rpb24oayl7dm9pZCAwPT09ayYmKGs9aC5IRUlHSFRfVEVYVCk7cmV0dXJuIHRoaXMucnVsZXIoayl9O3JldHVybiBofSgpO2QuSEVJR0hUX1RFWFQ9ImJkcHFsIjtmLkFic3RyYWN0TWVhc3VyZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDMyKSk7ayhoKDc0KSk7ayhoKDc1KSk7ayhoKDQxKSk7ayhoKDQyKSk7ayhoKDc2KSk7ayhoKDc3KSk7ayhoKDc4KSk7ayhoKDc5KSk7ayhoKDQzKSk7ayhoKDgwKSk7ayhoKDgxKSk7ayhoKDgyKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGwscCl7dm9pZCAwPT09bCYmKGw9W10pO3ZvaWQgMD09PXAmJihwPXt9KTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2RhdGE9bDt0aGlzLl9tZXRhZGF0YT1wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldH10LnByb3RvdHlwZS5vblVwZGF0ZT0KZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmFkZChsKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5kZWxldGUobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZGF0YTt0aGlzLl9kYXRhPWw7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUubWV0YWRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fbWV0YWRhdGE7dGhpcy5fbWV0YWRhdGE9bDt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07cmV0dXJuIHR9KCk7CmYuRGF0YXNldD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKSx0PWgoMzApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7fWwucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QuZmx1c2goKX07cmV0dXJuIGx9KCk7Zi5JbW1lZGlhdGU9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtrLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCh0LmZsdXNoKX07cmV0dXJuIGx9KCk7Zi5BbmltYXRpb25GcmFtZT1kO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fdGltZW91dE1zZWM9ay5ET00uU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFN9bC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh0LmZsdXNoLHRoaXMuX3RpbWVvdXRNc2VjKX07cmV0dXJuIGx9KCk7Zi5UaW1lb3V0PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCwKbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9rZXlQcmVzc0NhbGxiYWNrcz17fTtuLl9rZXlSZWxlYXNlQ2FsbGJhY2tzPXt9O24uX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuITF9O24uX2Rvd25lZEtleXM9bmV3IGwuU2V0O24uX2tleURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVLZXlEb3duRXZlbnQocSx1KX07bi5fa2V5VXBDYWxsYmFjaz1mdW5jdGlvbihxKXtyZXR1cm4gbi5faGFuZGxlS2V5VXBFdmVudChxKX07cmV0dXJuIG59ayhtLHApOwptLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPXQuS2V5LmdldERpc3BhdGNoZXIoKTt0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPW51bGw7CnRoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5VXAodGhpcy5fa2V5VXBDYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlcj1udWxsfTttLnByb3RvdHlwZS5faGFuZGxlS2V5RG93bkV2ZW50PWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIubGFzdE1vdXNlUG9zaXRpb24oKSk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQodSkmJiFxLnJlcGVhdCYmKHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dJiZ0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX2Rvd25lZEtleXMuYWRkKG4pKX07bS5wcm90b3R5cGUuX2hhbmRsZUtleVVwRXZlbnQ9ZnVuY3Rpb24obil7dGhpcy5fZG93bmVkS2V5cy5oYXMobikmJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0mJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uY2FsbENhbGxiYWNrcyhuKTsKdGhpcy5fZG93bmVkS2V5cy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXXx8KHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5hZGQocSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9mZktleVByZXNzPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0uZGVsZXRlKHEpOzA9PT10aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl07cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uS2V5UmVsZWFzZT1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmFkZChxKTtyZXR1cm4gdGhpc307Cm0ucHJvdG90eXBlLm9mZktleVJlbGVhc2U9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmRlbGV0ZShxKTswPT09dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoMTUpLkludGVyYWN0aW9uKTtmLktleT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgwKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSl7dm9pZCAwPT09bSYmKG09W10pO3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9jb21wb25lbnRzPQpbXTtuLmFkZENsYXNzKCJjb21wb25lbnQtZ3JvdXAiKTttLmZvckVhY2goZnVuY3Rpb24ocSl7cmV0dXJuIG4uYXBwZW5kKHEpfSk7cmV0dXJuIG59ayhwLGwpO3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG0pe3RoaXMuY29tcG9uZW50cygpLmZvckVhY2gobSl9O3AucHJvdG90eXBlLmhhcz1mdW5jdGlvbihtKXtyZXR1cm4gMDw9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKG0pfTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihtLG4pe3ZhciBxPXRoaXMuX2NvbXBvbmVudHMubWFwKGZ1bmN0aW9uKHUpe3JldHVybiB1LnJlcXVlc3RlZFNwYWNlKG0sbil9KTtyZXR1cm57bWluV2lkdGg6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbldpZHRofSwwKSxtaW5IZWlnaHQ6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbkhlaWdodH0sMCl9fTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT0KdGhpcztsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbih4KXt4LmNvbXB1dGVMYXlvdXQoe3g6MCx5OjB9LHUud2lkdGgoKSx1LmhlaWdodCgpKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihtLG4pe3JldHVybnt3aWR0aDptLGhlaWdodDpufX07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkV2lkdGgoKX0pfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkSGVpZ2h0KCl9KX07cC5wcm90b3R5cGUuY29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLnNsaWNlKCl9O3AucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihtKXtudWxsPT0KbXx8dGhpcy5oYXMobSl8fChtLmRldGFjaCgpLHRoaXMuX2NvbXBvbmVudHMucHVzaChtKSx0aGlzLl9hZG9wdEFuZEFuY2hvcihtKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihtKXttPXRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZihtKTswPD1tJiZ0aGlzLl9jb21wb25lbnRzLnNwbGljZShtLDEpfTtyZXR1cm4gcH0oaCgyOSkuQ29tcG9uZW50Q29udGFpbmVyKTtmLkdyb3VwPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX07aCgwKTtkPWgoNCk7dmFyIHQ7KGZ1bmN0aW9uKGwpe2xbbC5WQUxVRT0wXT0KIlZBTFVFIjtsW2wuUElYRUw9MV09IlBJWEVMIn0pKHR8fCh0PXt9KSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9tb2RlPXQuVkFMVUU7aWYobSE9PXAuT1JJRU5UQVRJT05fVkVSVElDQUwmJm0hPT1wLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO24uX29yaWVudGF0aW9uPW07bi5fb3ZlcmZsb3dIaWRkZW49ITA7bi5hZGRDbGFzcygiZ3VpZGUtbGluZS1sYXllciIpO24uX2lzVmVydGljYWwoKT9uLmFkZENsYXNzKCJ2ZXJ0aWNhbCIpOm4uYWRkQ2xhc3MoImhvcml6b250YWwiKTtuLl9zY2FsZVVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7bi5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO24ucmVuZGVyKCl9O3JldHVybiBufWsocCxsKTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX07cC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obSxuKXtyZXR1cm57d2lkdGg6bSxoZWlnaHQ6bn19O3AucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09cC5PUklFTlRBVElPTl9WRVJUSUNBTH07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuc2NhbGUoKS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLnNjYWxlKCkucmFuZ2UoW3RoaXMuaGVpZ2h0KCksCjBdKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fbW9kZT09PXQuVkFMVUUmJm51bGwhPXRoaXMudmFsdWUoKT90aGlzLl9waXhlbFBvc2l0aW9uPQp0aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09dC5QSVhFTCYmbnVsbCE9dGhpcy5waXhlbFBvc2l0aW9uKCkmJih0aGlzLl92YWx1ZT10aGlzLnNjYWxlKCkuaW52ZXJ0KHRoaXMucGl4ZWxQb3NpdGlvbigpKSkpfTtwLnByb3RvdHlwZS5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGU9ZnVuY3Rpb24obSl7dGhpcy5fcGl4ZWxQb3NpdGlvbj1tO251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKTt0aGlzLnJlbmRlcigpfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9zY2FsZTt2YXIgbj10aGlzLl9zY2FsZTtudWxsIT1uJiZuLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9zY2FsZT1tO3RoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spOwp0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdmFsdWU7dGhpcy5fdmFsdWU9bTt0aGlzLl9tb2RlPXQuVkFMVUU7dGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBpeGVsUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGl4ZWxQb3NpdGlvbn07cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT10aGlzLnNjYWxlKCkmJnRoaXMuc2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayl9O3JldHVybiBwfShkLkNvbXBvbmVudCk7ZC5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiO2QuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCI7CmYuR3VpZGVMaW5lTGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMCk7ZD1oKDQpO3ZhciBsOyhmdW5jdGlvbihwKXtwW3AuVkFMVUU9MF09IlZBTFVFIjtwW3AuUElYRUw9MV09IlBJWEVMIn0pKGw9Zi5Qcm9wZXJ0eU1vZGV8fChmLlByb3BlcnR5TW9kZT17fSkpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPXAuY2FsbCh0aGlzKXx8dGhpcztuLl9ib3hWaXNpYmxlPSExO24uX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fTtuLl94Qm91bmRzTW9kZT1sLlBJWEVMO24uX3lCb3VuZHNNb2RlPQpsLlBJWEVMO24uYWRkQ2xhc3MoInNlbGVjdGlvbi1ib3gtbGF5ZXIiKTtuLl9hZGp1c3RCb3VuZHNDYWxsYmFjaz1mdW5jdGlvbigpe24ucmVuZGVyKCl9O24uX292ZXJmbG93SGlkZGVuPSEwO24uX3hFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO24uX3lFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpO3RoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwhMCl9O20ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG4scSl7cmV0dXJue3dpZHRoOm4saGVpZ2h0OnF9fTttLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZ2V0Qm91bmRzKCk7CnRoaXMuX3NldEJvdW5kcyhuKTt0aGlzLl95Qm91bmRzTW9kZT10aGlzLl94Qm91bmRzTW9kZT1sLlBJWEVMO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24obil7dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0Ont4Ok1hdGgubWluKG4udG9wTGVmdC54LG4uYm90dG9tUmlnaHQueCkseTpNYXRoLm1pbihuLnRvcExlZnQueSxuLmJvdHRvbVJpZ2h0LnkpfSxib3R0b21SaWdodDp7eDpNYXRoLm1heChuLnRvcExlZnQueCxuLmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgobi50b3BMZWZ0Lnksbi5ib3R0b21SaWdodC55KX19fTttLnByb3RvdHlwZS5fZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5taW4odGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksCnRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55Om51bGw9PXRoaXMuX3lTY2FsZT8wOk1hdGgubWluKHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMV0pKX0sYm90dG9tUmlnaHQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54Om51bGw9PXRoaXMuX3hTY2FsZT8wOk1hdGgubWF4KHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMF0pLHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1heCh0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSwKdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLl9ib3hWaXNpYmxlKXt2YXIgbj10aGlzLmJvdW5kcygpLHE9bi50b3BMZWZ0LnksdT1uLmJvdHRvbVJpZ2h0LnkseD1uLnRvcExlZnQueDtuPW4uYm90dG9tUmlnaHQueDtpZighKHQuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpJiZ0Lk1hdGguaXNWYWxpZE51bWJlcih1KSYmdC5NYXRoLmlzVmFsaWROdW1iZXIoeCkmJnQuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pKSl0aHJvdyBFcnJvcigiYm91bmRzIGhhdmUgbm90IGJlZW4gcHJvcGVybHkgc2V0Iik7dGhpcy5fYm94QXJlYS5hdHRycyh7eCx5OnEsd2lkdGg6bi14LGhlaWdodDp1LXF9KTt0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7CnJldHVybiB0aGlzfTttLnByb3RvdHlwZS5ib3hWaXNpYmxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2JveFZpc2libGU7dGhpcy5fYm94VmlzaWJsZT1uO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3hTY2FsZTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3hTY2FsZT1uO3RoaXMuX3hCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feFNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24obil7aWYobnVsbD09Cm4pcmV0dXJuIHRoaXMuX3lTY2FsZTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3lTY2FsZT1uO3RoaXMuX3lCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feVNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS54RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFhFeHRlbnQoKX07bS5wcm90b3R5cGUuX2dldFhFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feEJvdW5kc01vZGU9PT1sLlZBTFVFP3RoaXMuX3hFeHRlbnQ6bnVsbD09dGhpcy5feFNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC54KSx0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54KV19O20ucHJvdG90eXBlLl9zZXRYRXh0ZW50PQpmdW5jdGlvbihuKXt0aGlzLl94RXh0ZW50PW59O20ucHJvdG90eXBlLnlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WUV4dGVudCgpfTttLnByb3RvdHlwZS5fZ2V0WUV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl95Qm91bmRzTW9kZT09PWwuVkFMVUU/dGhpcy5feUV4dGVudDpudWxsPT10aGlzLl95U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LnkpLHRoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LnkpXX07bS5wcm90b3R5cGUuX3NldFlFeHRlbnQ9ZnVuY3Rpb24obil7dGhpcy5feUV4dGVudD1ufTttLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy54U2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO251bGwhPXRoaXMuX3lTY2FsZSYmCnRoaXMueVNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKX07cmV0dXJuIG19KGQuQ29tcG9uZW50KTtmLlNlbGVjdGlvbkJveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwiYXJjIGZpbGwiKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocCl7cC5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTtyZXR1cm4gbH0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJjU1ZHRHJhd2VyPQpkfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBvdXRsaW5lIil8fHRoaXN9ayhsLHQpO2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHApe3Auc3R5bGUoImZpbGwiLCJub25lIil9O3JldHVybiBsfShoKDkpLlNWR0RyYXdlcik7Zi5BcmNPdXRsaW5lU1ZHRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxOCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7cmV0dXJuIHAuY2FsbCh0aGlzLCJwYXRoIiwiYXJlYSIpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihuKXtuLnN0eWxlKCJzdHJva2UiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5BcmVhU1ZHRHJhd2VyPWQ7dmFyIGw9WyJmaWxsIiwib3BhY2l0eSIsImZpbGwtb3BhY2l0eSJdO2YubWFrZUFyZWFDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihwKXtyZXR1cm4gZnVuY3Rpb24obSwKbixxKXtxPXQucmVzb2x2ZUF0dHJpYnV0ZXMocSxsLG5bMF0sMCk7dC5yZW5kZXJBcmVhKG0scCgpLG5bMF0scSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gdC5jYWxsKHRoaXMsImxpbmUiLCIiKXx8dGhpc31rKGwsdCk7cmV0dXJuIGx9KGgoOSkuU1ZHRHJhd2VyKTtmLlNlZ21lbnRTVkdEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsobixxLHUseCxBKXtyZXR1cm4gMDw9dStBJiZ1LUE8PW4mJjA8PXgrQSYmeC1BPD1xfWZ1bmN0aW9uIHQobixxLHUpe2lmKG51bGw9PW4pcmV0dXJuITE7CmZvcih2YXIgeD0wO3g8dS5sZW5ndGg7eCsrKXt2YXIgQT11W3hdO2lmKG5bQV0hPXFbQV0pcmV0dXJuITF9cmV0dXJuITB9dmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHA9aCg4NiksbT1oKDE4KTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXtyZXR1cm4gbi5jYWxsKHRoaXMsInBhdGgiLCJzeW1ib2wiKXx8dGhpc31sKHEsbik7cmV0dXJuIHF9KGgoOSkuU1ZHRHJhd2VyKTtmLlN5bWJvbFNWR0RyYXdlcj1kO2YubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG4scSx1KXt2YXIgeD10aGlzO3JldHVybiBmdW5jdGlvbihBLHksdyl7dmFyIEM9QS5jYW52YXMsRz1DLmNsaWVudFdpZHRoOwpDPUMuY2xpZW50SGVpZ2h0O2Zvcih2YXIgRD1uZXcgcC5DYW52YXNCdWZmZXIoMCwwKSxCPXEoKSxJPXUoKSxOPW51bGwsTz1udWxsLEg9bnVsbCxLPTA7Szx5Lmxlbmd0aDtLKyspe3ZhciBNPXlbS107aWYobnVsbCE9TSl7dmFyIEw9bS5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXModyxbIngiLCJ5Il0sTSxLKSxRPUkoTSxLLG4pO2lmKGsoRyxDLEwueCxMLnksUSkpe3ZhciBUPXQoTixMLG0uQ29udGV4dFN0eWxlQXR0cnMpO009QihNLEsseC5fZGF0YXNldCk7VCYmSD09USYmTz09TXx8KE49bS5nZXRTdHJva2VXaWR0aChMKSxOPVErTisxLChOPkQuc2NyZWVuV2lkdGh8fE4+RC5zY3JlZW5IZWlnaHQpJiZELnJlc2l6ZShOLE4sITApLEQuY2xlYXIoKSxOPUQuY3R4LE4uYmVnaW5QYXRoKCksTShRKS5jb250ZXh0KE4pKG51bGwpLE4uY2xvc2VQYXRoKCksbS5yZW5kZXJQYXRoV2l0aFN0eWxlKE4sTCksTz1NLEg9USxOPUwpO0QuYmxpdENlbnRlcihBLEwueCxMLnkpfX19fX19LApmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhEKXtyZXR1cm4gRCBpbnN0YW5jZW9mIHk/RDpEIGluc3RhbmNlb2YgRGF0ZT9wKEQudmFsdWVPZigpKTpEIGluc3RhbmNlb2YgQS5TY2FsZT90KEQpOkQgaW5zdGFuY2VvZiB4LkRhdGFzZXQ/bChEKTp1KEQpP24oRCk6QXJyYXkuaXNBcnJheShEKT9tKEQpOnAoRCl9ZnVuY3Rpb24gdChEKXtEPXtkb21haW46RC5kb21haW4oKSxyYW5nZTpELnJhbmdlKCksdXBkYXRlSWQ6RC51cGRhdGVJZCgpLHJlZjpwKEQpfTtyZXR1cm4gbihEKX1mdW5jdGlvbiBsKEQpe0Q9e3JlZjpwKEQpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKX07cmV0dXJuIG4oRCl9ZnVuY3Rpb24gcChEKXtyZXR1cm4gbmV3IEMoRCl9ZnVuY3Rpb24gbShEKXtyZXR1cm4gbmV3IHcoRC5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIGsoQil9KSl9ZnVuY3Rpb24gbihEKXt2YXIgQj17fSxJO2ZvcihJIGluIEQpRC5oYXNPd25Qcm9wZXJ0eShJKSYmKEJbSV09ayhEW0ldKSk7cmV0dXJuIG5ldyBHKEIpfQp2YXIgcT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKCl7dGhpcy5jb25zdHJ1Y3Rvcj1EfWZvcih2YXIgTiBpbiBCKUIuaGFzT3duUHJvcGVydHkoTikmJihEW05dPUJbTl0pO0QucHJvdG90eXBlPW51bGw9PT1CP09iamVjdC5jcmVhdGUoQik6KEkucHJvdG90eXBlPUIucHJvdG90eXBlLG5ldyBJKX0sdT1oKDEyOCkseD1oKDM4KSxBPWgoMTcpO2Yuc2lnbj1rO2Yuc2lnblNjYWxlPXQ7Zi5zaWduRGF0YXNldD1sO2Yuc2lnblJlZj1wO2Yuc2lnbkFycmF5PW07Zi5zaWduT2JqPW47dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBEKCl7fUQucHJvdG90eXBlLmlzRGlmZmVyZW50PWZ1bmN0aW9uKEIpe3JldHVybiBCIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj90aGlzLmlzU2lnbmF0dXJlRGlmZmVyZW50KEIpOiEwfTtyZXR1cm4gRH0oKTtmLlNpZ25hdHVyZT15O3ZhciB3PWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoSSl7dmFyIE49RC5jYWxsKHRoaXMpfHwKdGhpcztOLmFycmF5PUk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe2lmKEkuYXJyYXkubGVuZ3RoIT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBOPTA7Tjx0aGlzLmFycmF5Lmxlbmd0aDtOKyspaWYodGhpcy5hcnJheVtOXS5pc0RpZmZlcmVudChJLmFycmF5W05dKSlyZXR1cm4hMDtyZXR1cm4hMX07cmV0dXJuIEJ9KHkpO2YuQXJyYXlTaWduYXR1cmU9dzt2YXIgQz1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEkpe3ZhciBOPUQuY2FsbCh0aGlzKXx8dGhpcztOLnJlZj1JO3JldHVybiBOfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXtyZXR1cm4gdGhpcy5yZWYhPT1JLnJlZn07cmV0dXJuIEJ9KHkpO2YuUmVmZXJlbmNlU2lnbmF0dXJlPUM7dmFyIEc9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTj1ELmNhbGwodGhpcyl8fHRoaXM7Ti5vYmo9Ckk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe3ZhciBOPU9iamVjdC5rZXlzKHRoaXMub2JqKSxPPU9iamVjdC5rZXlzKEkub2JqKTtpZihOLmxlbmd0aCE9PU8ubGVuZ3RoKXJldHVybiEwO2ZvcihPPTA7TzxOLmxlbmd0aDtPKyspe3ZhciBIPU5bT107aWYoIUkub2JqLmhhc093blByb3BlcnR5KEgpfHx0aGlzLm9ialtIXS5pc0RpZmZlcmVudChJLm9ialtIXSkpcmV0dXJuITB9cmV0dXJuITF9O3JldHVybiBCfSh5KTtmLk9iamVjdFNpZ25hdHVyZT1HfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9eX1mb3IodmFyIEcgaW4gdyl3Lmhhc093blByb3BlcnR5KEcpJiYoeVtHXT13W0ddKTt5LnByb3RvdHlwZT1udWxsPT09dz9PYmplY3QuY3JlYXRlKHcpOihDLnByb3RvdHlwZT13LnByb3RvdHlwZSxuZXcgQyl9LAp0PWgoMSksbD1oKDMpLHA9aCgwKSxtPWgoMTQpLG49aCg0NikscT1oKDYpLHU9aCgzMykseD1oKDE5KTtkPWgoNTMpO3ZhciBBPWgoMik7aD1mdW5jdGlvbih5KXtmdW5jdGlvbiB3KCl7dmFyIEM9eS5jYWxsKHRoaXMpfHx0aGlzO0MuYWRkQ2xhc3MoImFyZWEtcGxvdCIpO0MueTAoMCk7Qy5hdHRyKCJmaWxsLW9wYWNpdHkiLC4yNSk7Qy5hdHRyKCJmaWxsIiwobmV3IGwuQ29sb3IpLnJhbmdlKClbMF0pO0MuX2xpbmVEcmF3ZXJzPW5ldyBwLk1hcDtyZXR1cm4gQ31rKHcseSk7dy5wcm90b3R5cGUueT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1HP3kucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMpOnkucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMsRyk7bnVsbCE9RyYmKEM9dGhpcy55MCgpLmFjY2Vzc29yLG51bGwhPUMmJnRoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHKSx0aGlzLl91cGRhdGVZU2NhbGUoKSk7CnJldHVybiB0aGlzfTt3LnByb3RvdHlwZS55MD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMF9LRVkpO3ZhciBHPXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHJiZHLnNjYWxlKTt0aGlzLl91cGRhdGVZU2NhbGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7eS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZVlTY2FsZSgpfTt3LnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3RoaXMuX2xpbmVEcmF3ZXJzLnNldChDLG5ldyBtLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEQpe3JldHVybiBuZXcgbS5DYW52YXNEcmF3ZXIoRCx1Lm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXt2YXIgQj0KQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKTtyZXR1cm4gRy5fZDNMaW5lRmFjdG9yeShDLEIsSSl9KSl9KSk7eS5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEMpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEMpe3kucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLEMpO0M9dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpOyJzdmciPT09dGhpcy5yZW5kZXJlcigpP0MudXNlU1ZHKHRoaXMuX3JlbmRlckFyZWEpOkMudXNlQ2FudmFzKHRoaXMuX2NhbnZhcyk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oQyl7eS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsQyk7dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpLnJlbW92ZSgpfTt3LnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe3ZhciBDPXRoaXMsRz10aGlzLl9nZW5lcmF0ZUxpbmVEcmF3U3RlcHMoKSxEPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1BLlBsb3QuYXBwbHlEcmF3U3RlcHMoRyxCKTtDLl9saW5lRHJhd2Vycy5nZXQoQikuZHJhdyhELmdldChCKSxJKX0pfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIEM9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgRz10aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKTtHLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCksCmFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBDPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0MuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgbi5BcmVhU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEQsbi5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7dmFyIEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKSwKTj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueTAoKSk7cmV0dXJuIEcuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQixJLE4sRy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihCLEkpLEMpfSkpfSl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7Ry5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkcsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeC5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7CnJldHVybiBDfTt3LnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoInkwIik7Qz1wLkFycmF5LnVuaXEocC5BcnJheS5mbGF0dGVuKEMpKTt2YXIgRz0xPT09Qy5sZW5ndGg/Q1swXTpudWxsO0M9KEM9dGhpcy55KCkpJiZDLnNjYWxlO251bGwhPUMmJihudWxsIT10aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciYmKEMucmVtb3ZlUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciksdGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXI9bnVsbCksbnVsbCE9RyYmKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0ddfSxDLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpKSl9O3cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpfTt3LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEM9eS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO0MuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt2b2lkIDA9PT1DJiYoQz10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiB0LnNlbGVjdEFsbCgpO3ZhciBEPXkucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLEMpLm5vZGVzKCk7Qy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIEcuX2xpbmVEcmF3ZXJzLmdldChCKX0pLmZpbHRlcihmdW5jdGlvbihCKXtyZXR1cm4gbnVsbCE9CkJ9KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3JldHVybiBELnB1c2guYXBwbHkoRCxCLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gdC5zZWxlY3RBbGwoRCl9O3cucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yPWZ1bmN0aW9uKEMsRyxEKXt2YXIgQj10aGlzLEk9dGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIGZ1bmN0aW9uKE4sTyxIKXtyZXR1cm4gQi5fY3JlYXRlQXJlYUdlbmVyYXRvcihDLEcsRCxJLEgpKE4pfX07dy5wcm90b3R5cGUuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3I9ZnVuY3Rpb24oQyxHKXtyZXR1cm4gZnVuY3Rpb24oRCxCLEkpe3ZhciBOPUMoRCxCLEkpO0Q9RyhELEIsSSk7cmV0dXJuIHAuTWF0aC5pc1ZhbGlkTnVtYmVyKE4pJiZwLk1hdGguaXNWYWxpZE51bWJlcihEKX19O3cucHJvdG90eXBlLl9jcmVhdGVBcmVhR2VuZXJhdG9yPQpmdW5jdGlvbihDLEcsRCxCLEkpe3ZhciBOPXRoaXMuX2dldEN1cnZlRmFjdG9yeSgpO3JldHVybiB0LmFyZWEoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEMoTyxILEkpfSkueTEoZnVuY3Rpb24oTyxIKXtyZXR1cm4gRyhPLEgsSSl9KS55MChmdW5jdGlvbihPLEgpe3JldHVybiBEKE8sSCxJKX0pLmN1cnZlKE4pLmRlZmluZWQoZnVuY3Rpb24oTyxIKXtyZXR1cm4gQihPLEgsSSl9KX07cmV0dXJuIHd9KGQuTGluZSk7aC5fWTBfS0VZPSJ5MCI7Zi5BcmVhPWh9LGZ1bmN0aW9uKGQsZil7KGZ1bmN0aW9uKGgpe2guTUFJTj0ibWFpbiI7aC5SRVNFVD0icmVzZXQifSkoZi5BbmltYXRvcnx8KGYuQW5pbWF0b3I9e30pKX0sZnVuY3Rpb24oZCxmKXt2YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt2YXIgdD10aGlzO3RoaXMudHJhbnNsYXRlPXRoaXMuc2NhbGU9MDt0aGlzLmNhY2hlZERvbWFpbj1bbnVsbCxudWxsXTt0aGlzLmxhc3RTZWVuRG9tYWluPVtudWxsLG51bGxdO3RoaXMudXBkYXRlRG9tYWluPQpmdW5jdGlvbihsKXt0Lmxhc3RTZWVuRG9tYWluPWwuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTt2YXIgcD1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMV0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSksbT1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblsxXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pO3Quc2NhbGU9cC9tfHwxO3QudHJhbnNsYXRlPWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pKnQuc2NhbGV8fDB9fWsucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zY2FsZT0xO3RoaXMudHJhbnNsYXRlPTA7dGhpcy5jYWNoZWREb21haW49dGhpcy5sYXN0U2VlbkRvbWFpbn07ay5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGVkRG9tYWluPQp0LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl9O3JldHVybiBrfSgpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKHQsbCl7dmFyIHA9dGhpczt0aGlzLnJlbmRlckNhbGxiYWNrPXQ7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrPWw7dGhpcy5kb21haW5UcmFuc2Zvcm1YPW5ldyBoO3RoaXMuZG9tYWluVHJhbnNmb3JtWT1uZXcgaDt0aGlzLnJlbmRlckRlZmVycmVkPWZ1bmN0aW9uKCl7cC5hcHBseVRyYW5zZm9ybSgpO2NsZWFyVGltZW91dChwLnRpbWVvdXRUb2tlbik7cC50aW1lb3V0VG9rZW49c2V0VGltZW91dChmdW5jdGlvbigpe3AucmVuZGVyQ2FsbGJhY2soKX0say5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVkpfX1rLnByb3RvdHlwZS5zZXREb21haW5zPWZ1bmN0aW9uKHQsbCl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNldERvbWFpbih0KTtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2V0RG9tYWluKGwpO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07ay5wcm90b3R5cGUudXBkYXRlRG9tYWlucz0KZnVuY3Rpb24odCxsKXt0JiZ0aGlzLmRvbWFpblRyYW5zZm9ybVgudXBkYXRlRG9tYWluKHQpO2wmJnRoaXMuZG9tYWluVHJhbnNmb3JtWS51cGRhdGVEb21haW4obCk7dGhpcy5yZW5kZXJEZWZlcnJlZCgpfTtrLnByb3RvdHlwZS5yZXNldFRyYW5zZm9ybXM9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpblRyYW5zZm9ybVgucmVzZXQoKTt0aGlzLmRvbWFpblRyYW5zZm9ybVkucmVzZXQoKTt0aGlzLmFwcGx5VHJhbnNmb3JtKCl9O2sucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKCl7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrKHRoaXMuZG9tYWluVHJhbnNmb3JtWC50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnRyYW5zbGF0ZSx0aGlzLmRvbWFpblRyYW5zZm9ybVguc2NhbGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNjYWxlKX07cmV0dXJuIGt9KCk7ZC5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVk9MjAwO2YuRGVmZXJyZWRSZW5kZXJlcj1kfSxmdW5jdGlvbihkLApmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDcpLHA9aCgxNCksbT1oKDYpLG49aCgzMykscT1oKDMpLHU9aCgxMSkseD1oKDApO2Q9aCgxMCk7dmFyIEE9aCgxOSkseT1oKDIpO2g9aCgxNik7dmFyIHc9e2xpbmVhcjp0LmN1cnZlTGluZWFyLGxpbmVhckNsb3NlZDp0LmN1cnZlTGluZWFyQ2xvc2VkLHN0ZXA6dC5jdXJ2ZVN0ZXAsc3RlcEJlZm9yZTp0LmN1cnZlU3RlcEJlZm9yZSxzdGVwQWZ0ZXI6dC5jdXJ2ZVN0ZXBBZnRlcixiYXNpczp0LmN1cnZlQmFzaXMsYmFzaXNPcGVuOnQuY3VydmVCYXNpc09wZW4sYmFzaXNDbG9zZWQ6dC5jdXJ2ZUJhc2lzQ2xvc2VkLApidW5kbGU6dC5jdXJ2ZUJ1bmRsZSxjYXJkaW5hbDp0LmN1cnZlQ2FyZGluYWwsY2FyZGluYWxPcGVuOnQuY3VydmVDYXJkaW5hbE9wZW4sY2FyZGluYWxDbG9zZWQ6dC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkLG1vbm90b25lOnQuY3VydmVNb25vdG9uZVh9O2YuQ3VydmVOYW1lPWQubWFrZUVudW0oImxpbmVhciBsaW5lYXJDbG9zZWQgc3RlcCBzdGVwQmVmb3JlIHN0ZXBBZnRlciBiYXNpcyBiYXNpc09wZW4gYmFzaXNDbG9zZWQgYnVuZGxlIGNhcmRpbmFsIGNhcmRpbmFsT3BlbiBjYXJkaW5hbENsb3NlZCBtb25vdG9uZSIuc3BsaXQoIiAiKSk7aD1mdW5jdGlvbihDKXtmdW5jdGlvbiBHKCl7dmFyIEQ9Qy5jYWxsKHRoaXMpfHx0aGlzO0QuX2N1cnZlPSJsaW5lYXIiO0QuX2F1dG9yYW5nZVNtb290aD0hMTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD0hMDtELl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9ITE7RC5fZG93bnNhbXBsaW5nRW5hYmxlZD0hMTtELmFkZENsYXNzKCJsaW5lLXBsb3QiKTsKdmFyIEI9bmV3IGwuRWFzaW5nO0Iuc3RlcER1cmF0aW9uKHkuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5lYXNpbmdNb2RlKCJleHBJbk91dCIpO0IubWF4VG90YWxEdXJhdGlvbih5LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0QuYW5pbWF0b3IoQS5BbmltYXRvci5NQUlOLEIpO0QuYXR0cigic3Ryb2tlIiwobmV3IHEuQ29sb3IpLnJhbmdlKClbMF0pO0QuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIER9ayhHLEMpO0cucHJvdG90eXBlLng9ZnVuY3Rpb24oRCxCLEkpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLnguY2FsbCh0aGlzKTtDLnByb3RvdHlwZS54LmNhbGwodGhpcyxELEIsSSk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS55PWZ1bmN0aW9uKEQsQixJKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS55LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueS5jYWxsKHRoaXMsRCxCLApJKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmF1dG9yYW5nZU1vZGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzLEQpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuYXV0b3JhbmdlU21vb3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F1dG9yYW5nZVNtb290aH07Ry5wcm90b3R5cGUuX3NldFNjYWxlU25hcHBpbmc9ZnVuY3Rpb24oKXsieCI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmdGhpcy54KCkmJnRoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSk7InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJgp0aGlzLnkoKSYmdGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy55KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKX07Ry5wcm90b3R5cGUuY3VydmU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY3VydmU7dGhpcy5fY3VydmU9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd25zYW1wbGluZ0VuYWJsZWR9O0cucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkO3RoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuY29sbGFwc2VEZW5zZUxpbmVzRW5hYmxlZD0KZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkO3RoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcztyZXR1cm4gbmV3IG0uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uTGluZVNWR0RyYXdlcn0sZnVuY3Rpb24oSSl7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihJLG4ubWFrZUxpbmVDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3JldHVybiBCLl9kM0xpbmVGYWN0b3J5KEQpfSkpfSl9O0cucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihEKXt2YXIgQj1DLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEQpO2lmKCF0aGlzLl9hdXRvcmFuZ2VTbW9vdGh8fHRoaXMuYXV0b3JhbmdlTW9kZSgpIT09CkR8fCJ4IiE9PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYieSIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSlyZXR1cm4gQjtEPXRoaXMuX2dldEVkZ2VJbnRlcnNlY3Rpb25Qb2ludHMoKTt2YXIgST0ieSI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKT9ELmxlZnQuY29uY2F0KEQucmlnaHQpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi55fSk6RC50b3AuY29uY2F0KEQuYm90dG9tKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4ueH0pO3JldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gdC5leHRlbnQodC5tZXJnZShbTixJXSkpfSl9O0cucHJvdG90eXBlLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztpZighKHRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB1LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm57bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfTsKdmFyIEI9dGhpcy55KCkuc2NhbGUsST10aGlzLngoKS5zY2FsZSxOPXtsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119LE89SS5zY2FsZShJLmRvbWFpbigpWzBdKSxIPUkuc2NhbGUoSS5kb21haW4oKVsxXSksSz1CLnNjYWxlKEIuZG9tYWluKClbMF0pLE09Qi5zY2FsZShCLmRvbWFpbigpWzFdKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtmb3IodmFyIFE9TC5kYXRhKCksVCxYLGFhLGxhLFosYmEsZWEsY2E9MTtjYTxRLmxlbmd0aDtjYSsrKWxhPWJhfHxJLnNjYWxlKEQueCgpLmFjY2Vzc29yKFFbY2EtMV0sY2EtMSxMKSksWj1lYXx8Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihRW2NhLTFdLGNhLTEsTCkpLGJhPUkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGVhPUIuc2NhbGUoRC55KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGxhPE89PT1PPD1iYSYmKFQ9Ty1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5sZWZ0LnB1c2goe3g6TywKeTpCLmludmVydChaK1QpfSkpLGxhPEg9PT1IPD1iYSYmKFQ9SC1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5yaWdodC5wdXNoKHt4OkgseTpCLmludmVydChaK1QpfSkpLFo8TT09PU08PWVhJiYoWD1iYS1sYSxUPU0tWixhYT1lYS1aLFQ9VCpYL2FhLE4udG9wLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpNfSkpLFo8Sz09PUs8PWVhJiYoWD1iYS1sYSxUPUstWixhYT1lYS1aLFQ9VCpYL2FhLE4uYm90dG9tLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpLfSkpfSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj1mdW5jdGlvbigpe3ZhciBEPXRoaXMueSgpLnNjYWxlLmRvbWFpbigpLEI9TWF0aC5tYXgoRFswXSxEWzFdKTtEPU1hdGgubWluKERbMF0sRFsxXSk7Qj0wPkImJkJ8fDA8RCYmRHx8MDt2YXIgST10aGlzLnkoKS5zY2FsZS5zY2FsZShCKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gSX19O0cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz0KZnVuY3Rpb24oKXt2YXIgRD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0IuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpO0QucHVzaCh7YXR0clRvUHJvamVjdG9yOkIsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoQS5BbmltYXRvci5SRVNFVCl9KX1ELnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihBLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIER9O0cucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpO09iamVjdC5rZXlzKEQpLmZvckVhY2goZnVuY3Rpb24oQil7aWYoImQiIT09CkIpe3ZhciBJPURbQl07RFtCXT1mdW5jdGlvbihOLE8sSCl7cmV0dXJuIDA8Ti5sZW5ndGg/SShOWzBdLE8sSCk6bnVsbH19fSk7cmV0dXJuIER9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7RD10aGlzLmVudGl0eU5lYXJlc3RCeVhUaGVuWShEKTtyZXR1cm4gbnVsbCE9RD9bRF06W119O0cucHJvdG90eXBlLmVudGl0eU5lYXJlc3RCeVhUaGVuWT1mdW5jdGlvbihEKXt2YXIgQj1JbmZpbml0eSxJPUluZmluaXR5LE4sTz10aGlzLmJvdW5kcygpO3RoaXMuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe2lmKHguTWF0aC53aXRoaW4oSC5wb3NpdGlvbixPKSl7dmFyIEs9TWF0aC5hYnMoRC54LUgucG9zaXRpb24ueCksTT1NYXRoLmFicyhELnktSC5wb3NpdGlvbi55KTtpZihLPEJ8fEs9PT1CJiZNPEkpTj1ILEI9SyxJPU19fSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7CkQuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gRH07Ry5wcm90b3R5cGUuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3I9ZnVuY3Rpb24oRCxCKXt2YXIgST10aGlzO3JldHVybiBmdW5jdGlvbihOLE8sSCl7cmV0dXJuIEkuX2QzTGluZUZhY3RvcnkoSCxELEIpKE4pfX07Ry5wcm90b3R5cGUuX2QzTGluZUZhY3Rvcnk9ZnVuY3Rpb24oRCxCLEkpe2Z1bmN0aW9uIE4oTyxILEspe3ZhciBNPUIoTyxILEspO089SShPLEgsSyk7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKE0pJiZ4Lk1hdGguaXNWYWxpZE51bWJlcihPKX12b2lkIDA9PT1CJiYoQj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSk7dm9pZCAwPT09SSYmKEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiB0LmxpbmUoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTywKSCxEKX0pLnkoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRCl9KS5jdXJ2ZSh0aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKSkuZGVmaW5lZChmdW5jdGlvbihPLEgpe3JldHVybiBOKE8sSCxEKX0pfTtHLnByb3RvdHlwZS5fZ2V0Q3VydmVGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5jdXJ2ZSgpO3JldHVybiJzdHJpbmciPT09dHlwZW9mIEQ/KEQ9d1tEXSxudWxsPT1EP3cubGluZWFyOkQpOkR9O0cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXt2YXIgTj1JLmRhdGEoKTtpZihELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZHx8RC5fZG93bnNhbXBsaW5nRW5hYmxlZCl7dmFyIE89Ti5tYXAoZnVuY3Rpb24oSCxLKXtyZXR1cm4gS30pO0QuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkJiYoTz1ELl9maWx0ZXJDcm9wcGVkUmVuZGVyaW5nKEksTykpO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQmJgooTz1ELl9maWx0ZXJEb3duc2FtcGxpbmcoSSxPKSk7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkJiYoTz1ELl9maWx0ZXJEZW5zZUxpbmVzKEksTykpO0Iuc2V0KEksW08ubWFwKGZ1bmN0aW9uKEgpe3JldHVybiBOW0hdfSldKX1lbHNlIEIuc2V0KEksW05dKX0pO3JldHVybiBCfTtHLnByb3RvdHlwZS5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoYWEsbGEpe3JldHVybiB4Lk1hdGguaW5SYW5nZShhYSwwLE4ud2lkdGgoKSkmJnguTWF0aC5pblJhbmdlKGxhLDAsTi5oZWlnaHQoKSl9Zm9yKHZhciBOPXRoaXMsTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxIPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEs9RC5kYXRhKCksTT1bXSxMPTA7TDxCLmxlbmd0aDtMKyspe3ZhciBRPU8oS1tCW0xdXSxCW0xdLEQpLFQ9SChLW0JbTF1dLEJbTF0sRCk7UT1JKFEsVCk7aWYoIVEmJm51bGwhPUJbTC0KMV0mJm51bGwhPUtbQltMLTFdXSl7VD1PKEtbQltMLTFdXSxCW0wtMV0sRCk7dmFyIFg9SChLW0JbTC0xXV0sQltMLTFdLEQpO1E9UXx8SShULFgpfVF8fG51bGw9PUJbTCsxXXx8bnVsbD09S1tCW0wrMV1dfHwoVD1PKEtbQltMKzFdXSxCW0wrMV0sRCksWD1IKEtbQltMKzFdXSxCW0wrMV0sRCksUT1RfHxJKFQsWCkpO1EmJk0ucHVzaChCW0xdKX1yZXR1cm4gTX07Ry5wcm90b3R5cGUuX2ZpbHRlckRvd25zYW1wbGluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoZWEsY2Epe3ZhciBrYT1PKE5bQltlYV1dLEJbZWFdLEQpLFk9SChOW0JbZWFdXSxCW2VhXSxEKSxFYT1PKE5bQltlYSsxXV0sQltlYSsxXSxEKTtlYT1IKE5bQltlYSsxXV0sQltlYSsxXSxEKTtyZXR1cm4gSW5maW5pdHk9PT1jYT9NYXRoLmZsb29yKGthKT09PU1hdGguZmxvb3IoRWEpOk1hdGguZmxvb3IoZWEpPT09TWF0aC5mbG9vcihZKyhFYS1rYSkqY2EpfWlmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTtmb3IodmFyIE49CkQuZGF0YSgpLE89eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxLPVtCWzBdXSxNPTA7TTxCLmxlbmd0aC0xOyl7dmFyIEw9QltNXSxRPU8oTltCW01dXSxCW01dLEQpLFQ9SChOW0JbTV1dLEJbTV0sRCksWD1PKE5bQltNKzFdXSxCW00rMV0sRCksYWE9SChOW0JbTSsxXV0sQltNKzFdLEQpO2FhPU1hdGguZmxvb3IoUSk9PT1NYXRoLmZsb29yKFgpP0luZmluaXR5OihhYS1UKS8oWC1RKTtYPUJbTV07VD1JbmZpbml0eT09PWFhP1Q6UTtRPVg7Zm9yKHZhciBsYT1ULFo9ITA7TTxCLmxlbmd0aC0xJiYoWnx8SShNLGFhKSk7KXtNKys7Wj0hMTt2YXIgYmE9SW5maW5pdHk9PT1hYT9IKE5bQltNXV0sQltNXSxEKTpPKE5bQltNXV0sQltNXSxEKTtiYT5sYSYmKGxhPWJhLFE9QltNXSk7YmE8VCYmKFQ9YmEsWD1CW01dKX1hYT1CW01dO1ghPT1MJiZLLnB1c2goWCk7USE9PVgmJlEhPT1MJiZLLnB1c2goUSk7YWEhPT0KTCYmYWEhPT1YJiZhYSE9PVEmJksucHVzaChhYSl9cmV0dXJuIEt9O0cucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKEQsQil7aWYoMD09PUIubGVuZ3RoKXJldHVybltdO3ZhciBJPUQuZGF0YSgpLE49eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm4gdGhpcy5fYnVja2V0QnlYKEQsQixmdW5jdGlvbihIKXtyZXR1cm4gTihJW0hdLEgsRCl9LGZ1bmN0aW9uKEgpe3JldHVybiBPKElbSF0sSCxEKX0pfTtHLnByb3RvdHlwZS5fYnVja2V0QnlYPWZ1bmN0aW9uKEQsQixJLE4pe3ZhciBPPVtdO0Q9RC5kYXRhKCk7Zm9yKHZhciBIPW51bGwsSz0wO0s8PUIubGVuZ3RoOysrSyl7dmFyIE09QltLXTtpZihudWxsIT1EW01dKXt2YXIgTD1NYXRoLmZsb29yKEkoTSkpLFE9TihNKTtudWxsPT1IP0g9bmV3IHguQnVja2V0KE0sTCxRKTpILmlzSW5CdWNrZXQoTCk/SC5hZGRUb0J1Y2tldChRLApNKTooTy5wdXNoLmFwcGx5KE8sSC5nZXRVbmlxdWVJbmRpY2VzKCkpLEg9bmV3IHguQnVja2V0KE0sTCxRKSl9fW51bGwhPUgmJk8ucHVzaC5hcHBseShPLEguZ2V0VW5pcXVlSW5kaWNlcygpKTtyZXR1cm4gT307cmV0dXJuIEd9KGguWFlQbG90KTtmLkxpbmU9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMSksbD1oKDI2KSxwPWgoMCksbT1bMCwxXTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fcmFuZ2U9WzAsMV07dS5fZDNTY2FsZT10LnNjYWxlQmFuZCgpO3UuX2QzU2NhbGUucmFuZ2UobSk7CnUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbihtKTt1Ll9pbm5lclBhZGRpbmc9cS5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nKCk7dS5fb3V0ZXJQYWRkaW5nPXEuX2NvbnZlcnRUb1Bsb3R0YWJsZU91dGVyUGFkZGluZygpO3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdT0obmV3IHEpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCkpO3JldHVybiB1fTtxLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih1KXtyZXR1cm4gcC5BcnJheS51bmlxKHUpfTsKcS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9O3EucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih1KXtyZXR1cm4gbi5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyx1KX07cS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdSx4PXRoaXM7dm9pZCAwPT09dSYmKHU9dGhpcy5yYW5nZSgpKTt2YXIgQT10aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpLHk9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMF0pLHc9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMV0pO3U9dGhpcy5fZDNTY2FsZS5kb21haW4oKTt2YXIgQz11Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4geC5fZDNTY2FsZShHKStBLzJ9KTt5PXQuYmlzZWN0KEMseSk7dz10LmJpc2VjdChDLHcpO3JldHVybiB1LnNsaWNlKHksdyl9O3EucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKHUpe3JldHVybiBuLnByb3RvdHlwZS5yYW5nZS5jYWxsKHRoaXMsCnUpfTtxLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMS8uNy0xfTtxLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4uNS8uN307cS5wcm90b3R5cGUuX3NldEJhbmRzPWZ1bmN0aW9uKCl7dmFyIHU9MS0xLygxK3RoaXMuaW5uZXJQYWRkaW5nKCkpLHg9dGhpcy5vdXRlclBhZGRpbmcoKS8oMSt0aGlzLmlubmVyUGFkZGluZygpKTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdJbm5lcih1KTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcih4KX07cS5wcm90b3R5cGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpfTtxLnByb3RvdHlwZS5zdGVwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSooMSt0aGlzLmlubmVyUGFkZGluZygpKSl9O3EucHJvdG90eXBlLnRpY2tzPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtxLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5faW5uZXJQYWRkaW5nO3RoaXMuX2lubmVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vdXRlclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fb3V0ZXJQYWRkaW5nO3RoaXMuX291dGVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih1KXt1PXRoaXMuX2QzU2NhbGUodSkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodSl9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odSx4KXt2YXIgQT10aGlzOwp0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbih5KXtyZXR1cm4gQS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChsLnpvb21PdXQoeSx1LHgpKX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odSl7dmFyIHg9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbihBKXtyZXR1cm4geC5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChBK3UpfSkpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O3EucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh1KX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih1KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydCh1KX07CnEucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG19O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX07cS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odSl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih1KTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtxLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4odSk7dGhpcy5fc2V0QmFuZHMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlfTsKcS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHUpe3RoaXMuX3JhbmdlPXU7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHUpO3RoaXMuX3NldEJhbmRzKCl9O3EucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih1KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHUpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9O3JldHVybiBxfShoKDE3KS5TY2FsZSk7Zi5DYXRlZ29yeT1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh3KXt0cnl7dmFyIEM9dy5ub2RlKCkuZ2V0QkJveCgpfWNhdGNoKEcpe0M9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19cmV0dXJuIEN9ZnVuY3Rpb24gdCh3KXtpZigibnVtYmVyIj09PXR5cGVvZiB3KXJldHVybnttaW46dyxtYXg6d307aWYodyBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB3JiYibWF4ImluIHcpcmV0dXJuIHc7dGhyb3cgRXJyb3IoImlucHV0ICciK3crIicgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIFJhbmdlIik7Cn1mdW5jdGlvbiBsKHcsQyl7dz13LmdldFByb3BlcnR5VmFsdWUoQyk7cmV0dXJuIHBhcnNlRmxvYXQodyl8fDB9ZnVuY3Rpb24gcCh3KXtpZihudWxsPT13fHwibm9uZSI9PT13KXJldHVybiBudWxsO3c9dy5tYXRjaChBKTtpZihudWxsPT13fHwyPncubGVuZ3RoKXJldHVybiBudWxsO3c9d1sxXS5zcGxpdCh5KS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIHBhcnNlRmxvYXQoQyl9KTtyZXR1cm4gNiE9dy5sZW5ndGg/bnVsbDp3fXZhciBtPWgoMSksbj1NYXRoO2YuY29udGFpbnM9ZnVuY3Rpb24odyxDKXtmb3IoO251bGwhPUMmJkMhPT13OylDPUMucGFyZW50Tm9kZTtyZXR1cm4gQz09PXd9O2YuZWxlbWVudEJCb3g9aztmLmVudGl0eUJvdW5kcz1mdW5jdGlvbih3KXtyZXR1cm4gdyBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/ayhtLnNlbGVjdCh3KSk6dyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50Pyh3PXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3g6dy5sZWZ0LHk6dy50b3Asd2lkdGg6dy53aWR0aCwKaGVpZ2h0OncuaGVpZ2h0fSk6e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19O2YuU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFM9MUUzLzYwO2YucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGw9ZnVuY3Rpb24odyl7bnVsbCE9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHcpOnNldFRpbWVvdXQodyxmLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKX07Zi5lbGVtZW50V2lkdGg9ZnVuY3Rpb24odyl7dz13IGluc3RhbmNlb2YgbS5zZWxlY3Rpb24/dy5ub2RlKCk6dzt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcpO3JldHVybiBsKHcsIndpZHRoIikrbCh3LCJwYWRkaW5nLWxlZnQiKStsKHcsInBhZGRpbmctcmlnaHQiKStsKHcsImJvcmRlci1sZWZ0LXdpZHRoIikrbCh3LCJib3JkZXItcmlnaHQtd2lkdGgiKX07Zi5lbGVtZW50SGVpZ2h0PWZ1bmN0aW9uKHcpe3c9dyBpbnN0YW5jZW9mIG0uc2VsZWN0aW9uPwp3Lm5vZGUoKTp3O3c9d2luZG93LmdldENvbXB1dGVkU3R5bGUodyk7cmV0dXJuIGwodywiaGVpZ2h0IikrbCh3LCJwYWRkaW5nLXRvcCIpK2wodywicGFkZGluZy1ib3R0b20iKStsKHcsImJvcmRlci10b3Atd2lkdGgiKStsKHcsImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIHE9L3RyYW5zbGF0ZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLyx1PS9yb3RhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpXHMqXCkvLHg9L3NjYWxlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSg/Oig/Oig/OlxzKyw/XHMqKXwoPzosXHMqKSkoKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSk/XHMqXCkvO2YuZ2V0VHJhbnNsYXRlVmFsdWVzPWZ1bmN0aW9uKHcpe3c9cS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPXcpe3ZhciBDPQp3WzJdO3JldHVyblsrd1sxXSwrKHZvaWQgMD09PUM/MDpDKV19cmV0dXJuWzAsMF19O2YuZ2V0Um90YXRlPWZ1bmN0aW9uKHcpe3c9dS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT13Pyt3WzFdOjB9O2YuZ2V0U2NhbGVWYWx1ZXM9ZnVuY3Rpb24odyl7dmFyIEM9eC5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT1DPyh3PUNbMV0sQz1DWzJdLFsrdyxudWxsPT1DPyt3OitDXSk6WzAsMF19O2YuY2xpZW50UmVjdHNPdmVybGFwPWZ1bmN0aW9uKHcsQyl7cmV0dXJuIG4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLmxlZnQpfHxuLmNlaWwody5sZWZ0KT49bi5mbG9vcihDLnJpZ2h0KXx8bi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLnRvcCl8fG4uY2VpbCh3LnRvcCk+PW4uZmxvb3IoQy5ib3R0b20pPyExOiEwfTtmLmV4cGFuZFJlY3Q9ZnVuY3Rpb24odyxDKXtyZXR1cm57bGVmdDp3LmxlZnQtQyx0b3A6dy50b3AtQyxyaWdodDp3LnJpZ2h0KwpDLGJvdHRvbTp3LmJvdHRvbStDLHdpZHRoOncud2lkdGgrMipDLGhlaWdodDp3LmhlaWdodCsyKkN9fTtmLmNsaWVudFJlY3RJbnNpZGU9ZnVuY3Rpb24odyxDKXtyZXR1cm4gbi5mbG9vcihDLmxlZnQpPD1uLmNlaWwody5sZWZ0KSYmbi5mbG9vcihDLnRvcCk8PW4uY2VpbCh3LnRvcCkmJm4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLnJpZ2h0KSYmbi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLmJvdHRvbSl9O2YuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24odyxDLEcsRCl7dm9pZCAwPT09RCYmKEQ9LjUpO3c9dCh3KTtDPXQoQyk7cmV0dXJuIEcueCtHLndpZHRoPj13Lm1pbi1EJiZHLng8PXcubWF4K0QmJkcueStHLmhlaWdodD49Qy5taW4tRCYmRy55PD1DLm1heCtEfTtmLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uKHcpe2Zvcih2YXIgQz1bXTt3JiZ3IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KUMucHVzaCh3KSx3PXcucGFyZW50RWxlbWVudDtyZXR1cm4gQ307CmYuZ2V0RWxlbWVudFRyYW5zZm9ybT1mdW5jdGlvbih3KXt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcsbnVsbCk7dz13LmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei10cmFuc2Zvcm0iKXx8dy5nZXRQcm9wZXJ0eVZhbHVlKCItbXMtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW8tdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7cmV0dXJuIHAodyl9O3ZhciBBPS9ebWF0cml4XCgoW14pXSspXCkkLyx5PS9bLCBdKy99LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHUseCl7cmV0dXJuW3VbMF0qeFswXSt1WzJdKnhbMV0sdVsxXSp4WzBdK3VbM10qeFsxXSx1WzBdKnhbMl0rdVsyXSp4WzNdLHVbMV0qeFsyXSt1WzNdKnhbM10sdVswXSp4WzRdK3VbMl0qeFs1XSt1WzRdLHVbMV0qeFs0XSt1WzNdKnhbNV0rdVs1XV19ZnVuY3Rpb24gdCh1LHgpe3JldHVyblt1WzBdLAp1WzFdLHVbMl0sdVszXSx1WzBdKnhbMF0rdVsyXSp4WzFdK3VbNF0sdVsxXSp4WzBdK3VbM10qeFsxXSt1WzVdXX1mdW5jdGlvbiBsKHUpe3ZhciB4PXVbMF0qdVszXS11WzFdKnVbMl07aWYoMD09PXgpdGhyb3cgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3g9MS94O3JldHVyblt4KnVbM10seCotdVsxXSx4Ki11WzJdLHgqdVswXSx4KigtdVszXSp1WzRdK3VbMl0qdVs1XSkseCoodVsxXSp1WzRdKy11WzBdKnVbNV0pXX12YXIgcD1oKDEpLG09aCg1NSksbj1NYXRoLHE9WzEsMCwwLDEsMCwwXTtmLmluUmFuZ2U9ZnVuY3Rpb24odSx4LEEpe3JldHVybiBuLm1pbih4LEEpPD11JiZ1PD1uLm1heCh4LEEpfTtmLmNsYW1wPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gbi5taW4obi5tYXgoeCx1KSxBKX07Zi5tYXg9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2YgeD94Om51bGw7eD1udWxsPT15P3g6QTt1PW51bGw9PXk/cC5tYXgodSk6cC5tYXgodSx5KTtyZXR1cm4gdm9pZCAwIT09CnU/dTp4fTtmLm1pbj1mdW5jdGlvbih1LHgsQSl7dmFyIHk9ImZ1bmN0aW9uIj09PXR5cGVvZiB4P3g6bnVsbDt4PW51bGw9PXk/eDpBO3U9bnVsbD09eT9wLm1pbih1KTpwLm1pbih1LHkpO3JldHVybiB2b2lkIDAhPT11P3U6eH07Zi5pc05hTj1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXV9O2YuaXNWYWxpZE51bWJlcj1mdW5jdGlvbih1KXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiB1JiYxPnUtdX07Zi5yYW5nZT1mdW5jdGlvbih1LHgsQSl7dm9pZCAwPT09QSYmKEE9MSk7aWYoMD09PUEpdGhyb3cgRXJyb3IoInN0ZXAgY2Fubm90IGJlIDAiKTt4PW4ubWF4KG4uY2VpbCgoeC11KS9BKSwwKTtmb3IodmFyIHk9W10sdz0wO3c8eDsrK3cpeVt3XT11K0EqdztyZXR1cm4geX07Zi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odSx4KXtyZXR1cm4gbi5wb3coeC55LXUueSwyKStuLnBvdyh4LngtdS54LDIpfTtmLmRlZ3JlZXNUb1JhZGlhbnM9ZnVuY3Rpb24odSl7cmV0dXJuIHUvMzYwKgpuLlBJKjJ9O2Yud2l0aGluPWZ1bmN0aW9uKHUseCl7cmV0dXJuIHgudG9wTGVmdC54PD11LngmJnguYm90dG9tUmlnaHQueD49dS54JiZ4LnRvcExlZnQueTw9dS55JiZ4LmJvdHRvbVJpZ2h0Lnk+PXUueX07Zi5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uKHUseCxBLHksdyxDKXtyZXR1cm4gdTw9MCt3JiYwPD11K0EmJng8PTArQyYmMDw9eCt5fTtmLmdldEN1bXVsYXRpdmVUcmFuc2Zvcm09ZnVuY3Rpb24odSl7dT1tLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHUpO2Zvcih2YXIgeD1xLEE9bnVsbCx5PTA7eTx1Lmxlbmd0aDt5Kyspe3ZhciB3PXVbeV0sQz1tLmdldEVsZW1lbnRUcmFuc2Zvcm0odyk7aWYobnVsbCE9Qyl7dmFyIEc9dy5jbGllbnRXaWR0aC8yLEQ9dy5jbGllbnRIZWlnaHQvMjt4PXQoeCxbRyxEXSk7eD1rKHgsbChDKSk7eD10KHgsWy1HLC1EXSl9Qz13LnNjcm9sbExlZnQ7Rz13LnNjcm9sbFRvcDtpZihudWxsPT09QXx8dz09PUEpQy09dy5vZmZzZXRMZWZ0K3cuY2xpZW50TGVmdCwKRy09dy5vZmZzZXRUb3Ardy5jbGllbnRUb3AsQT13Lm9mZnNldFBhcmVudDt4PXQoeCxbQyxHXSl9cmV0dXJuIHh9O2YubXVsdGlwbHlNYXRyaXg9aztmLnByZW11bHRpcGx5VHJhbnNsYXRlPWZ1bmN0aW9uKHUseCl7cmV0dXJuW3hbMF0seFsxXSx4WzJdLHhbM10seFs0XSt1WzBdLHhbNV0rdVsxXV19O2YubXVsdGlwbHlUcmFuc2xhdGU9dDtmLmludmVydE1hdHJpeD1sO2YuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odSx4KXtyZXR1cm57eDp1WzBdKngueCt1WzJdKngueSt1WzRdLHk6dVsxXSp4LngrdVszXSp4LnkrdVs1XX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9bmV3IChoKDExNCkuU3BsaXRTdHJhdGVneUxpbmVhcik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT01KTt2b2lkIDA9PT1uJiYobj1rKTt0aGlzLm1heE5vZGVDaGlsZHJlbj1tO3RoaXMuc3BsaXRTdHJhdGVneT1uO3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9cC5wcm90b3R5cGUuZ2V0Um9vdD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fTtwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtLG4pe2Zvcih2YXIgcT10aGlzLnJvb3Q7IXEubGVhZjspcT1xLnN1YnRyZWUobSk7bT10LnZhbHVlTm9kZShtLG4pO3EuaW5zZXJ0KG0pO2Zvcih0aGlzLnNpemUrPTE7cS5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbik7KXE9cS5zcGxpdCh0aGlzLnNwbGl0U3RyYXRlZ3kpLG51bGw9PXEucGFyZW50JiYodGhpcy5yb290PXEpfTtwLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMucXVlcnkoZnVuY3Rpb24obil7cmV0dXJuIG4uY29udGFpbnMobSl9KX07cC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhuLG0pfSl9O3AucHJvdG90eXBlLmludGVyc2VjdFg9CmZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFgobixtKX0pfTtwLnByb3RvdHlwZS5pbnRlcnNlY3RZPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFkobixtKX0pfTtwLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihtKXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiYhbSh0aGlzLnJvb3QuYm91bmRzKSlyZXR1cm4gbjtmb3IodmFyIHE9W3RoaXMucm9vdF07MDxxLmxlbmd0aDspZm9yKHZhciB1PXEuc2hpZnQoKSx4PTA7eDx1LmVudHJpZXMubGVuZ3RoO3grKyl7dmFyIEE9dS5lbnRyaWVzW3hdO20oQS5ib3VuZHMpJiYodS5sZWFmP24ucHVzaChBLnZhbHVlKTpxLnB1c2goQSkpfXJldHVybiBufTtyZXR1cm4gcH0oKTtmLlJUcmVlPWQ7dmFyIHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKG0pe3RoaXMubGVhZj1tO3RoaXMuYm91bmRzPQpudWxsO3RoaXMuZW50cmllcz1bXTt0aGlzLnZhbHVlPXRoaXMucGFyZW50PW51bGx9cC52YWx1ZU5vZGU9ZnVuY3Rpb24obSxuKXt2YXIgcT1uZXcgcCghMCk7cS5ib3VuZHM9bTtxLnZhbHVlPW47cmV0dXJuIHF9O3AucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPm19O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtKXt0aGlzLmVudHJpZXMucHVzaChtKTttLnBhcmVudD10aGlzO2Zvcih2YXIgbj10aGlzO251bGwhPW47KW4uYm91bmRzPWwudW5pb25BbGwoW24uYm91bmRzLG0uYm91bmRzXSksbj1uLnBhcmVudH07cC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5lbnRyaWVzLmluZGV4T2YobSk7aWYoMDw9bSlmb3IodGhpcy5lbnRyaWVzLnNwbGljZShtLDEpLG09dGhpcztudWxsIT1tOyltLmJvdW5kcz1sLnVuaW9uQWxsKG0uZW50cmllcy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uYm91bmRzfSkpLAptPW0ucGFyZW50O3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zdWJ0cmVlPWZ1bmN0aW9uKG0pe2Zvcih2YXIgbj1udWxsLHE9MDtxPHRoaXMuZW50cmllcy5sZW5ndGg7cSsrKXt2YXIgdT10aGlzLmVudHJpZXNbcV0seD11LnVuaW9uQXJlYURpZmZlcmVuY2UobSk7aWYoSW5maW5pdHk+eHx8SW5maW5pdHk9PT14JiZudWxsIT1uJiZ1LmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpbj11fXJldHVybiBufTtwLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihtKXtudWxsIT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO3ZhciBuPVtuZXcgcCh0aGlzLmxlYWYpLG5ldyBwKHRoaXMubGVhZildO20uc3BsaXQodGhpcy5lbnRyaWVzLG4pO209bnVsbCE9dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQ6bmV3IHAoITEpO20uaW5zZXJ0KG5bMF0pO20uaW5zZXJ0KG5bMV0pO3JldHVybiBtfTtwLnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmFicyhsLnVuaW9uKHRoaXMuYm91bmRzLAptKS5hcmVhKCktdGhpcy5ib3VuZHMuYXJlYSgpKX07cC5wcm90b3R5cGUubWF4RGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFmPzE6MSt0aGlzLmVudHJpZXMubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtLm1heERlcHRoKCl9KS5yZWR1Y2UoZnVuY3Rpb24obSxuKXtyZXR1cm4gTWF0aC5tYXgobSxuKX0pfTtyZXR1cm4gcH0oKTtmLlJUcmVlTm9kZT10O3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChtLG4scSx1KXt0aGlzLnhsPW07dGhpcy55bD1uO3RoaXMueGg9cTt0aGlzLnloPXU7dGhpcy53aWR0aD10aGlzLnhoLXRoaXMueGw7dGhpcy5oZWlnaHQ9dGhpcy55aC10aGlzLnlsfXAueHl3aD1mdW5jdGlvbihtLG4scSx1KXtyZXR1cm4gbmV3IHAobSxuLG0rcSxuK3UpfTtwLmVudGl0eUJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IHAobS54LG0ueSxtLngrbS53aWR0aCxtLnkrbS5oZWlnaHQpfTtwLmJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gcC5wb2ludFBhaXIobS50b3BMZWZ0LAptLmJvdHRvbVJpZ2h0KX07cC5wb2ludFBhaXI9ZnVuY3Rpb24obSxuKXtyZXR1cm4gbmV3IHAoTWF0aC5taW4obS54LG4ueCksTWF0aC5taW4obS55LG4ueSksTWF0aC5tYXgobS54LG4ueCksTWF0aC5tYXgobS55LG4ueSkpfTtwLnBvaW50cz1mdW5jdGlvbihtKXtpZigyPm0ubGVuZ3RoKXRocm93IEVycm9yKCJuZWVkIGF0IGxlYXN0IDIgcG9pbnRzIHRvIGNyZWF0ZSBib3VuZHMiKTt2YXIgbj1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS54fSk7bT1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS55fSk7cmV0dXJuIG5ldyBwKG4ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWluKHEsdSl9KSxtLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1pbihxLHUpfSksbi5yZWR1Y2UoZnVuY3Rpb24ocSx1KXtyZXR1cm4gTWF0aC5tYXgocSx1KX0pLG0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdSl9KSl9O3AudW5pb249ZnVuY3Rpb24obSwKbil7cmV0dXJuIG5ldyBwKE1hdGgubWluKG0ueGwsbi54bCksTWF0aC5taW4obS55bCxuLnlsKSxNYXRoLm1heChtLnhoLG4ueGgpLE1hdGgubWF4KG0ueWgsbi55aCkpfTtwLnVuaW9uQWxsPWZ1bmN0aW9uKG0pe209bS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW59KTtyZXR1cm4gMD09PW0ubGVuZ3RoP251bGw6bS5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gcC51bmlvbihuLHEpfSl9O3AuaXNCb3VuZHNPdmVybGFwQm91bmRzPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaXNCb3VuZHNPdmVybGFwWChtLG4pJiZwLmlzQm91bmRzT3ZlcmxhcFkobSxuKX07cC5pc0JvdW5kc092ZXJsYXBYPWZ1bmN0aW9uKG0sbil7cmV0dXJuIShtLnhoPG4ueGwpJiYhKG0ueGw+bi54aCl9O3AuaXNCb3VuZHNPdmVybGFwWT1mdW5jdGlvbihtLG4pe3JldHVybiEobS55aDxuLnlsKSYmIShtLnlsPm4ueWgpfTtwLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5hcmVhQ2FjaGVkJiYKKHRoaXMuYXJlYUNhY2hlZD0odGhpcy54aC10aGlzLnhsKSoodGhpcy55aC10aGlzLnlsKSk7cmV0dXJuIHRoaXMuYXJlYUNhY2hlZH07cC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMueGw8PW0ueCYmdGhpcy54aD49bS54JiZ0aGlzLnlsPD1tLnkmJnRoaXMueWg+PW0ueX07cmV0dXJuIHB9KCk7Zi5SVHJlZUJvdW5kcz1sfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuU2V0P3RoaXMuX2VzNlNldD1uZXcgd2luZG93LlNldDp0aGlzLl92YWx1ZXM9W107dGhpcy5zaXplPTB9aC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNlNldClyZXR1cm4gdGhpcy5fZXM2U2V0LmFkZChrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpczt0aGlzLmhhcyhrKXx8KHRoaXMuX3ZhbHVlcy5wdXNoKGspLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoKTsKcmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIGs9dGhpcy5fZXM2U2V0LmRlbGV0ZShrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsaztrPXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspO3JldHVybi0xIT09az8odGhpcy5fdmFsdWVzLnNwbGljZShrLDEpLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoLCEwKTohMX07aC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe3JldHVybiBudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmhhcyhrKTotMSE9PXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspfTtoLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGssdCl7dmFyIGw9dGhpcztudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmZvckVhY2goZnVuY3Rpb24ocCxtKXtyZXR1cm4gay5jYWxsKHQscCxtLGwpfSx0KTp0aGlzLl92YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihwKXtrLmNhbGwodCwKcCxwLGwpfSl9O3JldHVybiBofSgpO2YuU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzEpKTtrKGgoMTMwKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDIxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO3EuY2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKHAsbCk7cC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGU9CmZ1bmN0aW9uKG0pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmNhY2hlLmdldChtKX07cC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmNsZWFyKCl9O3JldHVybiBwfShoKDYxKS5DaGFyYWN0ZXJNZWFzdXJlcik7Zi5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwKdGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24ocCl7cmV0dXJuIHQucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMscCl9O2wucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbihwKXt2YXIgbT10aGlzO3A9cC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBtLl9tZWFzdXJlQ2hhcmFjdGVyKG4pfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihuLHEpe3JldHVybiBNYXRoLm1heChuLHEuaGVpZ2h0KX0sMCksd2lkdGg6cC5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gbitxLndpZHRofSwwKX19O3JldHVybiBsfShoKDYzKS5NZWFzdXJlcik7Zi5DaGFyYWN0ZXJNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoMzYpKTtrKGgoNjApKTtrKGgoMTMyKSk7ayhoKDYxKSk7ayhoKDYzKSl9LApmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgzNik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09biYmKG49ITEpO209bC5jYWxsKHRoaXMsbSl8fHRoaXM7bS51c2VHdWFyZHM9bjtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuX2FkZEd1YXJkcz1mdW5jdGlvbihtKXtyZXR1cm4gdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUK20rdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfTtwLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obSl7dmFyIG47dm9pZCAwPT09biYmKG49ITEpO249dGhpcy51c2VHdWFyZHN8fApufHwvXltcdCBdJC8udGVzdChtKTttPWwucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4/dGhpcy5fYWRkR3VhcmRzKG0pOm0pO20ud2lkdGgtPW4/Mip0aGlzLmdldEd1YXJkV2lkdGgoKTowO3JldHVybiBtfTtwLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7dm9pZCAwPT09bSYmKG09dC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUKTtpZigiIj09PW0udHJpbSgpKXJldHVybnt3aWR0aDowLGhlaWdodDowfTttPW0udHJpbSgpLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUxpbmUocSl9KTtyZXR1cm57aGVpZ2h0Om0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIHErdS5oZWlnaHR9LDApLHdpZHRoOm0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdS53aWR0aCl9LDApfX07cC5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe251bGw9PXRoaXMuZ3VhcmRXaWR0aCYmCih0aGlzLmd1YXJkV2lkdGg9bC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKTtyZXR1cm4gdGhpcy5ndWFyZFdpZHRofTtyZXR1cm4gcH0odC5BYnN0cmFjdE1lYXN1cmVyKTtmLk1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzgpKTtrKGgoNjUpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMjEpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXhMaW5lcyhJbmZpbml0eSk7dGhpcy50ZXh0VHJpbW1pbmcoKTt0aGlzLmFsbG93QnJlYWtpbmdXb3JkcygpO3RoaXMuX3Rva2VuaXplcj1uZXcgay5Ub2tlbml6ZXI7dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI9Ii0ifXQucHJvdG90eXBlLm1heExpbmVzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX21heExpbmVzO3RoaXMuX21heExpbmVzPWw7cmV0dXJuIHRoaXN9Owp0LnByb3RvdHlwZS50ZXh0VHJpbW1pbmc9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0VHJpbW1pbmc9ImVsbGlwc2lzIn07dC5wcm90b3R5cGUuYWxsb3dCcmVha2luZ1dvcmRzPWZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzPSEwfTt0LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPXRoaXM7dm9pZCAwPT09biYmKG49SW5maW5pdHkpO3ZhciB1PXtub0Jyb2tlV29yZHM6MCxub0xpbmVzOjAsb3JpZ2luYWxUZXh0OmwsdHJ1bmNhdGVkVGV4dDoiIix3cmFwcGVkVGV4dDoiIn07bT17YXZhaWxhYmxlTGluZXM6TWF0aC5taW4oTWF0aC5mbG9vcihuL3AubWVhc3VyZSgpLmhlaWdodCksdGhpcy5fbWF4TGluZXMpLGF2YWlsYWJsZVdpZHRoOm0sY2FuRml0VGV4dDohMCxjdXJyZW50TGluZToiIix3cmFwcGluZzp1fTt2YXIgeD1sLnNwbGl0KCJcbiIpO3JldHVybiB4LnJlZHVjZShmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuYnJlYWtMaW5lVG9GaXRXaWR0aChBLAp5LHchPT14Lmxlbmd0aC0xLHApfSxtKS53cmFwcGluZ307dC5wcm90b3R5cGUuYnJlYWtMaW5lVG9GaXRXaWR0aD1mdW5jdGlvbihsLHAsbSxuKXt2YXIgcT10aGlzO2wuY2FuRml0VGV4dHx8IiI9PT1sLndyYXBwaW5nLnRydW5jYXRlZFRleHR8fChsLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPSJcbiIpO2w9dGhpcy5fdG9rZW5pemVyLnRva2VuaXplKHApLnJlZHVjZShmdW5jdGlvbih1LHgpe3JldHVybiBxLndyYXBOZXh0VG9rZW4oeCx1LG4pfSxsKTtwPWsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuY3VycmVudExpbmUpO2wud3JhcHBpbmcubm9MaW5lcys9KygiIiE9PXApO2wud3JhcHBpbmcubm9MaW5lcz09PWwuYXZhaWxhYmxlTGluZXMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZyYmbT9sLmNhbkZpdFRleHQ9ITE6bC53cmFwcGluZy53cmFwcGVkVGV4dCs9cDtsLmN1cnJlbnRMaW5lPSJcbiI7cmV0dXJuIGx9O3QucHJvdG90eXBlLmNhbkZpdFRva2VuPWZ1bmN0aW9uKGwsCnAsbSl7dmFyIG49dGhpcyxxPXRoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz9sLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24odSx4KXtyZXR1cm4geCE9PWwubGVuZ3RoLTE/dStuLl9icmVha2luZ0NoYXJhY3Rlcjp1fSk6W2xdO3JldHVybiBtLm1lYXN1cmUobCkud2lkdGg8PXB8fHEuZXZlcnkoZnVuY3Rpb24odSl7cmV0dXJuIG0ubWVhc3VyZSh1KS53aWR0aDw9cH0pfTt0LnByb3RvdHlwZS5hZGRFbGxpcHNpcz1mdW5jdGlvbihsLHAsbSl7aWYoIm5vbmUiPT09dGhpcy5fdGV4dFRyaW1taW5nKXJldHVybntyZW1haW5pbmdUb2tlbjoiIix3cmFwcGVkVG9rZW46bH07dmFyIG49bC5zdWJzdHJpbmcoMCkudHJpbSgpLHE9bS5tZWFzdXJlKG4pLndpZHRoLHU9bS5tZWFzdXJlKCIuLi4iKS53aWR0aCx4PTA8bC5sZW5ndGgmJiJcbiI9PT1sWzBdPyJcbiI6IiI7aWYocDw9dSlyZXR1cm57cmVtYWluaW5nVG9rZW46bCx3cmFwcGVkVG9rZW46eCsiLi4uIi5zdWJzdHIoMCxNYXRoLmZsb29yKHAvCih1LzMpKSl9O2Zvcig7cSt1PnA7KW49ay5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5zdWJzdHIoMCxuLmxlbmd0aC0xKSkscT1tLm1lYXN1cmUobikud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuc3Vic3RyaW5nKG4ubGVuZ3RoKSwiLSIpLnRyaW0oKSx3cmFwcGVkVG9rZW46eCtuKyIuLi4ifX07dC5wcm90b3R5cGUud3JhcE5leHRUb2tlbj1mdW5jdGlvbihsLHAsbSl7aWYoIXAuY2FuRml0VGV4dHx8cC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lc3x8IXRoaXMuY2FuRml0VG9rZW4obCxwLmF2YWlsYWJsZVdpZHRoLG0pKXJldHVybiB0aGlzLmZpbmlzaFdyYXBwaW5nKGwscCxtKTtmb3IoO2w7KXt2YXIgbj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgobCxwLmN1cnJlbnRMaW5lLHAuYXZhaWxhYmxlV2lkdGgsbSk7cC5jdXJyZW50TGluZT1uLmxpbmU7bD1uLnJlbWFpbmluZ1Rva2VuO2lmKG51bGwhPWwpaWYocC53cmFwcGluZy5ub0Jyb2tlV29yZHMrPQorbi5icmVha1dvcmQsKytwLndyYXBwaW5nLm5vTGluZXMscC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lcyl7bT10aGlzLmFkZEVsbGlwc2lzKHAuY3VycmVudExpbmUscC5hdmFpbGFibGVXaWR0aCxtKTtwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1tLndyYXBwZWRUb2tlbjtwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPW0ucmVtYWluaW5nVG9rZW4rbDtwLmN1cnJlbnRMaW5lPSJcbiI7YnJlYWt9ZWxzZSBwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1rLlN0cmluZ01ldGhvZHMudHJpbUVuZChwLmN1cnJlbnRMaW5lKSxwLmN1cnJlbnRMaW5lPSJcbiJ9cmV0dXJuIHB9O3QucHJvdG90eXBlLmZpbmlzaFdyYXBwaW5nPWZ1bmN0aW9uKGwscCxtKXtwLmNhbkZpdFRleHQmJnAuYXZhaWxhYmxlTGluZXMhPT1wLndyYXBwaW5nLm5vTGluZXMmJnRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nPyhtPXRoaXMuYWRkRWxsaXBzaXMocC5jdXJyZW50TGluZSsKbCxwLmF2YWlsYWJsZVdpZHRoLG0pLHAud3JhcHBpbmcud3JhcHBlZFRleHQrPW0ud3JhcHBlZFRva2VuLHAud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9bS5yZW1haW5pbmdUb2tlbixwLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhtLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDxsLmxlbmd0aCkscC53cmFwcGluZy5ub0xpbmVzKz0rKDA8bS53cmFwcGVkVG9rZW4ubGVuZ3RoKSxwLmN1cnJlbnRMaW5lPSIiKTpwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPWw7cC5jYW5GaXRUZXh0PSExO3JldHVybiBwfTt0LnByb3RvdHlwZS5icmVha1Rva2VuVG9GaXRJbldpZHRoPWZ1bmN0aW9uKGwscCxtLG4pe2lmKHZvaWQgMD09PXEpdmFyIHE9dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI7aWYobi5tZWFzdXJlKHArbCkud2lkdGg8PW0pcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOnArbCxyZW1haW5pbmdUb2tlbjpudWxsfTtpZigiIj09PWwudHJpbSgpKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpwLApyZW1haW5pbmdUb2tlbjoiIn07aWYoIXRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcylyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6cCxyZW1haW5pbmdUb2tlbjpsfTtmb3IodmFyIHU9MDt1PGwubGVuZ3RoOylpZihuLm1lYXN1cmUocCtsLnN1YnN0cmluZygwLHUrMSkrcSkud2lkdGg8PW0pKyt1O2Vsc2UgYnJlYWs7bT0iIjswPHUmJihtPXEpO3JldHVybnticmVha1dvcmQ6MDx1LGxpbmU6cCtsLnN1YnN0cmluZygwLHUpK20scmVtYWluaW5nVG9rZW46bC5zdWJzdHJpbmcodSl9fTtyZXR1cm4gdH0oKTtmLldyYXBwZXI9ZH0sZnVuY3Rpb24oZCxmLGgpeyhmdW5jdGlvbihrKXtmb3IodmFyIHQgaW4gaylmLmhhc093blByb3BlcnR5KHQpfHwoZlt0XT1rW3RdKX0pKGgoMTM5KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCg3MikpO2soaCg3MykpO2soaCgyOCkpfSxmdW5jdGlvbihkLApmKXtmLnZlcnNpb249IjMuNy4wIn0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodyxDKXtyZXR1cm4gdy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEc9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB0KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24gbCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcyksSTtmb3IoSSBpbiBEKUIuc3R5bGUoSSxEW0ldLEcpfSl9ZnVuY3Rpb24gcCh3LEMsRyl7Zm9yKHZhciBEIGluIEMpdy5zdHlsZShELENbRF0sRyk7cmV0dXJuIHd9ZnVuY3Rpb24gbSh3LEMpe3JldHVybiB3LmVhY2goZnVuY3Rpb24oKXt2YXIgRz1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLEI7Zm9yKEIgaW4gRylELnByb3BlcnR5KEIsCkdbQl0pfSl9ZnVuY3Rpb24gbih3LEMpe2Zvcih2YXIgRyBpbiBDKXcucHJvcGVydHkoRyxDW0ddKTtyZXR1cm4gd31mdW5jdGlvbiBxKHcsQyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBHPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB1KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24geCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxJO2ZvcihJIGluIEQpQi5zdHlsZShJLERbSV0sRyl9KX1mdW5jdGlvbiBBKHcsQyxHKXtmb3IodmFyIEQgaW4gQyl3LnN0eWxlKEQsQ1tEXSxHKTtyZXR1cm4gd312YXIgeT1kPWgoMSk7eS5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09CnR5cGVvZiB3P2s6dCkodGhpcyx3KX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih3KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB3P2w6cCkodGhpcyx3LCIiKX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnByb3BlcnRpZXM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9tOm4pKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9xOnUpKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuc3R5bGVzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHc/eDpBKSh0aGlzLHcsIiIpfX0sZnVuY3Rpb24oZCxmLGgpe2Q9aCgxMTcpO3ZhciBrPWgoMTIpO2g9aCgxMCk7dmFyIHQ9e2xpbmVhcjpkLmVhc2VMaW5lYXIscXVhZDpkLmVhc2VRdWFkLHF1YWRJbjpkLmVhc2VRdWFkSW4scXVhZE91dDpkLmVhc2VRdWFkT3V0LApxdWFkSW5PdXQ6ZC5lYXNlUXVhZEluT3V0LGN1YmljOmQuZWFzZUN1YmljLGN1YmljSW46ZC5lYXNlQ3ViaWNJbixjdWJpY091dDpkLmVhc2VDdWJpY091dCxjdWJpY0luT3V0OmQuZWFzZUN1YmljSW5PdXQscG9seTpkLmVhc2VQb2x5LHBvbHlJbjpkLmVhc2VQb2x5SW4scG9seU91dDpkLmVhc2VQb2x5T3V0LHBvbHlJbk91dDpkLmVhc2VQb2x5SW5PdXQsc2luOmQuZWFzZVNpbixzaW5JbjpkLmVhc2VTaW5JbixzaW5PdXQ6ZC5lYXNlU2luT3V0LHNpbkluT3V0OmQuZWFzZVNpbkluT3V0LGV4cDpkLmVhc2VFeHAsZXhwSW46ZC5lYXNlRXhwSW4sZXhwT3V0OmQuZWFzZUV4cE91dCxleHBJbk91dDpkLmVhc2VFeHBJbk91dCxjaXJjbGU6ZC5lYXNlQ2lyY2xlLGNpcmNsZUluOmQuZWFzZUNpcmNsZUluLGNpcmNsZU91dDpkLmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6ZC5lYXNlQ2lyY2xlSW5PdXQsYm91bmNlOmQuZWFzZUJvdW5jZSxib3VuY2VJbjpkLmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6ZC5lYXNlQm91bmNlT3V0LApib3VuY2VJbk91dDpkLmVhc2VCb3VuY2VJbk91dCxiYWNrOmQuZWFzZUJhY2ssYmFja0luOmQuZWFzZUJhY2tJbixiYWNrT3V0OmQuZWFzZUJhY2tPdXQsYmFja0luT3V0OmQuZWFzZUJhY2tJbk91dCxlbGFzdGljOmQuZWFzZUVsYXN0aWMsZWxhc3RpY0luOmQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OmQuZWFzZUVsYXN0aWNPdXQsZWxhc3RpY0luT3V0OmQuZWFzZUVsYXN0aWNJbk91dH07Zi5FYXNlTmFtZT1oLm1ha2VFbnVtKCJsaW5lYXIgcXVhZCBxdWFkSW4gcXVhZE91dCBxdWFkSW5PdXQgY3ViaWMgY3ViaWNJbiBjdWJpY091dCBjdWJpY0luT3V0IHBvbHkgcG9seUluIHBvbHlPdXQgcG9seUluT3V0IHNpbiBzaW5JbiBzaW5PdXQgc2luSW5PdXQgZXhwIGV4cEluIGV4cE91dCBleHBJbk91dCBjaXJjbGUgY2lyY2xlSW4gY2lyY2xlT3V0IGNpcmNsZUluT3V0IGJvdW5jZSBib3VuY2VJbiBib3VuY2VPdXQgYm91bmNlSW5PdXQgYmFjayBiYWNrSW4gYmFja091dCBiYWNrSW5PdXQgZWxhc3RpYyBlbGFzdGljSW4gZWxhc3RpY091dCBlbGFzdGljSW5PdXQiLnNwbGl0KCIgIikpOwpoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX3N0YXJ0RGVsYXk9bC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcER1cmF0aW9uPWwuX0RFRkFVTFRfU1RFUF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcERlbGF5PWwuX0RFRkFVTFRfSVRFUkFUSVZFX0RFTEFZX01JTExJU0VDT05EUzt0aGlzLl9tYXhUb3RhbER1cmF0aW9uPWwuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUzt0aGlzLl9lYXNpbmdNb2RlPWwuX0RFRkFVTFRfRUFTSU5HX01PREV9bC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK20qTWF0aC5tYXgocC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9O2wucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3A9ay5jb2VyY2VFeHRlcm5hbEQzKHApOwp2YXIgcT1wLnNpemUoKSx1PXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocSk7cmV0dXJuIHAudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoZnVuY3Rpb24oeCxBKXtyZXR1cm4gbi5zdGFydERlbGF5KCkrdSpBfSkuYXR0cnMobSl9O2wucHJvdG90eXBlLnN0YXJ0RGVsYXk9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fc3RhcnREZWxheTt0aGlzLl9zdGFydERlbGF5PXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiBNYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik7dGhpcy5fc3RlcER1cmF0aW9uPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwRGVsYXl9O2wucHJvdG90eXBlLm1heFRvdGFsRHVyYXRpb249CmZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX21heFRvdGFsRHVyYXRpb247dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5lYXNpbmdNb2RlPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2Vhc2luZ01vZGU7dGhpcy5fZWFzaW5nTW9kZT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLmVhc2luZ01vZGUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBwPyhwPXRbcF0sbnVsbD09cD90LmxpbmVhcjpwKTpwfTtsLnByb3RvdHlwZS5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheT1mdW5jdGlvbihwKXt2YXIgbT10aGlzLm1heFRvdGFsRHVyYXRpb24oKS10aGlzLnN0ZXBEdXJhdGlvbigpO209TWF0aC5tYXgobSwwKTtwPW0vTWF0aC5tYXgocC0xLDEpO3JldHVybiBNYXRoLm1pbih0aGlzLnN0ZXBEZWxheSgpLHApfTtyZXR1cm4gbH0oKTtoLl9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUz0KMDtoLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTPTMwMDtoLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM9MTU7aC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTPUluZmluaXR5O2guX0RFRkFVTFRfRUFTSU5HX01PREU9ImV4cE91dCI7Zi5FYXNpbmc9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMTIpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXQucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbigpe3JldHVybiAwfTt0LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGwscCl7bD1rLmNvZXJjZUV4dGVybmFsRDMobCk7cmV0dXJuIGwuYXR0cnMocCl9O3JldHVybiB0fSgpO2YuTnVsbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24geCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYKKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDUpLHA9aCg0KSxtPWgoMCksbj1oKDIyKTtkPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCxBKXt2b2lkIDA9PT1BJiYoQT0iYm90dG9tIik7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbEFuZ2xlPTA7eC5fdGlja0xhYmVsU2hlYXJBbmdsZT0wO3guYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKTtyZXR1cm4geH1rKHUscSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB4PW5ldyBsLldyYXBwZXI7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJngubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpO3JldHVybiB4fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LnByb3RvdHlwZSwKIl93cml0ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLl90eXBlc2V0dGVyQ29udGV4dCl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVkcmF3KCl9O3UucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHgsQSl7dmFyIHk9dGhpcy5pc0hvcml6b250YWwoKT8wOnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKSx3PXRoaXMuaXNIb3Jpem9udGFsKCk/CnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBDPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT93Kz1DOnkrPUN9eD10aGlzLl9tZWFzdXJlVGlja0xhYmVscyh4LEEpO3JldHVybnttaW5XaWR0aDp4LnVzZWRXaWR0aCt5LG1pbkhlaWdodDp4LnVzZWRIZWlnaHQrd319O3UucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksQT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMucmVxdWVzdGVkU3BhY2UodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpLm1pbkhlaWdodDp0aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSwKdGhpcy5oZWlnaHQoKSkubWluV2lkdGgseT10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKEEteSx4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn07dS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24oeCxBKXtyZXR1cm4gcC5Db21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx4LEEpfTt1LnByb3RvdHlwZS5nZXREb3duc2FtcGxlSW5mbz1mdW5jdGlvbih4KXt2YXIgQTt2b2lkIDA9PT14JiYoeD10aGlzLl9zY2FsZSk7dm9pZCAwPT09QSYmKEE9eC5pbnZlcnRSYW5nZSgpKTt2YXIgeT1NYXRoLmNlaWwodS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFgqKDA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT8xOjEvTWF0aC5jb3ModGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZS8xODAqTWF0aC5QSSkpLwp4LnN0ZXBXaWR0aCgpKTtyZXR1cm57ZG9tYWluOkEuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIDA9PT1DJXl9KSxzdGVwV2lkdGg6eSp4LnN0ZXBXaWR0aCgpfX07dS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7dGhyb3cgRXJyb3IoIkFuZ2xlIHVuZGVmaW5lZCBub3Qgc3VwcG9ydGVkOyBvbmx5IDAsIDkwLCBhbmQgLTkwIGFyZSB2YWxpZCB2YWx1ZXMiKTt9O3UucHJvdG90eXBlLnRpY2tMYWJlbFNoZWFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZX07dS5wcm90b3R5cGUudGlja0xhYmVsTWF4V2lkdGg9ZnVuY3Rpb24oeCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoO3RoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9CmZ1bmN0aW9uKHgpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhMaW5lczt0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX07dS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih4LEEpe3ZhciB5PXRoaXM7c3dpdGNoKHRoaXMudGlja0xhYmVsQW5nbGUoKSl7Y2FzZSAwOnZhciB3PXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9O3ZhciBDPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoiYm90dG9tIixib3R0b206InRvcCJ9O2JyZWFrO2Nhc2UgOTA6dz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6InJpZ2h0Iixib3R0b206ImxlZnQifTsKQz17bGVmdDoidG9wIixyaWdodDoiYm90dG9tIix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTticmVhaztjYXNlIC05MDp3PXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LEM9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19QS5lYWNoKGZ1bmN0aW9uKEcpe3ZhciBEPXQuc2VsZWN0KHRoaXMpLEI9eS5pc0hvcml6b250YWwoKT94Onkud2lkdGgoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpLEk9eS5pc0hvcml6b250YWwoKT95LmhlaWdodCgpLXkuX3RpY2tTcGFjZVJlcXVpcmVkKCk6eCxOPXt4QWxpZ246d1t5Lm9yaWVudGF0aW9uKCldLHlBbGlnbjpDW3kub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnkudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6eS50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXkuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT0KeS5vcmllbnRhdGlvbigpJiZCPnkuX3RpY2tMYWJlbE1heFdpZHRoKXt2YXIgTz1CLXkuX3RpY2tMYWJlbE1heFdpZHRoO089RC5hdHRyKCJ0cmFuc2Zvcm0iKSsiIHRyYW5zbGF0ZSgiK08rIiwgMCkiO0QuYXR0cigidHJhbnNmb3JtIixPKX1CPU1hdGgubWluKEIseS5fdGlja0xhYmVsTWF4V2lkdGgpfXkuX3dyaXRlci53cml0ZSh5LmZvcm1hdHRlcigpKEcpLEIsSSxOLEQubm9kZSgpKX0pfTt1LnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24oeCxBKXt2YXIgeT10aGlzLHc9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT94OkFdKSxDPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8odyk7dz1DLmRvbWFpbjtDPUMuc3RlcFdpZHRoO3ZhciBHPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRz1DLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEc9QS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSwKRz1NYXRoLm1heChHLDApKTt2YXIgRD1DO3RoaXMuaXNIb3Jpem9udGFsKCkmJihEPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSwwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihEPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksRD1NYXRoLm1heChELDApKTtudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEc9TWF0aC5taW4oRyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO0E9dy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIHkuX3dyYXBwZXIud3JhcCh5LmZvcm1hdHRlcigpKEIpLHkuX21lYXN1cmVyLEcsRCl9KTt4PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT90LnN1bTptLk1hdGgubWF4O3c9dGhpcy5pc0hvcml6b250YWwoKSYmMD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlP20uTWF0aC5tYXg6dC5zdW07eD14KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkud2lkdGh9LDApOwpBPXcoQSxmdW5jdGlvbihCKXtyZXR1cm4geS5fbWVhc3VyZXIubWVhc3VyZShCLndyYXBwZWRUZXh0KS5oZWlnaHR9LDApOzAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEE9W0EseF0seD1BWzBdLEE9QVsxXSk7cmV0dXJue3VzZWRXaWR0aDp4LHVzZWRIZWlnaHQ6QX19O3UucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHg9dGhpcztxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBBPXRoaXMuX3NjYWxlLHk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhBKSx3PXkuZG9tYWluLEM9eT15LnN0ZXBXaWR0aDt0aGlzLmlzSG9yaXpvbnRhbCgpJiZudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEM9TWF0aC5taW4oQyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO3c9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEodyk7dmFyIEc9dy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZSh3KTt3LmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oRCl7dmFyIEI9QS5zY2FsZShEKS1DLzI7RD14LmlzSG9yaXpvbnRhbCgpP0I6MDtCPXguaXNIb3Jpem9udGFsKCk/MDpCO3JldHVybiJ0cmFuc2xhdGUoIitEKyIsIitCKyIpIn0pO0cudGV4dCgiIik7dGhpcy5fZHJhd1RpY2tzKHksRyk7eT0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt3PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIreSsiLCIrdysiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLl9zaG93QWxsVGlja0xhYmVscygpO3RoaXMuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWwoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24oeCxBLHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHgsQSx5KTt0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB1fShuLkF4aXMpO2QuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYPTE1O2YuQ2F0ZWdvcnk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSwKdD1oKDEpLGw9aCg1KSxwPWgoOCksbT1oKDApLG49aCgyMik7ZD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHgsQSl7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbFBvc2l0aW9uaW5nPSJjZW50ZXIiO3guX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSExO3guZm9ybWF0dGVyKHAuZ2VuZXJhbCgpKTtyZXR1cm4geH1rKHUscSk7dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHg9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLG4uQXhpcy5USUNLX0xBQkVMX0NMQVNTKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHgpO3RoaXMuX3dyYXBwZXI9KG5ldyBsLldyYXBwZXIpLm1heExpbmVzKDEpfTt1LnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6CnRoaXMuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCgpO3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB4PXRoaXMsQT10aGlzLl9nZXRUaWNrVmFsdWVzKCkubWFwKGZ1bmN0aW9uKHkpe3k9eC5mb3JtYXR0ZXIoKSh5KTtyZXR1cm4geC5fbWVhc3VyZXIubWVhc3VyZSh5KS53aWR0aH0pO3JldHVybiBtLk1hdGgubWF4KEEsMCl9O3UucHJvdG90eXBlLl9jb21wdXRlQXBwcm94aW1hdGVUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgiTSIpLndpZHRoO0E9QS5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHguZm9ybWF0dGVyKCkodykubGVuZ3RoKgp5fSk7cmV0dXJuIG0uTWF0aC5tYXgoQSwwKX07dS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9zY2FsZSxBPXguZG9tYWluKCkseT1BWzBdPD1BWzFdP0FbMF06QVsxXSx3PUFbMF0+PUFbMV0/QVswXTpBWzFdO3JldHVybiB4LnRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDPj15JiZDPD13fSl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB4PQp0aGlzLl9jb21wdXRlV2lkdGgoKTtpZih4PnRoaXMud2lkdGgoKXx8eDx0aGlzLndpZHRoKCktdGhpcy5tYXJnaW4oKSl7dGhpcy5yZWRyYXcoKTtyZXR1cm59fXRoaXMucmVuZGVyKCl9fTt1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB4PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT17eDowLHk6MCxkeDoiMGVtIixkeToiMC4zZW0ifSx5PXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHc9dGhpcy50aWNrTGFiZWxQYWRkaW5nKCksQz0ibWlkZGxlIixHPTAsRD0wLEI9MCxJPTA7aWYodGhpcy5pc0hvcml6b250YWwoKSlzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UgImxlZnQiOkM9ImVuZCI7Rz0tdztJPXc7YnJlYWs7Y2FzZSAiY2VudGVyIjpJPXkrdzticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEk9Rz13fWVsc2Ugc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJ0b3AiOkEuZHk9CiItMC4zZW0iO0I9dztEPS13O2JyZWFrO2Nhc2UgImNlbnRlciI6Qj15K3c7YnJlYWs7Y2FzZSAiYm90dG9tIjpBLmR5PSIxZW0iLEQ9Qj13fXk9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpBLng9eS54MTtBLmR5PSIwLjk1ZW0iO0Q9eS55MStJO2JyZWFrO2Nhc2UgInRvcCI6QS54PXkueDE7QS5keT0iLS4yNWVtIjtEPXkueTEtSTticmVhaztjYXNlICJsZWZ0IjpDPSJlbmQiO0c9eS54MS1CO0EueT15LnkxO2JyZWFrO2Nhc2UgInJpZ2h0IjpDPSJzdGFydCIsRz15LngxK0IsQS55PXkueTF9Qj10aGlzLl9nZXRUaWNrVmFsdWVzKCk7Qj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCKTtCLmV4aXQoKS5yZW1vdmUoKTtCLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChuLkF4aXMuVElDS19MQUJFTF9DTEFTUywKITApLm1lcmdlKEIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikuYXR0cnMoQSkudGV4dChmdW5jdGlvbihOKXtyZXR1cm4geC5mb3JtYXR0ZXIoKShOKX0pO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitHKyIsICIrRCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKTsiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnRpY2tMYWJlbFBvc2l0aW9uPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nOwp4PXgudG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtpZigibGVmdCIhPT14JiYiY2VudGVyIiE9PXgmJiJyaWdodCIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKTt9ZWxzZSBpZigidG9wIiE9PXgmJiJjZW50ZXIiIT09eCYmImJvdHRvbSIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSEwfTt1LnByb3RvdHlwZS5faGlkZUVuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCkE9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO2lmKDAhPT1BLnNpemUoKSl7dmFyIHk9QS5ub2RlcygpWzBdO20uRE9NLmNsaWVudFJlY3RJbnNpZGUoeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx4KXx8dC5zZWxlY3QoeSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTtBPUEubm9kZXMoKVtBLnNpemUoKS0xXTttLkRPTS5jbGllbnRSZWN0SW5zaWRlKEEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseCl8fHQuc2VsZWN0KEEpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9fTt1LnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgeD10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHc9dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4iaW5oZXJpdCI9PT0Kd3x8InZpc2libGUiPT09d30pLEE9eC5ub2RlcygpLm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLHk9MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbCh5LEEpJiZ5PEEubGVuZ3RoOyl5Kz0xO3guZWFjaChmdW5jdGlvbih3LEMpe3c9dC5zZWxlY3QodGhpcyk7MCE9PUMleSYmdy5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSl9O3UucHJvdG90eXBlLl9oYXNPdmVybGFwV2l0aEludGVydmFsPWZ1bmN0aW9uKHgsQSl7dmFyIHk9ImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTozKnRoaXMudGlja0xhYmVsUGFkZGluZygpO0E9QS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIG0uRE9NLmV4cGFuZFJlY3QoQyx5KX0pO2Zvcih2YXIgdz0wO3c8QS5sZW5ndGgteDt3Kz14KWlmKG0uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChBW3ddLEFbdyt4XSkpcmV0dXJuITE7cmV0dXJuITB9Owp1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdX0obi5BeGlzKTtmLk51bWVyaWM9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfTtkPWgoNDIpO3ZhciB0PWgoMjUpLGw9aCgwKTtoPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7ZnVuY3Rpb24gcSgpe3cmJih3PSExLHkuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdShDLEcpe3cmJih5Ll9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZSh5Ll9pc1ZlcnRpY2FsKCk/CkcueDpHLnkpLHkuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24geChDKXtBKEMpJiYodz0hMCx5Ll9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gQShDKXtyZXR1cm4geS5faXNWZXJ0aWNhbCgpJiZ5LnBpeGVsUG9zaXRpb24oKS15LmRldGVjdGlvblJhZGl1cygpPD1DLngmJkMueDw9eS5waXhlbFBvc2l0aW9uKCkreS5kZXRlY3Rpb25SYWRpdXMoKXx8IXkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy55JiZDLnk8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl9dmFyIHk9cC5jYWxsKHRoaXMsbil8fHRoaXM7eS5fZGV0ZWN0aW9uUmFkaXVzPTM7eS5fZW5hYmxlZD0hMDt5LmFkZENsYXNzKCJkcmFnLWxpbmUtbGF5ZXIiKTt5LmFkZENsYXNzKCJlbmFibGVkIik7eS5fZHJhZ0ludGVyYWN0aW9uPW5ldyB0LkRyYWc7eS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHkpOwp2YXIgdz0hMTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHEpO3kuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdFbmQocSk7eS5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfTt5Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt5Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB5fWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLApzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9OwptLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9bik/dGhpcy5hZGRDbGFzcygiZW5hYmxlZCIpOnRoaXMucmVtb3ZlQ2xhc3MoImVuYWJsZWQiKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShxKX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cmV0dXJuIG19KGQuR3VpZGVMaW5lTGF5ZXIpO2YuRHJhZ0xpbmVMYXllcj1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsLHAsbSl7dmFyIG49Cnt9O2lmKHZvaWQgMCE9PW0pZm9yKHZhciBxPTA7cTxtLmxlbmd0aDtxKyspblttW3FdXT1tW3EtMV07cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PWwuc2NhbGUodSk7aWYoIXApcmV0dXJuIHg7dmFyIEE7dT12b2lkIDA9PT1uW3VdP3ZvaWQgMDpsLnNjYWxlKG5bdV0pO3ZvaWQgMCE9PXUmJihBPXUrKHgtdSkvMik7cmV0dXJuIEF9fXZhciB0PXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyl8fHRoaXM7cS5hZGRDbGFzcygiZ3JpZGxpbmVzIik7cS5feFNjYWxlPW07cS5feVNjYWxlPW47cS5fcmVuZGVyQ2FsbGJhY2s9CmZ1bmN0aW9uKCl7cmV0dXJuIHEucmVuZGVyKCl9O2lmKHEuX3hTY2FsZSlxLl94U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO2lmKHEuX3lTY2FsZSlxLl95U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiBxfXQocCxsKTtwLnByb3RvdHlwZS5iZXR3ZWVuWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iZXR3ZWVuWH07cC5wcm90b3R5cGUuYmV0d2Vlblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlbll9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTt0aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCk7dGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9yZWRyYXdYTGluZXMoKTt0aGlzLl9yZWRyYXdZTGluZXMoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLl9yZWRyYXdYTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl94U2NhbGUpe3ZhciBtPXRoaXMuYmV0d2VlblgoKSxuPXRoaXMuX3hTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkxIiwwKS5hdHRyKCJ4MiIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsbSkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHEpe3JldHVybiAwPT09cX0pO24uZXhpdCgpLnJlbW92ZSgpfX07cC5wcm90b3R5cGUuX3JlZHJhd1lMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3lTY2FsZSl7dmFyIG09dGhpcy5iZXR3ZWVuWSgpLApuPXRoaXMuX3lTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3lMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLGsodGhpcy5feVNjYWxlLG0sdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIsayh0aGlzLl95U2NhbGUsbSx0aGlzLl95U2NhbGUudGlja3MoKSkpLmNsYXNzZWQoImJldHdlZW5saW5lIixtKS5jbGFzc2VkKCJ6ZXJvbGluZSIsZnVuY3Rpb24ocSl7cmV0dXJuIDA9PT1xfSk7bi5leGl0KCkucmVtb3ZlKCl9fTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuR3JpZGxpbmVzPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJgooblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHQ9aCg1KSxsPWgoMjMpLHA9aCg4KSxtPWgoMCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKHUpe3ZhciB4PW4uY2FsbCh0aGlzKXx8dGhpczt4Ll90ZXh0UGFkZGluZz01O2lmKG51bGw9PXUpdGhyb3cgRXJyb3IoIkludGVycG9sYXRlZENvbG9yTGVnZW5kIHJlcXVpcmVzIGEgaW50ZXJwb2xhdGVkQ29sb3JTY2FsZSIpO3guX3NjYWxlPXU7eC5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4geC5yZWRyYXcoKX07eC5fc2NhbGUub25VcGRhdGUoeC5fcmVkcmF3Q2FsbGJhY2spO3guX2Zvcm1hdHRlcj1wLmdlbmVyYWwoKTt4Ll9vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI7eC5fZXhwYW5kcz0hMTt4LmFkZENsYXNzKCJsZWdlbmQiKTt4LmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIik7cmV0dXJuIHh9ayhxLApuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3EucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZih2b2lkIDA9PT11KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXhwYW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHBhbmRzfTtxLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih1KXt1PXUudG9Mb3dlckNhc2UoKTtpZigiaG9yaXpvbnRhbCI9PT11fHwibGVmdCI9PT11fHwicmlnaHQiPT09dSlyZXR1cm4gdTt0aHJvdyBFcnJvcignIicrdSsnIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQnKTt9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PQp1KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt0aGlzLl9vcmllbnRhdGlvbj1xLl9lbnN1cmVPcmllbnRhdGlvbih1KTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih1KXt2b2lkIDA9PT11JiYodT1xLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXUpcmV0dXJuW3hbMF1dO2Zvcih2YXIgQT0oeFsxXS14WzBdKS8odS0xKSx5PVtdLHc9MDt3PHU7dysrKXkucHVzaCh4WzBdK0Eqdyk7cmV0dXJuIHl9O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9zd2F0Y2hDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic3dhdGNoLWNvbnRhaW5lciIsITApO3RoaXMuX3N3YXRjaEJvdW5kaW5nQm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaC1ib3VuZGluZy1ib3giLCEwKTt0aGlzLl9sb3dlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3RoaXMuX3VwcGVyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLkxFR0VORF9MQUJFTF9DTEFTUywhMCk7dmFyIHU9bmV3IHQuU3ZnQ29udGV4dCh0aGlzLmNvbnRlbnQoKS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0Lk1lYXN1cmVyKHUpO3RoaXMuX3dyYXBwZXI9bmV3IHQuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IHQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHUsdGhpcy5fd3JhcHBlcil9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPQpmdW5jdGlvbigpe3ZhciB1PXRoaXMseD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEE9dGhpcy5fc2NhbGUuZG9tYWluKCkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB1Ll9tZWFzdXJlci5tZWFzdXJlKHUuX2Zvcm1hdHRlcihDKSkud2lkdGh9KSx5PXEuX0RFRkFVTFRfTlVNX1NXQVRDSEVTO2lmKHRoaXMuX2lzVmVydGljYWwoKSl7dmFyIHc9bS5NYXRoLm1heChBLDApO0E9eCt4K3RoaXMuX3RleHRQYWRkaW5nK3crdGhpcy5fdGV4dFBhZGRpbmc7dz15Knh9ZWxzZSB3PXgreCt4LEE9dGhpcy5fdGV4dFBhZGRpbmcrQVswXSt5KngrQVsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6QSxtaW5IZWlnaHQ6d319O3EucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwp2YXIgeD10aGlzLl9zY2FsZS5kb21haW4oKSxBPXRoaXMuX2Zvcm1hdHRlcih4WzBdKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoQSkud2lkdGgsdz10aGlzLl9mb3JtYXR0ZXIoeFsxXSk7eD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHcpLndpZHRoO3ZhciBDPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsRz10aGlzLl90ZXh0UGFkZGluZyxEPTAsQj0wLEk9MCxOPTAsTz17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSD17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSz17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciBNPU1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7dmFyIEw9TWF0aC5tYXgoeSx4KTt2YXIgUT0odGhpcy53aWR0aCgpLUwtMip0aGlzLl90ZXh0UGFkZGluZykvMjt4PU1hdGgubWF4KHRoaXMud2lkdGgoKS1RLTIqRy1MLDApOwpDPTE7dmFyIFQ9ZnVuY3Rpb24oYWEsbGEpe3JldHVybiB1LmhlaWdodCgpLShsYSsxKX07SC55QWxpZ249InRvcCI7Qj0wO08ueUFsaWduPSJib3R0b20iO049MDtpZigibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbil7dmFyIFg9ZnVuY3Rpb24oKXtyZXR1cm4gRytMK0d9O0gueEFsaWduPSJyaWdodCI7RD0tKFEreCtHKTtPLnhBbGlnbj0icmlnaHQiO0k9LShRK3grRyl9ZWxzZSBYPWZ1bmN0aW9uKCl7cmV0dXJuIFF9LEgueEFsaWduPSJsZWZ0IixEPVEreCtHLE8ueEFsaWduPSJsZWZ0IixJPVEreCtHO0sud2lkdGg9eDtLLmhlaWdodD1NKkN9ZWxzZSBRPU1hdGgubWF4KEcsKHRoaXMuaGVpZ2h0KCktQykvMiksTT1NYXRoLm1heChNYXRoLmZsb29yKHRoaXMud2lkdGgoKS00KkcteS14KSwwKSx4PTEsQz1NYXRoLm1heCh0aGlzLmhlaWdodCgpLTIqUSwwKSxYPWZ1bmN0aW9uKGFhLGxhKXtyZXR1cm4gTWF0aC5mbG9vcih5KzIqRykrbGF9LFQ9ZnVuY3Rpb24oKXtyZXR1cm4gUX0sCkgueEFsaWduPSJyaWdodCIsRD0tRyxPLnhBbGlnbj0ibGVmdCIsST1HLEsueT1RLEsud2lkdGg9TSp4LEsuaGVpZ2h0PUM7Sy54PVgobnVsbCwwKTt0aGlzLl91cHBlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZSh3LHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLEgsdGhpcy5fdXBwZXJMYWJlbC5ub2RlKCkpO3RoaXMuX3VwcGVyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRCsiLCAiK0IrIikiKTt0aGlzLl9sb3dlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZShBLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLE8sdGhpcy5fbG93ZXJMYWJlbC5ub2RlKCkpO3RoaXMuX2xvd2VyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrSSsiLCAiK04rIikiKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveC5hdHRycyhLKTtBPXRoaXMuX2dlbmVyYXRlVGlja3MoTSk7QT10aGlzLl9zd2F0Y2hDb250YWluZXIuc2VsZWN0QWxsKCJyZWN0LnN3YXRjaCIpLmRhdGEoQSk7Cnc9QS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaCIsITApO0Q9QS5tZXJnZSh3KTtBLmV4aXQoKS5yZW1vdmUoKTtELmF0dHJzKHtmaWxsOmZ1bmN0aW9uKGFhKXtyZXR1cm4gdS5fc2NhbGUuc2NhbGUoYWEpfSx3aWR0aDp4LGhlaWdodDpDLHg6WCx5OlQsInNoYXBlLXJlbmRlcmluZyI6ImNyaXNwRWRnZXMifSk7bC5BRERfVElUTEVfRUxFTUVOVFMmJncuYXBwZW5kKCJ0aXRsZSIpLnRleHQoZnVuY3Rpb24oYWEpe3JldHVybiB1Ll9mb3JtYXR0ZXIoYWEpfSk7cmV0dXJuIHRoaXN9O3JldHVybiBxfShoKDQpLkNvbXBvbmVudCk7ZC5fREVGQVVMVF9OVU1fU1dBVENIRVM9MTE7ZC5MRUdFTkRfTEFCRUxfQ0xBU1M9ImxlZ2VuZC1sYWJlbCI7Zi5JbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYKKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoNSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09bSYmKG09IiIpO3ZvaWQgMD09PW4mJihuPTApO3ZhciBxPWwuY2FsbCh0aGlzKXx8dGhpcztxLmFkZENsYXNzKCJsYWJlbCIpO3EudGV4dChtKTtxLmFuZ2xlKG4pO3EueEFsaWdubWVudCgiY2VudGVyIikueUFsaWdubWVudCgiY2VudGVyIik7cS5fcGFkZGluZz0wO3JldHVybiBxfWsocCxsKTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciBtPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj0oMD09PXRoaXMuYW5nbGUoKT9tLndpZHRoOm0uaGVpZ2h0KSsyKnRoaXMucGFkZGluZygpO209KDA9PT10aGlzLmFuZ2xlKCk/bS5oZWlnaHQ6bS53aWR0aCkrMip0aGlzLnBhZGRpbmcoKTtyZXR1cm57bWluV2lkdGg6biwKbWluSGVpZ2h0Om19fTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90ZXh0Q29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpO3ZhciBtPW5ldyB0LlN2Z0NvbnRleHQodGhpcy5fdGV4dENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIobSk7dGhpcy5fd3JhcHBlcj1uZXcgdC5XcmFwcGVyO3RoaXMuX3dyaXRlcj1uZXcgdC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsbSx0aGlzLl93cmFwcGVyKTt0aGlzLnRleHQodGhpcy5fdGV4dCl9O3AucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdGV4dDtpZigic3RyaW5nIiE9PXR5cGVvZiBtKXRocm93IEVycm9yKCJMYWJlbC50ZXh0KCkgb25seSB0YWtlcyBzdHJpbmdzIGFzIGlucHV0Iik7dGhpcy5fdGV4dD1tO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmFuZ2xlPQpmdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9hbmdsZTttJT0zNjA7MTgwPG0/bS09MzYwOi0xODA+bSYmKG0rPTM2MCk7aWYoLTkwPT09bXx8MD09PW18fDkwPT09bSl0aGlzLl9hbmdsZT1tO2Vsc2UgdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIGFuZ2xlIGZvciBMYWJlbCIpO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBhZGRpbmc9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fcGFkZGluZzttPSttO2lmKDA+bSl0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgcGFkZGluZyB2YWx1ZS4gQ2Fubm90IGJlIGxlc3MgdGhhbiAwLiIpO3RoaXMuX3BhZGRpbmc9bTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PQpmdW5jdGlvbigpe2wucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fdGV4dENvbnRhaW5lci5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTt2YXIgbT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLG49TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMuaGVpZ2h0KCktbS5oZWlnaHQpLzIsdGhpcy5wYWRkaW5nKCkpLDApO209TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMud2lkdGgoKS1tLndpZHRoKS8yLHRoaXMucGFkZGluZygpKSwwKTt0aGlzLl90ZXh0Q29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK20rIiwiK24rIikiKTttPXRoaXMud2lkdGgoKS0yKm07bj10aGlzLmhlaWdodCgpLTIqbjt2YXIgcT17eEFsaWduOnRoaXMueEFsaWdubWVudCgpLHlBbGlnbjp0aGlzLnlBbGlnbm1lbnQoKSx0ZXh0Um90YXRpb246dGhpcy5hbmdsZSgpfTt0aGlzLl93cml0ZXIud3JpdGUodGhpcy5fdGV4dCxtLG4scSk7cmV0dXJuIHRoaXN9OwpwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuTGFiZWw9ZDtoPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLlRJVExFX0xBQkVMX0NMQVNTKTtyZXR1cm4gbX1rKHAsbCk7cmV0dXJuIHB9KGQpO2guVElUTEVfTEFCRUxfQ0xBU1M9InRpdGxlLWxhYmVsIjtmLlRpdGxlTGFiZWw9aDtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLkFYSVNfTEFCRUxfQ0xBU1MpO3JldHVybiBtfWsocCxsKTtyZXR1cm4gcH0oZCk7ZC5BWElTX0xBQkVMX0NMQVNTPSJheGlzLWxhYmVsIjtmLkF4aXNMYWJlbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fApmdW5jdGlvbihBLHkpe2Z1bmN0aW9uIHcoKXt0aGlzLmNvbnN0cnVjdG9yPUF9Zm9yKHZhciBDIGluIHkpeS5oYXNPd25Qcm9wZXJ0eShDKSYmKEFbQ109eVtDXSk7QS5wcm90b3R5cGU9bnVsbD09PXk/T2JqZWN0LmNyZWF0ZSh5KToody5wcm90b3R5cGU9eS5wcm90b3R5cGUsbmV3IHcpfSx0PWgoMSksbD1oKDUpLHA9aCgyMyksbT1oKDgpLG49aCgzMSkscT1oKDApO2Q9aCg0KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoeSx3LEMpe3ZvaWQgMD09PXkmJih5PVtdKTt2b2lkIDA9PT13JiYodz0wKTt2b2lkIDA9PT1DJiYoQz1JbmZpbml0eSk7dGhpcy5jb2x1bW5zPXk7dGhpcy5ib3R0b21QYWRkaW5nPXc7dGhpcy5tYXhXaWR0aD1DfUEucHJvdG90eXBlLmFkZENvbHVtbj1mdW5jdGlvbih5KXt2YXIgdz15LndpZHRoLEM9dGhpcy5nZXRXaWR0aEF2YWlsYWJsZSgpO3kud2lkdGg9TWF0aC5taW4oQyx3KTt0aGlzLmNvbHVtbnMucHVzaCh5KX07QS5wcm90b3R5cGUuZ2V0Qm91bmRzPQpmdW5jdGlvbih5KXtmb3IodmFyIHc9dGhpcy5jb2x1bW5zW3ldLEM9MCxHPTA7Rzx5O0crKylDKz10aGlzLmNvbHVtbnNbR10ud2lkdGg7cmV0dXJue3RvcExlZnQ6e3g6Qyx5OjB9LGJvdHRvbVJpZ2h0Ont4OkMrdy53aWR0aCx5OncuaGVpZ2h0fX19O0EucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBxLk1hdGgubWF4KHRoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHkuaGVpZ2h0fSksMCkrdGhpcy5ib3R0b21QYWRkaW5nfTtBLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLmNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkrdy53aWR0aH0sMCksdGhpcy5tYXhXaWR0aCl9O0EucHJvdG90eXBlLmdldFdpZHRoQXZhaWxhYmxlPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5nZXRXaWR0aCgpO3JldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoLXksMCl9O3JldHVybiBBfSgpLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKHksCncsQyxHKXt2b2lkIDA9PT15JiYoeT1JbmZpbml0eSk7dm9pZCAwPT09dyYmKHc9SW5maW5pdHkpO3ZvaWQgMD09PUMmJihDPTApO3ZvaWQgMD09PUcmJihHPVtdKTt0aGlzLm1heFdpZHRoPXk7dGhpcy5tYXhIZWlnaHQ9dzt0aGlzLnBhZGRpbmc9Qzt0aGlzLnJvd3M9R31BLnByb3RvdHlwZS5hZGRSb3c9ZnVuY3Rpb24oeSl7eS5tYXhXaWR0aD10aGlzLm1heFdpZHRoLTIqdGhpcy5wYWRkaW5nO3RoaXMucm93cy5wdXNoKHkpfTtBLnByb3RvdHlwZS5nZXRDb2x1bW5Cb3VuZHM9ZnVuY3Rpb24oeSx3KXt2YXIgQz10aGlzLmdldFJvd0JvdW5kcyh5KTt5PXRoaXMucm93c1t5XS5nZXRCb3VuZHModyk7eS50b3BMZWZ0LngrPUMudG9wTGVmdC54O3kuYm90dG9tUmlnaHQueCs9Qy50b3BMZWZ0Lng7eS50b3BMZWZ0LnkrPUMudG9wTGVmdC55O3kuYm90dG9tUmlnaHQueSs9Qy50b3BMZWZ0Lnk7cmV0dXJuIHl9O0EucHJvdG90eXBlLmdldFJvd0JvdW5kcz1mdW5jdGlvbih5KXtmb3IodmFyIHc9CnRoaXMucGFkZGluZyxDPXRoaXMucGFkZGluZyxHPTA7Rzx5O0crKylDKz10aGlzLnJvd3NbR10uZ2V0SGVpZ2h0KCk7cmV0dXJue3RvcExlZnQ6e3g6dyx5OkN9LGJvdHRvbVJpZ2h0Ont4OncrdGhpcy5yb3dzW3ldLmdldFdpZHRoKCkseTpDK3RoaXMucm93c1t5XS5nZXRIZWlnaHQoKX19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZShmdW5jdGlvbih5LHcpe3JldHVybiB5K3cuZ2V0SGVpZ2h0KCl9LDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX07QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4ocS5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmdldFdpZHRoKCl9KSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX07cmV0dXJuIEF9KCk7ZD1mdW5jdGlvbihBKXtmdW5jdGlvbiB5KHcpe3ZhciBDPUEuY2FsbCh0aGlzKXx8CnRoaXM7Qy5fcGFkZGluZz01O0MuX3Jvd0JvdHRvbVBhZGRpbmc9MztDLmFkZENsYXNzKCJsZWdlbmQiKTtDLm1heEVudHJpZXNQZXJSb3coMSk7aWYobnVsbD09dyl0aHJvdyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO0MuX2NvbG9yU2NhbGU9dztDLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBDLnJlZHJhdygpfTtDLl9jb2xvclNjYWxlLm9uVXBkYXRlKEMuX3JlZHJhd0NhbGxiYWNrKTtDLl9mb3JtYXR0ZXI9bS5pZGVudGl0eSgpO0MubWF4TGluZXNQZXJFbnRyeSgxKTtDLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7Qy5jb21wYXJhdG9yKGZ1bmN0aW9uKEcsRCl7dmFyIEI9Qy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gQy5fZm9ybWF0dGVyKEkpfSk7cmV0dXJuIEIuaW5kZXhPZihHKS1CLmluZGV4T2YoRCl9KTtDLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jaXJjbGUoKX07CkMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfTtyZXR1cm4gQ31rKHksQSk7eS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9ST1dfQ0xBU1MsITApO3cuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7dz1uZXcgbC5TdmdDb250ZXh0KHcubm9kZSgpLG51bGwscC5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIodyk7dGhpcy5fd3JhcHBlcj0obmV3IGwuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsdyx0aGlzLl93cmFwcGVyKX07eS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHcpe2lmKG51bGw9PQp3KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih3KXtpZihudWxsPT13KXJldHVybiB0aGlzLl9tYXhFbnRyaWVzUGVyUm93O3RoaXMuX21heEVudHJpZXNQZXJSb3c9dzt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heExpbmVzUGVyRW50cnk7dGhpcy5fbWF4TGluZXNQZXJFbnRyeT13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heFdpZHRoPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heFdpZHRoO3RoaXMuX21heFdpZHRoPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih3KXtudWxsIT13JiYodGhpcy5fY29tcGFyYXRvcj0Kdyx0aGlzLnJlZHJhdygpKX07eS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih3KXtyZXR1cm4gbnVsbCE9dz8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9dyx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9O3kucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTt5LnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih3LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEI9bmV3IHgodyxDLHRoaXMuX3BhZGRpbmcpO3c9dGhpcy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oTiwKTyl7cmV0dXJuIEcuX2NvbXBhcmF0b3IoRy5fZm9ybWF0dGVyKE4pLEcuX2Zvcm1hdHRlcihPKSl9KTt2YXIgST1uZXcgdTtCLmFkZFJvdyhJKTtJLmJvdHRvbVBhZGRpbmc9dGhpcy5fcm93Qm90dG9tUGFkZGluZzt3LmZvckVhY2goZnVuY3Rpb24oTil7SS5jb2x1bW5zLmxlbmd0aC8yPT09Ry5tYXhFbnRyaWVzUGVyUm93KCkmJihJPW5ldyB1LEkuYm90dG9tUGFkZGluZz1HLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEkpKTt2YXIgTz1JLmdldFdpZHRoQXZhaWxhYmxlKCksSD1HLl9mb3JtYXR0ZXIoTiksSz1HLl9tZWFzdXJlci5tZWFzdXJlKEgpLndpZHRoOzA+Ty1ELUsmJjE8SS5jb2x1bW5zLmxlbmd0aCYmKEk9bmV3IHUsSS5ib3R0b21QYWRkaW5nPUcuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSSkpO0kuYWRkQ29sdW1uKHt3aWR0aDpELGhlaWdodDpELGRhdGE6e25hbWU6Tix0eXBlOiJzeW1ib2wifX0pO089SS5nZXRXaWR0aEF2YWlsYWJsZSgpO089TWF0aC5taW4oTywKSyk7Ry5fd3JhcHBlci5tYXhMaW5lcyhHLm1heExpbmVzUGVyRW50cnkoKSk7SD1HLl93cmFwcGVyLndyYXAoSCxHLl9tZWFzdXJlcixPKS5ub0xpbmVzKkQ7SS5hZGRDb2x1bW4oe3dpZHRoOk8saGVpZ2h0OkgsZGF0YTp7bmFtZTpOLHR5cGU6InRleHQifX0pfSk7cmV0dXJuIEJ9O3kucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHcsQyl7dz10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHEuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx3XSx3KSxDKTtyZXR1cm57bWluSGVpZ2h0OncuZ2V0SGVpZ2h0KCksbWluV2lkdGg6dy5nZXRXaWR0aCgpfX07eS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih3KXt2YXIgQz10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBHPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBHLnJvd3MucmVkdWNlKGZ1bmN0aW9uKEQsQixJKXtpZigwIT09RC5sZW5ndGgpcmV0dXJuIEQ7CnZhciBOPUcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiBxLk1hdGgud2l0aGluKHcsTik/Qi5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbihPLEgsSyl7dmFyIE09Ry5nZXRDb2x1bW5Cb3VuZHMoSSxLKTtpZihxLk1hdGgud2l0aGluKHcsTSkpe089Qy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbSV07Sz10LnNlbGVjdChPKS5zZWxlY3RBbGwoIi4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3IoSy8yKV07dmFyIEw9dC5zZWxlY3QoSykuc2VsZWN0KCIuIit5LkxFR0VORF9TWU1CT0xfQ0xBU1MpO009cS5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKHQuc2VsZWN0KE8pKTtMPXEuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhMKTtyZXR1cm5be2JvdW5kczpxLkRPTS5lbGVtZW50QkJveCh0LnNlbGVjdChPKSksZGF0dW06SC5kYXRhLm5hbWUscG9zaXRpb246e3g6TVswXStMWzBdLHk6TVsxXStMWzFdfSxzZWxlY3Rpb246dC5zZWxlY3QoSyksCmNvbXBvbmVudDpDfV19cmV0dXJuIE99LEQpOkR9LFtdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciB3PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3ZhciBDPXRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX1JPV19DTEFTUykuZGF0YSh3LnJvd3MpLEc9Qy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKS5tZXJnZShDKTtDLmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQixJKXtCPXcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiJ0cmFuc2xhdGUoIitCLnRvcExlZnQueCsiLCAiK0IudG9wTGVmdC55KyIpIn0pO3ZhciBEPXRoaXM7Ry5lYWNoKGZ1bmN0aW9uKEIsSSl7Zm9yKHZhciBOPQpbXSxPPTA7TzxCLmNvbHVtbnMubGVuZ3RoO08rPTIpTi5wdXNoKFtCLmNvbHVtbnNbT10sQi5jb2x1bW5zW08rMV1dKTtCPXQuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKE4pO049Qi5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKEIpO04uYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiBELnN5bWJvbCgpKEguZGF0YS5uYW1lLEkpKC42KkguaGVpZ2h0KShudWxsKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiJ0cmFuc2xhdGUoIisody5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEgpKS50b3BMZWZ0LngrSC53aWR0aC8yKSsiLCAiK0guaGVpZ2h0LzIrIikifSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oSCl7cmV0dXJuIEQuX2NvbG9yU2NhbGUuc2NhbGUoSFswXS5kYXRhLm5hbWUpfSkuYXR0cigib3BhY2l0eSIsCmZ1bmN0aW9uKEgpe3JldHVybiBELnN5bWJvbE9wYWNpdHkoKShIWzBdLmRhdGEubmFtZSxJKX0pLmNsYXNzZWQoeS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKTtOLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihIKXtyZXR1cm4idHJhbnNsYXRlKCIrdy5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEhbMV0pKS50b3BMZWZ0LngrIiwgMCkifSkuZWFjaChmdW5jdGlvbihIKXt2YXIgSz10LnNlbGVjdCh0aGlzKTtIPUhbMV07RC5fd3JpdGVyLndyaXRlKEQuX2Zvcm1hdHRlcihILmRhdGEubmFtZSksSC53aWR0aCxELmhlaWdodCgpLHt4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIix0ZXh0Um90YXRpb246MH0sSy5ub2RlKCkpfSk7Qi5leGl0KCkucmVtb3ZlKCl9KTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXc7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3J9O3kucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHl9KGQuQ29tcG9uZW50KTtkLkxFR0VORF9ST1dfQ0xBU1M9ImxlZ2VuZC1yb3ciO2QuTEVHRU5EX0VOVFJZX0NMQVNTPSJsZWdlbmQtZW50cnkiO2QuTEVHRU5EX1NZTUJPTF9DTEFTUz0ibGVnZW5kLXN5bWJvbCI7Zi5MZWdlbmQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDIpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gbnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKG4pe3ZhciBxLHU9SW5maW5pdHk7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbih4KXt4PXguZW50aXR5TmVhcmVzdChuKTtpZihudWxsIT14KXt2YXIgQT1sLk1hdGguZGlzdGFuY2VTcXVhcmVkKHgucG9zaXRpb24sbik7QTw9dSYmKHU9QSxxPXgpfX0pO3JldHVybiBxfTttLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obil7aWYobnVsbCE9biYmIShuIGluc3RhbmNlb2YgdC5QbG90KSl0aHJvdyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKcC5wcm90b3R5cGUuYXBwZW5kLmNhbGwodGhpcyxuKTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoNDEpLkdyb3VwKTtmLlBsb3RHcm91cD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZvaWQgMD09PW4mJihuPVtdKTt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7cS5fcm93UGFkZGluZz0wO3EuX2NvbHVtblBhZGRpbmc9MDtxLl9yb3dzPVtdO3EuX3Jvd1dlaWdodHM9W107cS5fY29sdW1uV2VpZ2h0cz1bXTtxLl9uUm93cz0wO3EuX25Db2xzPTA7cS5fY2FsY3VsYXRlZExheW91dD0KbnVsbDtxLmFkZENsYXNzKCJ0YWJsZSIpO24uZm9yRWFjaChmdW5jdGlvbih1LHgpe3UuZm9yRWFjaChmdW5jdGlvbihBLHkpe251bGwhPUEmJnEuYWRkKEEseCx5KX0pfSk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG4pe2Zvcih2YXIgcT0wO3E8dGhpcy5fblJvd3M7cSsrKWZvcih2YXIgdT0wO3U8dGhpcy5fbkNvbHM7dSsrKW51bGwhPXRoaXMuX3Jvd3NbcV1bdV0mJm4odGhpcy5fcm93c1txXVt1XSl9O20ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bilyZXR1cm4hMDtyZXR1cm4hMX07bS5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24obixxKXtyZXR1cm4gMD5ufHxuPj10aGlzLl9uUm93c3x8MD5xfHxxPj10aGlzLl9uQ29scz9udWxsOnRoaXMuX3Jvd3Nbbl1bcV19O20ucHJvdG90eXBlLmFkZD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXMobikpe2lmKG51bGwhPSh0aGlzLl9yb3dzW3FdJiZ0aGlzLl9yb3dzW3FdW3VdKSl0aHJvdyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpO24uZGV0YWNoKCk7dGhpcy5fblJvd3M9TWF0aC5tYXgocSsxLHRoaXMuX25Sb3dzKTt0aGlzLl9uQ29scz1NYXRoLm1heCh1KzEsdGhpcy5fbkNvbHMpO3RoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLHRoaXMuX25Db2xzKTt0aGlzLl9yb3dzW3FdW3VdPW47dGhpcy5fYWRvcHRBbmRBbmNob3Iobik7dGhpcy5yZWRyYXcoKX1yZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bil7dGhpcy5fcm93c1txXVt1XT0KbnVsbDtyZXR1cm59fTttLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB4PXRoaXMuX3Jvd3MsQT10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtuLT10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKTtxLT10aGlzLl9yb3dQYWRkaW5nKih0aGlzLl9uUm93cy0xKTt4PW0uX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX3Jvd1dlaWdodHMseCxmdW5jdGlvbihMKXtyZXR1cm4gbnVsbD09THx8TC5maXhlZEhlaWdodCgpfSk7QT1tLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLEEsZnVuY3Rpb24oTCl7cmV0dXJuIG51bGw9PUx8fEwuZml4ZWRXaWR0aCgpfSk7dmFyIHk9QS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIDA9PT1MPy41Okx9KSx3PXgubWFwKGZ1bmN0aW9uKEwpe3JldHVybiAwPT09TD8uNTpMfSk7eT1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxuKTt2YXIgQz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UodywKcSksRz1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLEQ9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKTt3PTA7Zm9yKHZhciBCLEksTjs7KXtEPWwuQXJyYXkuYWRkKEQsQyk7eT1sLkFycmF5LmFkZChHLHkpO0I9dGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyh5LEQsdSk7Rz1CLmd1YXJhbnRlZWRXaWR0aHM7RD1CLmd1YXJhbnRlZWRIZWlnaHRzO0k9Qi53YW50c1dpZHRoQXJyLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEx9KTtOPUIud2FudHNIZWlnaHRBcnIuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gTH0pO3ZhciBPPUssSD1NO3ZhciBLPW4tdC5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTt2YXIgTT1xLXQuc3VtKEIuZ3VhcmFudGVlZEhlaWdodHMpO3k9dm9pZCAwO0k/KHk9Qi53YW50c1dpZHRoQXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8uMTowfSkseT1sLkFycmF5LmFkZCh5LEEpKTp5PUE7Qz12b2lkIDA7Tj8oQz1CLndhbnRzSGVpZ2h0QXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8KLjE6MH0pLEM9bC5BcnJheS5hZGQoQyx4KSk6Qz14O3k9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHksSyk7Qz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQyxNKTt3Kys7SD0wPE0mJk0hPT1IO2lmKCEoMDxLJiZLIT09T3x8SCkpYnJlYWs7aWYoNTx3KWJyZWFrfUs9bi10LnN1bShCLmd1YXJhbnRlZWRXaWR0aHMpO009cS10LnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt5PW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShBLEspO0M9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHgsTSk7cmV0dXJue2NvbFByb3BvcnRpb25hbFNwYWNlOnkscm93UHJvcG9ydGlvbmFsU3BhY2U6QyxndWFyYW50ZWVkV2lkdGhzOkIuZ3VhcmFudGVlZFdpZHRocyxndWFyYW50ZWVkSGVpZ2h0czpCLmd1YXJhbnRlZWRIZWlnaHRzLHdhbnRzV2lkdGg6SSx3YW50c0hlaWdodDpOfX07bS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXM9ZnVuY3Rpb24obixxLHUpe3ZvaWQgMD09PXUmJih1PSExKTt2YXIgeD0KbC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxBPWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseT1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSx3PWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fblJvd3MpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEcpe0MuZm9yRWFjaChmdW5jdGlvbihELEIpe0Q9bnVsbCE9RD9ELnJlcXVlc3RlZFNwYWNlKG5bQl0scVtHXSk6e21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O3hbQl09TWF0aC5tYXgoeFtCXSx1P01hdGgubWluKEQubWluV2lkdGgsbltCXSk6RC5taW5XaWR0aCk7QVtHXT1NYXRoLm1heChBW0ddLHU/TWF0aC5taW4oRC5taW5IZWlnaHQscVtHXSk6RC5taW5IZWlnaHQpO3ZhciBJPUQubWluV2lkdGg+bltCXTt5W0JdPXlbQl18fEk7Qj1ELm1pbkhlaWdodD5xW0ddO3dbR109d1tHXXx8Qn0pfSk7cmV0dXJue2d1YXJhbnRlZWRXaWR0aHM6eCwKZ3VhcmFudGVlZEhlaWdodHM6QSx3YW50c1dpZHRoQXJyOnksd2FudHNIZWlnaHRBcnI6d319O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fY2FsY3VsYXRlZExheW91dD10aGlzLl9pdGVyYXRlTGF5b3V0KG4scSk7cmV0dXJue21pbldpZHRoOnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksbWluSGVpZ2h0OnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dmFyIHg9dGhpcztwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxuLHEsdSk7bj10LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpO3E9dC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyk7dT10aGlzLl9jYWxjdWxhdGVkTGF5b3V0O2lmKG4+dGhpcy53aWR0aCgpfHwKcT50aGlzLmhlaWdodCgpKXU9dGhpcy5faXRlcmF0ZUxheW91dCh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSwhMCk7dmFyIEE9MCx5PWwuQXJyYXkuYWRkKHUucm93UHJvcG9ydGlvbmFsU3BhY2UsdS5ndWFyYW50ZWVkSGVpZ2h0cyksdz1sLkFycmF5LmFkZCh1LmNvbFByb3BvcnRpb25hbFNwYWNlLHUuZ3VhcmFudGVlZFdpZHRocyk7dGhpcy5fcm93cy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7dmFyIEQ9MDtDLmZvckVhY2goZnVuY3Rpb24oQixJKXtudWxsIT1CJiZCLmNvbXB1dGVMYXlvdXQoe3g6RCx5OkF9LHdbSV0seVtHXSk7RCs9d1tJXSt4Ll9jb2x1bW5QYWRkaW5nfSk7QSs9eVtHXSt4Ll9yb3dQYWRkaW5nfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1BhZGRpbmc9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fcm93UGFkZGluZztpZighbC5NYXRoLmlzVmFsaWROdW1iZXIobil8fDA+bil0aHJvdyBFcnJvcigicm93UGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpOwp0aGlzLl9yb3dQYWRkaW5nPW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCFsLk1hdGguaXNWYWxpZE51bWJlcihuKXx8MD5uKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1dlaWdodD1mdW5jdGlvbihuLHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3Jvd1dlaWdodHNbbl07aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpfHwwPnEpdGhyb3cgRXJyb3IoInJvd1dlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX3Jvd1dlaWdodHNbbl09cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5jb2x1bW5XZWlnaHQ9CmZ1bmN0aW9uKG4scSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1tuXTtpZighbC5NYXRoLmlzVmFsaWROdW1iZXIocSl8fDA+cSl0aHJvdyBFcnJvcigiY29sdW1uV2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uV2VpZ2h0c1tuXT1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXt2YXIgbj10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtyZXR1cm4gbS5fZml4ZWRTcGFjZShuLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkV2lkdGgoKX0pfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBtLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW58fG4uZml4ZWRIZWlnaHQoKX0pfTttLnByb3RvdHlwZS5fcGFkVGFibGVUb1NpemU9ZnVuY3Rpb24obixxKXtmb3IodmFyIHU9CjA7dTxuO3UrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t1XSYmKHRoaXMuX3Jvd3NbdV09W10sdGhpcy5fcm93V2VpZ2h0c1t1XT1udWxsKTtmb3IodmFyIHg9MDt4PHE7eCsrKXZvaWQgMD09PXRoaXMuX3Jvd3NbdV1beF0mJih0aGlzLl9yb3dzW3VdW3hdPW51bGwpfWZvcih4PTA7eDxxO3grKyl2b2lkIDA9PT10aGlzLl9jb2x1bW5XZWlnaHRzW3hdJiYodGhpcy5fY29sdW1uV2VpZ2h0c1t4XT1udWxsKX07bS5fY2FsY0NvbXBvbmVudFdlaWdodHM9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuLm1hcChmdW5jdGlvbih4LEEpe3JldHVybiBudWxsIT14P3g6cVtBXS5tYXAodSkucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkmJnd9LCEwKT8wOjF9KX07bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlPWZ1bmN0aW9uKG4scSl7dmFyIHU9dC5zdW0obik7cmV0dXJuIDA9PT11P2wuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCxuLmxlbmd0aCk6bi5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHEqCngvdX0pfTttLl9maXhlZFNwYWNlPWZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh4KXtyZXR1cm4geC5yZWR1Y2UoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQSYmeX0sITApfXJldHVybiB1KG4ubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB1KHgubWFwKHEpKX0pKX07cmV0dXJuIG19KGgoMjkpLkNvbXBvbmVudENvbnRhaW5lcik7Zi5UYWJsZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLmFkZENsYXNzKCJ4LWRyYWctYm94LWxheWVyIik7cC5faGFzQ29ybmVycz0hMTsKcmV0dXJuIHB9ayhsLHQpO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxtLG4pe3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAsbSxuKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocCl7dC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6cC50b3BMZWZ0LngseTowfSxib3R0b21SaWdodDp7eDpwLmJvdHRvbVJpZ2h0LngseTp0aGlzLmhlaWdodCgpfX0pfTtsLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbihwKXtwJiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIil9O2wucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0LnByb3RvdHlwZS55U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigieVNjYWxlcyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEcmFnQm94TGF5ZXIiKTsKfTtsLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigiWERyYWdCb3hMYXllciBoYXMgbm8geUV4dGVudCIpO307cmV0dXJuIGx9KGgoMzIpLkRyYWdCb3hMYXllcik7Zi5YRHJhZ0JveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7dmFyIHA9dC5jYWxsKHRoaXMpfHx0aGlzO3AuYWRkQ2xhc3MoInktZHJhZy1ib3gtbGF5ZXIiKTtwLl9oYXNDb3JuZXJzPSExO3JldHVybiBwfWsobCx0KTtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihwLG0sbil7dC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscCxtLG4pO3RoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihwKXt0LnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6cC50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnAuYm90dG9tUmlnaHQueX19KX07bC5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24ocCl7cCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfTtsLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdC5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIik7Cn07bC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKTt9O3JldHVybiBsfShoKDMyKS5EcmFnQm94TGF5ZXIpO2YuWURyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2wuX0tFWURPV05fRVZFTlRfTkFNRV09ZnVuY3Rpb24obSl7cmV0dXJuIHAuX3Byb2Nlc3NLZXlkb3duKG0pfTsKcC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltsLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihtKXtyZXR1cm4gcC5fcHJvY2Vzc0tleXVwKG0pfTtyZXR1cm4gcH1rKGwsdCk7bC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHA9ZG9jdW1lbnRbbC5fRElTUEFUQ0hFUl9LRVldO251bGw9PXAmJihwPW5ldyBsLGRvY3VtZW50W2wuX0RJU1BBVENIRVJfS0VZXT1wKTtyZXR1cm4gcH07bC5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlET1dOX0VWRU5UX05BTUUscC5rZXlDb2RlLHApfTtsLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlVUF9FVkVOVF9OQU1FLHAua2V5Q29kZSxwKX07bC5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobC5fS0VZRE9XTl9FVkVOVF9OQU1FLApwKX07bC5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGwuX0tFWURPV05fRVZFTlRfTkFNRSxwKX07bC5wcm90b3R5cGUub25LZXlVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGwuX0tFWVVQX0VWRU5UX05BTUUscCl9O2wucHJvdG90eXBlLm9mZktleVVwPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobC5fS0VZVVBfRVZFTlRfTkFNRSxwKX07cmV0dXJuIGx9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX0tleSI7ZC5fS0VZRE9XTl9FVkVOVF9OQU1FPSJrZXlkb3duIjtkLl9LRVlVUF9FVkVOVF9OQU1FPSJrZXl1cCI7Zi5LZXk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmCihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXtmdW5jdGlvbiBuKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuX2xhc3RNb3VzZVBvc2l0aW9uPXt4Oi0xLHk6LTF9O3EuX3RyYW5zbGF0b3I9dC5nZXRUcmFuc2xhdG9yKG0pO3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VPVkVSX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRV09bjtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX01PVVNFT1VUX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRURPV05fRVZFTlRfTkFNRV09CmZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX1dIRUVMX0VWRU5UX05BTUUpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX0RCTENMSUNLX0VWRU5UX05BTUUpfTtyZXR1cm4gcX1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCksCnE9bltwLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09cSYmKHE9bmV3IHAobSksbltwLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9O3AucHJvdG90eXBlLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZk1vdXNlTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vbk1vdXNlRG93bj1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZNb3VzZURvd249ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRURPV05fRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VVUF9FVkVOVF9OQU1FLAptKX07cC5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFVVBfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25XaGVlbD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1dIRUVMX0VWRU5UX05BTUUsbSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZldoZWVsPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fV0hFRUxfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25EYmxDbGljaz1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX0RCTENMSUNLX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZkRibENsaWNrPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fREJMQ0xJQ0tfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaD1mdW5jdGlvbihtLG4scSwKdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3UrIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpO2lmKCJwYWdlIj09PXV8fHRoaXMuZXZlbnRJbnNpZGUobSxuKSl0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihuLmNsaWVudFgsbi5jbGllbnRZKSx0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQocSx0aGlzLmxhc3RNb3VzZVBvc2l0aW9uKCksbil9O3AucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHQuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKG0sbil9O3AucHJvdG90eXBlLmxhc3RNb3VzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9ufTtyZXR1cm4gcH0oaCgyNCkuRGlzcGF0Y2hlcik7ZC5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiOwpkLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtkLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjtkLl9NT1VTRU9VVF9FVkVOVF9OQU1FPSJtb3VzZW91dCI7ZC5fTU9VU0VET1dOX0VWRU5UX05BTUU9Im1vdXNlZG93biI7ZC5fTU9VU0VVUF9FVkVOVF9OQU1FPSJtb3VzZXVwIjtkLl9XSEVFTF9FVkVOVF9OQU1FPSJ3aGVlbCI7ZC5fREJMQ0xJQ0tfRVZFTlRfTkFNRT0iZGJsY2xpY2siO2YuTW91c2U9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMCk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8CnRoaXM7bi5fdHJhbnNsYXRvcj10LmdldFRyYW5zbGF0b3IobSk7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0sCnEscC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gbn1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCkscT1uW3AuX0RJU1BBVENIRVJfS0VZXTtudWxsPT1xJiYocT1uZXcgcChtKSxuW3AuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX07cC5wcm90b3R5cGUub25Ub3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vblRvdWNoTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNITU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaE1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwKbSl9O3AucHJvdG90eXBlLm9uVG91Y2hFbmQ9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSEVORF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaEVuZD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uVG91Y2hDYW5jZWw9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaENhbmNlbD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24obSxuLHEsdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciKwp1KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigiZWxlbWVudCIhPT11fHx0aGlzLmV2ZW50SW5zaWRlKG0sbikpe209bi5jaGFuZ2VkVG91Y2hlczt1PXt9O2Zvcih2YXIgeD1bXSxBPTA7QTxtLmxlbmd0aDtBKyspe3ZhciB5PW1bQV0sdz15LmlkZW50aWZpZXI7eT10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbih5LmNsaWVudFgseS5jbGllbnRZKTtudWxsIT15JiYodVt3XT15LHgucHVzaCh3KSl9MDx4Lmxlbmd0aCYmdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHEseCx1LG4pfX07cC5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24obSxuKXtyZXR1cm4gdC5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUobSxuKX07cmV0dXJuIHB9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX1RvdWNoIjtkLl9UT1VDSFNUQVJUX0VWRU5UX05BTUU9InRvdWNoc3RhcnQiO2QuX1RPVUNITU9WRV9FVkVOVF9OQU1FPQoidG91Y2htb3ZlIjtkLl9UT1VDSEVORF9FVkVOVF9OQU1FPSJ0b3VjaGVuZCI7ZC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRT0idG91Y2hjYW5jZWwiO2YuVG91Y2g9ZH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09bCYmKGw9d2luZG93LmRldmljZVBpeGVsUmF0aW8pO3RoaXMuc2NyZWVuV2lkdGg9azt0aGlzLnNjcmVlbkhlaWdodD10O3RoaXMuZGV2aWNlUGl4ZWxSYXRpbz1sO3RoaXMucGl4ZWxXaWR0aD1rKmw7dGhpcy5waXhlbEhlaWdodD10Kmw7dGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTtoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LGwpfWguc2l6ZVBpeGVscz1mdW5jdGlvbihrLHQsbCxwKXt2YXIgbT1rLmNhbnZhczttLndpZHRoPXQqcDttLmhlaWdodD1sKnA7bS5zdHlsZS53aWR0aD10KyJweCI7bS5zdHlsZS5oZWlnaHQ9CmwrInB4IjtrLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7ay5zY2FsZShwLHApfTtoLnByb3RvdHlwZS5ibGl0PWZ1bmN0aW9uKGssdCxsKXt2b2lkIDA9PT10JiYodD0wKTt2b2lkIDA9PT1sJiYobD0wKTtrLmRyYXdJbWFnZSh0aGlzLmNhbnZhcyx0LGwsdGhpcy5zY3JlZW5XaWR0aCx0aGlzLnNjcmVlbkhlaWdodCl9O2gucHJvdG90eXBlLmJsaXRDZW50ZXI9ZnVuY3Rpb24oayx0LGwpe3ZvaWQgMD09PXQmJih0PTApO3ZvaWQgMD09PWwmJihsPTApO3RoaXMuYmxpdChrLE1hdGguZmxvb3IodC10aGlzLnNjcmVlbldpZHRoLzIpLE1hdGguZmxvb3IobC10aGlzLnNjcmVlbkhlaWdodC8yKSl9O2gucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihrLHQsbCl7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBwPXRoaXMuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLnNjcmVlbldpZHRoPWs7dGhpcy5zY3JlZW5IZWlnaHQ9dDt0aGlzLnBpeGVsV2lkdGg9aypwO3RoaXMucGl4ZWxIZWlnaHQ9dCpwOwpoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LHApO2wmJnRoaXMuY3R4LnRyYW5zbGF0ZShrLzIsay8yKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5waXhlbFdpZHRoLGw9dGhpcy5waXhlbEhlaWdodCxwPXRoaXMuY3R4O3Auc2F2ZSgpO3Auc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtudWxsPT1rP3AuY2xlYXJSZWN0KDAsMCx0LGwpOihwLmZpbGxTdHlsZT1rLHAuZmlsbFJlY3QoMCwwLHQsbCkpO3AucmVzdG9yZSgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5nZXRJbWFnZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCl9O3JldHVybiBofSgpO2YuQ2FudmFzQnVmZmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9jbGlja2VkRG93bj0hMTtuLl9kb3VibGVDbGlja2luZz0hMTtuLl9vbkNsaWNrQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bihxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAocSx1KX07bi5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVEYmxDbGljayhxLAp1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bih1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAodVtxWzBdXSx4KX07bi5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLl9jbGlja2VkRG93bj0hMX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25EYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTsKdGhpcy5fdG91Y2hEaXNwYXRjaGVyPXQuVG91Y2guZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVDbGlja0Rvd249ZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYodGhpcy5fY2xpY2tlZERvd249ITAsdGhpcy5fY2xpY2tlZFBvaW50PW4pfTttLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tVcD1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXMseD10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2NsaWNrZWREb3duJiZtLl9wb2ludHNFcXVhbCh4LHRoaXMuX2NsaWNrZWRQb2ludCkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt1Ll9kb3VibGVDbGlja2luZ3x8dS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHgsCnEpfSwwKTt0aGlzLl9jbGlja2VkRG93bj0hMX07bS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcztuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uobik7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITA7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4scSk7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1Ll9kb3VibGVDbGlja2luZz0hMX0sMCl9O20uX3BvaW50c0VxdWFsPWZ1bmN0aW9uKG4scSl7cmV0dXJuIG4ueD09PXEueCYmbi55PT09cS55fTttLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25Eb3VibGVDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRvdWJsZUNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuQ2xpY2s9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fZHJhZ2dpbmc9ITE7bi5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMDtuLl9tb3VzZUZpbHRlcj1tLl9ERUZBVUxUX01PVVNFX0ZJTFRFUjsKbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9zdGFydERyYWcocSx1KX07bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2RvRHJhZyhxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2VuZERyYWcocSx1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSx4KXtyZXR1cm4gbi5fc3RhcnREcmFnKHVbcVswXV0seCl9O24uX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2RvRHJhZyh1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2VuZERyYWcodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9CmZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9dC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spfTsKbS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbj0KZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3JldHVybiB0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50P3t4OmwuTWF0aC5jbGFtcChuLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6bC5NYXRoLmNsYW1wKG4ueSwwLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpfTpufTttLnByb3RvdHlwZS5fc3RhcnREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJiF0aGlzLl9tb3VzZUZpbHRlcihxKXx8KG49dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKSx0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmKHEucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcmFnZ2luZz0hMCx0aGlzLl9kcmFnT3JpZ2luPW4sdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbikpKX07bS5wcm90b3R5cGUuX2RvRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnZ2luZyYmCnRoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihuKSl9O20ucHJvdG90eXBlLl9lbmREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJjAhPT1xLmJ1dHRvbnx8IXRoaXMuX2RyYWdnaW5nfHwodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKG4pKSl9O20ucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PSExfTttLnByb3RvdHlwZS5tb3VzZUZpbHRlcj1mdW5jdGlvbihuKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX21vdXNlRmlsdGVyPW4pfTttLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKG4pfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2QuX0RFRkFVTFRfTU9VU0VfRklMVEVSPWZ1bmN0aW9uKHApe3JldHVybiAwPT09cC5idXR0b259O2YuRHJhZz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHUseCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9CnV9Zm9yKHZhciB5IGluIHgpeC5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09eFt5XSk7dS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQS5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEEpfSx0PWgoMSksbD1oKDEzKSxwPWgoMyksbT1oKDApLG49aCgyNSk7ZD1oKDE1KTt2YXIgcT1oKDI2KTtoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgoQSx5KXt2YXIgdz11LmNhbGwodGhpcyl8fHRoaXM7dy5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH07dy5fd2hlZWxDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVXaGVlbEV2ZW50KEMsRyl9O3cuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVUb3VjaFN0YXJ0KEMsRyl9O3cuX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIHcuX2hhbmRsZVBpbmNoKEMsRyl9O3cuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHcuX2hhbmRsZVRvdWNoRW5kKEMpfTsKdy5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihDKXtyZXR1cm4gdy5faGFuZGxlVG91Y2hFbmQoQyl9O3cuX3BhbkVuZENhbGxiYWNrcz1uZXcgbS5DYWxsYmFja1NldDt3Ll96b29tRW5kQ2FsbGJhY2tzPW5ldyBtLkNhbGxiYWNrU2V0O3cuX3Bhblpvb21VcGRhdGVDYWxsYmFja3M9bmV3IG0uQ2FsbGJhY2tTZXQ7dy5feFNjYWxlcz1uZXcgbS5TZXQ7dy5feVNjYWxlcz1uZXcgbS5TZXQ7dy5fZHJhZ0ludGVyYWN0aW9uPW5ldyBuLkRyYWc7dy5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKTt3Ll90b3VjaElkcz10Lm1hcCgpO3cuX21pbkRvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21heERvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21pbkRvbWFpblZhbHVlcz1uZXcgbS5NYXA7dy5fbWF4RG9tYWluVmFsdWVzPW5ldyBtLk1hcDtudWxsIT1BJiZ3LmFkZFhTY2FsZShBKTtudWxsIT15JiZ3LmFkZFlTY2FsZSh5KTtyZXR1cm4gd31rKHgsdSk7eC5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259O3gucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKEEpezAhPT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5fd2hlZWxGaWx0ZXI9QSl9O3gucHJvdG90eXBlLnBhbj1mdW5jdGlvbihBKXt2YXIgeT10aGlzO3RoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24odyl7dy5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih3LEEueCkpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbih3KXt3LnBhbih5Ll9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHcsQS55KSl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX07eC5wcm90b3R5cGUuem9vbT1mdW5jdGlvbihBLHksdyl7dmFyIEM9dGhpczt2b2lkIDA9PT13JiYodz0hMCk7aWYobnVsbCE9eSl7dmFyIEc9eS54O3ZhciBEPXkueTt3JiYodGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXtCPUMuX2NvbnN0cmFpbmVkWm9vbShCLApBLEcpO0c9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pLHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQixBLEQpO0Q9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pKX10aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1HPyhJWzFdK0lbMF0pLzI6Ryl9KTt0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1EPyhJWzFdK0lbMF0pLzI6RCl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKTtyZXR1cm57em9vbUFtb3VudDpBLGNlbnRlclZhbHVlOntjZW50ZXJYOkcsY2VudGVyWTpEfX19O3gucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oQSl7dS5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKEEpOwp0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1sLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O3gucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3UucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07eC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24oQSx5KXtmb3IodmFyIHc9MDt3PEEubGVuZ3RoJiYyPnRoaXMuX3RvdWNoSWRzLnNpemUoKTt3Kyspe3ZhciBDPUFbd107dGhpcy5fdG91Y2hJZHMuc2V0KEMudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbQ10pKX19Owp4LnByb3RvdHlwZS5faGFuZGxlUGluY2g9ZnVuY3Rpb24oQSx5KXt2YXIgdz10aGlzO2lmKCEoMj50aGlzLl90b3VjaElkcy5zaXplKCkpKXt2YXIgQz10aGlzLl90b3VjaElkcy52YWx1ZXMoKTtpZih0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKENbMF0pKSYmdGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzFdKSkpe3ZhciBHPXguX3BvaW50RGlzdGFuY2UoQ1swXSxDWzFdKTtpZigwIT09Ryl7QS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3cuX3RvdWNoSWRzLmhhcyhPLnRvU3RyaW5nKCkpJiZ3Ll90b3VjaElkcy5zZXQoTy50b1N0cmluZygpLHcuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoeVtPXSkpfSk7QT10aGlzLl90b3VjaElkcy52YWx1ZXMoKTt2YXIgRD14Ll9wb2ludERpc3RhbmNlKEFbMF0sQVsxXSk7aWYoMCE9PUQpe3ZhciBCPUcvRCxJPUEubWFwKGZ1bmN0aW9uKE8sCkgpe3JldHVybnt4OihPLngtQ1tIXS54KS9CLHk6KE8ueS1DW0hdLnkpL0J9fSk7Rz14LmNlbnRlclBvaW50KENbMF0sQ1sxXSk7Rz10aGlzLnpvb20oQixHKTtBPUcuY2VudGVyVmFsdWU7dmFyIE49Ry56b29tQW1vdW50O0c9QS5jZW50ZXJYO0E9QS5jZW50ZXJZO0Q9Qy5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm57eDpJW0hdLngqTitPLngseTpJW0hdLnkqTitPLnl9fSk7dGhpcy5wYW4oe3g6Ry0oRFswXS54K0RbMV0ueCkvMix5OkEtKERbMF0ueStEWzFdLnkpLzJ9KX19fX19O3guY2VudGVyUG9pbnQ9ZnVuY3Rpb24oQSx5KXtyZXR1cm57eDooTWF0aC5taW4oQS54LHkueCkrTWF0aC5tYXgoQS54LHkueCkpLzIseTooTWF0aC5tYXgoQS55LHkueSkrTWF0aC5taW4oQS55LHkueSkpLzJ9fTt4Ll9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKEEseSl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhNYXRoLm1heChBLngseS54KS1NYXRoLm1pbihBLngseS54KSwyKStNYXRoLnBvdyhNYXRoLm1heChBLnksCnkueSktTWF0aC5taW4oQS55LHkueSksMikpfTt4LnByb3RvdHlwZS5faGFuZGxlVG91Y2hFbmQ9ZnVuY3Rpb24oQSl7dmFyIHk9dGhpcztBLmZvckVhY2goZnVuY3Rpb24odyl7eS5fdG91Y2hJZHMucmVtb3ZlKHcudG9TdHJpbmcoKSl9KTswPHRoaXMuX3RvdWNoSWRzLnNpemUoKSYmdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3gucHJvdG90eXBlLl9oYW5kbGVXaGVlbEV2ZW50PWZ1bmN0aW9uKEEseSl7dGhpcy5fd2hlZWxGaWx0ZXIoeSkmJihBPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQoQSkmJih5LnByZXZlbnREZWZhdWx0KCksdGhpcy56b29tKE1hdGgucG93KDIsKDAhPT15LmRlbHRhWT95LmRlbHRhWTp5LmRlbHRhWCkqKHkuZGVsdGFNb2RlP3guX1BJWEVMU19QRVJfTElORToxKSouMDAyKSxBKSx0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKSkpfTt4LnByb3RvdHlwZS5fY29uc3RyYWluZWRab29tPQpmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuY29uc3RyYWluZWRab29tKEEseSx3LHRoaXMubWluRG9tYWluRXh0ZW50KEEpLHRoaXMubWF4RG9tYWluRXh0ZW50KEEpLHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3gucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKEEseSl7cmV0dXJuIHEuY29uc3RyYWluZWRUcmFuc2xhdGlvbihBLHksdGhpcy5taW5Eb21haW5WYWx1ZShBKSx0aGlzLm1heERvbWFpblZhbHVlKEEpKX07eC5wcm90b3R5cGUuX3NldHVwRHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIEE9dGhpczt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uY29uc3RyYWluZWRUb0NvbXBvbmVudCgpO3ZhciB5O3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChmdW5jdGlvbigpe3JldHVybiB5PW51bGx9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKGZ1bmN0aW9uKHcsQyl7Mjw9QS5fdG91Y2hJZHMuc2l6ZSgpfHwKKEEucGFuKHt4OihudWxsPT15P3cueDp5LngpLUMueCx5OihudWxsPT15P3cueTp5LnkpLUMueX0pLHk9Qyl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKGZ1bmN0aW9uKCl7cmV0dXJuIEEuX3BhbkVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9KX07eC5wcm90b3R5cGUuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHM9ZnVuY3Rpb24oQSl7cmV0dXJuIG51bGwhPXRoaXMubWluRG9tYWluRXh0ZW50KEEpJiZudWxsIT10aGlzLm1heERvbWFpbkV4dGVudChBKSYmIShBIGluc3RhbmNlb2YgcC5MaW5lYXIpJiYhKEEgaW5zdGFuY2VvZiBwLlRpbWUpfTt4LnByb3RvdHlwZS54U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feFNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pO3JldHVybiBBfTt4LnByb3RvdHlwZS55U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feVNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pOwpyZXR1cm4gQX07eC5wcm90b3R5cGUuYWRkWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuYWRkKEEpfTt4LnByb3RvdHlwZS5yZW1vdmVYU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feFNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5hZGRZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5hZGQoQSl9O3gucHJvdG90eXBlLnJlbW92ZVlTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl95U2NhbGVzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoQSk7CnJldHVybiB0aGlzfTt4LnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21heERvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5taW5Eb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21pbkRvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21heERvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5zZXRNaW5NYXhEb21haW5WYWx1ZXNUbz1mdW5jdGlvbihBKXt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpOwp0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3ZhciB5PUEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSx3PXlbMV07dGhpcy5taW5Eb21haW5WYWx1ZShBLHlbMF0pO3RoaXMubWF4RG9tYWluVmFsdWUoQSx3KTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKEEpe3RoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuYWRkKEEpOwpyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub2ZmUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307cmV0dXJuIHh9KGQuSW50ZXJhY3Rpb24pO2guX1BJWEVMU19QRVJfTElORT0xMjA7Zi5QYW5ab29tPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX292ZXJDb21wb25lbnQ9ITE7bi5fcG9pbnRlckVudGVyQ2FsbGJhY2tzPQpuZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyRXhpdENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZU1vdmVDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVNb3VzZUV2ZW50KHEsdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZVRvdWNoRXZlbnQodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj10LlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX2hhbmRsZU1vdXNlRXZlbnQ9ZnVuY3Rpb24obixxKXtxPXRoaXMuX21vdXNlRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLHEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudD1mdW5jdGlvbihuLHEpe3E9dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sCnEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlUG9pbnRlckV2ZW50PWZ1bmN0aW9uKG4scSl7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3ZhciB1PXRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pO3UmJnE/KHRoaXMuX292ZXJDb21wb25lbnR8fHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpOnRoaXMuX292ZXJDb21wb25lbnQmJnRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mobik7dGhpcy5fb3ZlckNvbXBvbmVudD11JiZxfTttLnByb3RvdHlwZS5vblBvaW50ZXJFbnRlcj1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRW50ZXI9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZShuKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlck1vdmU9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyTW92ZT1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlckV4aXQ9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRXhpdD1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDE1KS5JbnRlcmFjdGlvbik7Zi5Qb2ludGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDIwKTtmLm1lbVRodW5rPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXRbbF09YXJndW1lbnRzW2xdO3ZhciBwPXQuc2xpY2UoMCwKLTEpLG09ay5tZW1vaXplKHRbdC5sZW5ndGgtMV0pO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscT1wLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gdS5hcHBseShuKX0pO3JldHVybiBtLmFwcGx5KHZvaWQgMCxxKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg0OSk7Zi5tZW1vaXplPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtmb3IodmFyIHU9W10seD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspdVt4XT1hcmd1bWVudHNbeF07aWYobilyZXR1cm4gbTt4PWsuc2lnbkFycmF5KHUpO3ZvaWQgMD09PXB8fHAuaXNEaWZmZXJlbnQoeCk/KHEmJmNvbnNvbGUubG9nKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxwPXgsbT10LmFwcGx5KHRoaXMsdSkpOnEmJmNvbnNvbGUubG9nKCJjYWNoZSBoaXQhIik7cmV0dXJuIG19dmFyIHA9dm9pZCAwLG0sbj0hMSxxPSExO2wuZG9Mb2NrZWQ9ZnVuY3Rpb24odSl7aWYobil0aHJvdyBFcnJvcigiTG9ja2luZyBhbiBhbHJlYWR5IGxvY2tlZCBtZW1vaXplIGZ1bmN0aW9uISIpOwpuPSEwO3U9dS5hcHBseSh0aGlzKTtuPSExO3JldHVybiB1fTtsLmxvZ1BlcmZvcm1hbmNlPWZ1bmN0aW9uKHUpe3ZvaWQgMD09PXUmJih1PSEwKTtxPXU7cmV0dXJuIHRoaXN9O3JldHVybiBsfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCgyNyksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1KXt2b2lkIDA9PT11JiYodT0idmVydGljYWwiKTt1PW4uY2FsbCh0aGlzLHUpfHx0aGlzO3UuX2NsdXN0ZXJPZmZzZXRzPW5ldyBsLk1hcDtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4geS5yYW5nZUJhbmQoKX12YXIgeD10aGlzLEE9bi5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykseT10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO0Eud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OkEud2lkdGg7QS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9BLmhlaWdodDp1O3ZhciB3PUEueCxDPUEueTtBLng9dGhpcy5faXNWZXJ0aWNhbD9mdW5jdGlvbihHLEQsQil7cmV0dXJuIHcoRyxELEIpK3guX2NsdXN0ZXJPZmZzZXRzLmdldChCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiB3KEcsRCxCKX07QS55PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKSt4Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9O3JldHVybiBBfTtxLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHU9CnRoaXMseD10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7cmV0dXJuIHUuX2NsdXN0ZXJPZmZzZXRzLnNldChBLHguc2NhbGUoU3RyaW5nKHkpKS14LnJhbmdlQmFuZCgpLzIpfSl9O3EucHJvdG90eXBlLl9tYWtlSW5uZXJTY2FsZT1mdW5jdGlvbigpe3ZhciB1PW5ldyB0LkNhdGVnb3J5O3UuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oQSx5KXtyZXR1cm4gU3RyaW5nKHkpfSkpO3ZhciB4PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5hdHRyKHAuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3UucmFuZ2UoWzAseChudWxsLDAsbnVsbCldKTtyZXR1cm4gdX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDbHVzdGVyUG9zaXRpb24oKTtyZXR1cm4gbi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX07cmV0dXJuIHF9KHAuQmFyKTtmLkNsdXN0ZXJlZEJhcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoOCksbj1oKDMpLHE9aCgwKSx1PWgoNDQpLHg9aCg0NSksQT1oKDYpLHk9aCgzNSksdz1oKDIpO2Q9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9zdGFydEFuZ2xlPTA7RC5fZW5kQW5nbGU9MipNYXRoLlBJO0QuX2xhYmVsRm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtELl9sYWJlbHNFbmFibGVkPSExO0QuaW5uZXJSYWRpdXMoMCk7RC5vdXRlclJhZGl1cyhmdW5jdGlvbigpe3ZhciBCPUQuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChELndpZHRoKCktCkIueCxCLngpLE1hdGgubWF4KEQuaGVpZ2h0KCktQi55LEIueSkpfSk7RC5hZGRDbGFzcygicGllLXBsb3QiKTtELmF0dHIoImZpbGwiLGZ1bmN0aW9uKEIsSSl7cmV0dXJuIFN0cmluZyhJKX0sbmV3IG4uQ29sb3IpO0QuX3N0cm9rZURyYXdlcnM9bmV3IHEuTWFwO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgRD10aGlzO0MucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gQi5hdHRhY2hUbyhELl9yZW5kZXJBcmVhKX0pfTtHLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKEQsQixJKXtDLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxELEIsSSk7RD10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QueCsiLCIrRC55KyIpIik7RD1NYXRoLm1pbihNYXRoLm1heCh0aGlzLndpZHRoKCktCkQueCxELngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktRC55LEQueSkpO251bGwhPXRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSYmdGhpcy5pbm5lclJhZGl1cygpLnNjYWxlLnJhbmdlKFswLERdKTtudWxsIT10aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUmJnRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBxLldpbmRvdy53YXJuKCJPbmx5IG9uZSBkYXRhc2V0IGlzIHN1cHBvcnRlZCBpbiBQaWUgcGxvdHMiKSx0aGlzO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3ZhciBCPW5ldyB4LkFyY091dGxpbmVTVkdEcmF3ZXI7dGhpcy5faXNTZXR1cCYmQi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKTsKdGhpcy5fc3Ryb2tlRHJhd2Vycy5zZXQoRCxCKTtDLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsRCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsRCk7dGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoRCkucmVtb3ZlKCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxEKTt0aGlzLl9zdGFydEFuZ2xlcz1bXTt0aGlzLl9lbmRBbmdsZXM9W107cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt2b2lkIDA9PT1EJiYoRD10aGlzLmRhdGFzZXRzKCkpO3ZhciBJPUMucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLApEKS5ub2RlcygpO0QuZm9yRWFjaChmdW5jdGlvbihOKXtOPUIuX3N0cm9rZURyYXdlcnMuZ2V0KE4pO251bGwhPU4mJkkucHVzaC5hcHBseShJLE4uZ2V0VmlzdWFsUHJpbWl0aXZlcygpKX0pO3JldHVybiB0LnNlbGVjdEFsbChJKX07Ry5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe0MucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkFyY1NWR0RyYXdlcn0sZnVuY3Rpb24oKXt5Lndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFBpZSBQbG90ISIpO3JldHVybiBudWxsfSl9O0cucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTsKcmV0dXJuIEMucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxEKS5tYXAoZnVuY3Rpb24oSSl7SS5wb3NpdGlvbi54Kz1CLndpZHRoKCkvMjtJLnBvc2l0aW9uLnkrPUIuaGVpZ2h0KCkvMjt2YXIgTj10LnNlbGVjdChCLl9zdHJva2VEcmF3ZXJzLmdldChJLmRhdGFzZXQpLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoSS5pbmRleCkpO0kuc3Ryb2tlU2VsZWN0aW9uPU47cmV0dXJuIEl9KX07Ry5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fU0VDVE9SX1ZBTFVFX0tFWSl9O0cucHJvdG90eXBlLmlubmVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fSU5ORVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEcuX0lOTkVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5vdXRlclJhZGl1cz0KZnVuY3Rpb24oRCxCKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChHLl9PVVRFUl9SQURJVVNfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoRy5fT1VURVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fc3RhcnRBbmdsZTt0aGlzLl9zdGFydEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fZW5kQW5nbGU7dGhpcy5fZW5kQW5nbGU9RDt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7CnRoaXMuX2xhYmVsc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcy53aWR0aCgpLzIsST10aGlzLmhlaWdodCgpLzI7RD10aGlzLl9zbGljZUluZGV4Rm9yUG9pbnQoe3g6RC54LUIseTpELnktSX0pO3JldHVybiBudWxsPT1EP1tdOlt0aGlzLmVudGl0aWVzKClbRF1dfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPUMucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxJPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSxOPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTsKQi5kPWZ1bmN0aW9uKE8sSCxLKXtyZXR1cm4gdC5hcmMoKS5pbm5lclJhZGl1cyhJKE8sSCxLKSkub3V0ZXJSYWRpdXMoTihPLEgsSykpLnN0YXJ0QW5nbGUoRC5fc3RhcnRBbmdsZXNbSF0pLmVuZEFuZ2xlKEQuX2VuZEFuZ2xlc1tIXSkoTyxIKX07cmV0dXJuIEJ9O0cucHJvdG90eXBlLl91cGRhdGVQaWVBbmdsZXM9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlY3RvclZhbHVlKCkmJjAhPT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXt2YXIgRD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksQj10aGlzLmRhdGFzZXRzKClbMF0sST10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KEIpO0k9dC5waWUoKS5zb3J0KG51bGwpLnN0YXJ0QW5nbGUodGhpcy5fc3RhcnRBbmdsZSkuZW5kQW5nbGUodGhpcy5fZW5kQW5nbGUpLnZhbHVlKGZ1bmN0aW9uKE4sTyl7cmV0dXJuIEQoTixPLEIpfSkoSSk7dGhpcy5fc3RhcnRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uc3RhcnRBbmdsZX0pOwp0aGlzLl9lbmRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uZW5kQW5nbGV9KX19O0cucHJvdG90eXBlLl9waWVDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsQj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsST1NYXRoLnNpbihEKTtEPU1hdGguY29zKEQpO3ZhciBOPU1hdGguc2luKEIpO0I9TWF0aC5jb3MoQik7dmFyIE87aWYoMDw9SSYmMDw9TilpZigwPD1EJiYwPD1CKXt2YXIgSD1EO3ZhciBLPU89MDt2YXIgTT1OfWVsc2UgMD5EJiYwPkI/KEg9MCxPPS1CLEs9MCxNPUkpOjA8PUQmJjA+Qj8oSD1ELE89LUIsSz0wLE09SSk6MD5EJiYwPD1CJiYoSz1PPUg9MSxNPU1hdGgubWF4KEksTikpO2Vsc2UgMDw9SSYmMD5OPzA8PUQmJjA8PUI/KEg9TWF0aC5tYXgoRCxCKSxNPUs9Tz0xKTowPkQmJgowPkI/KEg9MCxPPTEsSz0tTixNPUkpOjA8PUQmJjA+Qj8oSD1ELE89MSxLPS1OLE09MSk6MD5EJiYwPD1CJiYoSD1CLEs9Tz0xLE09SSk6MD5JJiYwPD1OPzA8PUQmJjA8PUI/KEg9MSxPPTAsSz0tSSxNPU4pOjA+RCYmMD5CPyhIPTEsTz1NYXRoLm1heCgtRCwtQiksTT1LPTEpOjA8PUQmJjA+Qj8oSD0xLE89LUIsSz0tSSxNPTEpOjA+RCYmMDw9QiYmKEg9MSxPPS1ELEs9MSxNPU4pOjA+SSYmMD5OJiYoMDw9RCYmMDw9Qj8oSD1CLE89MCxLPS1JLE09MCk6MD5EJiYwPkI/KEg9MCxPPS1ELEs9LU4sTT0wKTowPD1EJiYwPkI/KE89SD0xLEs9TWF0aC5tYXgoRCwtQiksTT0xKTowPkQmJjA8PUImJihIPUIsTz0tRCxLPTEsTT0wKSk7cmV0dXJue3g6MD09SytNPzA6Sy8oSytNKSp0aGlzLndpZHRoKCkseTowPT1IK08/MDpILyhIK08pKnRoaXMuaGVpZ2h0KCl9fTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CmlmKDA9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBEO3ZhciBCPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxJPXRoaXMuZGF0YXNldHMoKVswXSxOPUQuZ2V0KEkpLmZpbHRlcihmdW5jdGlvbihPLEgpe3JldHVybiBHLl9pc1ZhbGlkRGF0YShCKE8sSCxJKSl9KTtELnNldChJLE4pO3JldHVybiBEfTtHLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbihEKXtyZXR1cm4gcS5NYXRoLmlzVmFsaWROdW1iZXIoRCkmJjA8PUR9O0cucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEQsQixJKXt2YXIgTj13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7aWYoIUcuX2lzVmFsaWREYXRhKE4oRCxCLEkpKSlyZXR1cm57eDpOYU4seTpOYU59O3ZhciBPPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKShELEIsSSk7RD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkoRCwKQixJKTtPPShPK0QpLzI7RD10LnBpZSgpLnNvcnQobnVsbCkudmFsdWUoZnVuY3Rpb24oSCxLKXtIPU4oSCxLLEkpO3JldHVybiBHLl9pc1ZhbGlkRGF0YShIKT9IOjB9KS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKShJLmRhdGEoKSk7Qj0oRFtCXS5zdGFydEFuZ2xlK0RbQl0uZW5kQW5nbGUpLzI7cmV0dXJue3g6TypNYXRoLnNpbihCKSx5Oi1PKk1hdGguY29zKEIpfX07Ry5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpO3RoaXMuX2xhYmVsc0VuYWJsZWQmJnEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZHJhd0xhYmVscygpfSxEKTt2YXIgST10aGlzLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3ZhciBIPQp3LlBsb3QuYXBwbHlEcmF3U3RlcHMoSSxPKTtCLl9zdHJva2VEcmF3ZXJzLmdldChPKS5kcmF3KE4uZ2V0KE8pLEgpfSl9O0cucHJvdG90eXBlLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBwLk51bGx9XX07Ry5wcm90b3R5cGUuX3NsaWNlSW5kZXhGb3JQb2ludD1mdW5jdGlvbihEKXt2YXIgQj1NYXRoLnNxcnQoTWF0aC5wb3coRC54LDIpK01hdGgucG93KEQueSwyKSksST1NYXRoLmFjb3MoLUQueS9CKTswPkQueCYmKEk9MipNYXRoLlBJLUkpO2ZvcihEPTA7RDx0aGlzLl9zdGFydEFuZ2xlcy5sZW5ndGg7RCsrKWlmKHRoaXMuX3N0YXJ0QW5nbGVzW0RdPEkmJnRoaXMuX2VuZEFuZ2xlc1tEXT5JKXt2YXIgTj1EO2JyZWFrfWlmKHZvaWQgMCE9PU4pe0Q9dGhpcy5kYXRhc2V0cygpWzBdO3ZhciBPPUQuZGF0YSgpW05dO0k9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKE8sCk4sRCk7RD10aGlzLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTyxOLEQpO2lmKEI+SSYmQjxEKXJldHVybiBOfXJldHVybiBudWxsfTtHLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxJPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE49bmV3IGwuU3ZnQ29udGV4dChJLm5vZGUoKSksTz1uZXcgbC5DYWNoZU1lYXN1cmVyKE4pLEg9bmV3IGwuV3JpdGVyKE8sTiksSz10aGlzLmRhdGFzZXRzKClbMF07dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChLKS5mb3JFYWNoKGZ1bmN0aW9uKE0sTCl7dmFyIFE9RC5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKE0sTCxLKTtpZihxLk1hdGguaXNWYWxpZE51bWJlcihRKSl7UT1ELl9sYWJlbEZvcm1hdHRlcihRLE0sTCxLKTt2YXIgVD1PLm1lYXN1cmUoUSksWD0oRC5fZW5kQW5nbGVzW0xdK0QuX3N0YXJ0QW5nbGVzW0xdKS8KMixhYT1ELm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0Qub3V0ZXJSYWRpdXMoKS5zY2FsZSYmKGFhPUQub3V0ZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShhYSkpO3ZhciBsYT1ELmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0QuaW5uZXJSYWRpdXMoKS5zY2FsZSYmKGxhPUQuaW5uZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShsYSkpO2xhPShhYStsYSkvMjthYT1NYXRoLnNpbihYKSpsYS1ULndpZHRoLzI7bGE9LU1hdGguY29zKFgpKmxhLVQuaGVpZ2h0LzI7dmFyIFo9W3t4OmFhLHk6bGF9LHt4OmFhLHk6bGErVC5oZWlnaHR9LHt4OmFhK1Qud2lkdGgseTpsYX0se3g6YWErVC53aWR0aCx5OmxhK1QuaGVpZ2h0fV07KFg9Wi5ldmVyeShmdW5jdGlvbihiYSl7cmV0dXJuIE1hdGguYWJzKGJhLngpPD1ELndpZHRoKCkvMiYmTWF0aC5hYnMoYmEueSk8PUQuaGVpZ2h0KCkvMn0pKSYmKFg9Wi5tYXAoZnVuY3Rpb24oYmEpe3JldHVybiBELl9zbGljZUluZGV4Rm9yUG9pbnQoYmEpfSkuZXZlcnkoZnVuY3Rpb24oYmEpe3JldHVybiBiYT09PQpMfSkpO009Qi5maWxsKE0sTCxLKTtNPTEuNipxLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsTSk8cS5Db2xvci5jb250cmFzdCgiYmxhY2siLE0pO2FhPUkuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYWErIiwiK2xhKyIpIik7YWEuY2xhc3NlZChNPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKTthYS5zdHlsZSgidmlzaWJpbGl0eSIsWD8iaW5oZXJpdCI6ImhpZGRlbiIpO0gud3JpdGUoUSxULndpZHRoLFQuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxhYS5ub2RlKCkpfX0pfTtyZXR1cm4gR30ody5QbG90KTtkLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiO2QuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyI7ZC5fU0VDVE9SX1ZBTFVFX0tFWT0ic2VjdG9yLXZhbHVlIjtmLlBpZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9Cnl9Zm9yKHZhciBHIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109d1tHXSk7eS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQy5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEMpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoMTQpLG49aCg2KSxxPWgoMzQpLHU9aCgzKSx4PWgoMCksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24gdygpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLl9sYWJlbHNFbmFibGVkPSExO0MuX2xhYmVsPW51bGw7Qy5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IHAuTnVsbCk7Qy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTtDLmF0dHIoImZpbGwiLChuZXcgdS5Db2xvcikucmFuZ2UoKVswXSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuUmVjdGFuZ2xlU1ZHRHJhd2VyfSxmdW5jdGlvbihDKXtyZXR1cm4gbmV3IG0uUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKEMpfSl9Owp3LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9eS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxCPUdbdy5fWDJfS0VZXSxJPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLE49R1t3Ll9ZMl9LRVldLE89dGhpcy54KCkuc2NhbGUsSD10aGlzLnkoKS5zY2FsZTtudWxsIT1CPyhHLndpZHRoPWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5hYnMoQihLLE0sTCktRChLLE0sTCkpfSxHLng9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBNYXRoLm1pbihCKEssTSxMKSxEKEssTSxMKSl9KTooRy53aWR0aD1mdW5jdGlvbigpe3JldHVybiBDLl9yZWN0YW5nbGVXaWR0aChPKX0sRy54PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gRChLLE0sTCktLjUqRy53aWR0aChLLE0sTCl9KTtudWxsIT1OPyhHLmhlaWdodD1mdW5jdGlvbihLLApNLEwpe3JldHVybiBNYXRoLmFicyhOKEssTSxMKS1JKEssTSxMKSl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIE1hdGgubWF4KE4oSyxNLEwpLEkoSyxNLEwpKS1HLmhlaWdodChLLE0sTCl9KTooRy5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoSCl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkoSyxNLEwpLS41KkcuaGVpZ2h0KEssTSxMKX0pO2RlbGV0ZSBHW3cuX1gyX0tFWV07ZGVsZXRlIEdbdy5fWTJfS0VZXTtyZXR1cm4gR307dy5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoInJlY3RhbmdsZXMiKX1dfTt3LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oQyl7cmV0dXJuIngyIj09PUM/eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywKIngiKToieTIiPT09Qz95LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ5Iik6eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcyxDKX07dy5wcm90b3R5cGUueD1mdW5jdGlvbihDLEcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueDIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1gyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS54Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9YMl9LRVkpfTt3LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsCkcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueTIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1kyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS55Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMl9LRVkpfTt3LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0dW0sST1ELmluZGV4LE49RC5kYXRhc2V0O0Q9Ry54KEIsCkksTik7dmFyIE89Ry55KEIsSSxOKSxIPUcud2lkdGgoQixJLE4pO0I9Ry5oZWlnaHQoQixJLE4pO3JldHVybiBEPD1DLngmJkMueDw9RCtIJiZPPD1DLnkmJkMueTw9TytCfSl9O3cucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSxDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3cucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRyxELEIpe3JldHVybnt4OkIueChDLEcsRCkseTpCLnkoQyxHLEQpLHdpZHRoOkIud2lkdGgoQyxHLEQpLGhlaWdodDpCLmhlaWdodChDLEcsRCl9fTt3LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9sYWJlbDt0aGlzLl9sYWJlbD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDsKdGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYoQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEk9Qi54KEMsRyxEKSxOPUIueShDLEcsRCksTz1CLndpZHRoKEMsRyxEKTtDPUIuaGVpZ2h0KEMsRyxEKTtyZXR1cm57eDpJK08vMix5Ok4rQy8yfX07dy5wcm90b3R5cGUuX3JlY3RhbmdsZVdpZHRoPWZ1bmN0aW9uKEMpe2lmKEMgaW5zdGFuY2VvZiB1LkNhdGVnb3J5KXJldHVybiBDLnJhbmdlQmFuZCgpOwp2YXIgRz1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD10LnNldCh4LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi5kYXRhKCkubWFwKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEcoTyxILE4pLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuK059KSxCPXguTWF0aC5taW4oRCwwKTtEPXguTWF0aC5tYXgoRCwwKTt2YXIgST1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLUkpL01hdGguYWJzKEQtQil9O3cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEM9bmV3IHguTWFwLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oRCl7dmFyIEI9RC5kYXRhKCkubWFwKGZ1bmN0aW9uKEksTil7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKEcueChJLE4sRCkpJiYKeC5NYXRoLmlzVmFsaWROdW1iZXIoRy55KEksTixEKSkmJnguTWF0aC5pc1ZhbGlkTnVtYmVyKEcud2lkdGgoSSxOLEQpKSYmeC5NYXRoLmlzVmFsaWROdW1iZXIoRy5oZWlnaHQoSSxOLEQpKT9JOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJnguV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRy5fZHJhd0xhYmVscygpfSxDKX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7cmV0dXJuIEMuX2RyYXdMYWJlbChHLEQsQil9KX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbD0KZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMsST10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxOPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE89bmV3IGwuU3ZnQ29udGV4dChOLm5vZGUoKSksSD1uZXcgbC5DYWNoZU1lYXN1cmVyKE8pLEs9bmV3IGwuV3JpdGVyKEgsTyk7Tz10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBNPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTD1NYXRoLm1pbi5hcHBseShudWxsLE8pLFE9TWF0aC5tYXguYXBwbHkobnVsbCxPKSxUPU1hdGgubWluLmFwcGx5KG51bGwsTSksWD1NYXRoLm1heC5hcHBseShudWxsLE0pO0MuZ2V0KEcpLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpe2lmKG51bGwhPWFhKXt2YXIgWj0iIitCLmxhYmVsKCkoYWEsbGEsRyksYmE9SC5tZWFzdXJlKFopLGVhPUkueChhYSxsYSxHKSxjYT1JLnkoYWEsbGEsRyksa2E9SS53aWR0aChhYSxsYSxHKSxZPUkuaGVpZ2h0KGFhLGxhLEcpOwpiYS5oZWlnaHQ8PVkmJmJhLndpZHRoPD1rYSYmKFk9KFktYmEuaGVpZ2h0KS8yLGVhKz0oa2EtYmEud2lkdGgpLzIsY2ErPVksa2E9e21pbjplYSxtYXg6ZWErYmEud2lkdGh9LFk9e21pbjpjYSxtYXg6Y2ErYmEuaGVpZ2h0fSxrYS5taW48THx8a2EubWF4PlF8fFkubWluPFR8fFkubWF4Plh8fEIuX292ZXJsYXlMYWJlbChrYSxZLGxhLEQsQyl8fChhYT1JLmZpbGwoYWEsbGEsRyksYWE9MS42KnguQ29sb3IuY29udHJhc3QoIndoaXRlIixhYSk8eC5Db2xvci5jb250cmFzdCgiYmxhY2siLGFhKSxlYT1OLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2VhKyIsIitjYSsiKSIpLGVhLmNsYXNzZWQoYWE/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLEsud3JpdGUoWixiYS53aWR0aCxiYS5oZWlnaHQse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciJ9LGVhLm5vZGUoKSkpKX19KX07dy5wcm90b3R5cGUuX292ZXJsYXlMYWJlbD1mdW5jdGlvbihDLApHLEQsQixJKXtmb3IodmFyIE49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTz10aGlzLmRhdGFzZXRzKCksSD1CO0g8Ty5sZW5ndGg7SCsrKWZvcih2YXIgSz1PW0hdLE09SS5nZXQoSyksTD1IPT09Qj9EKzE6MDtMPE0ubGVuZ3RoO0wrKylpZih4LkRPTS5pbnRlcnNlY3RzQkJveChDLEcsdGhpcy5fZW50aXR5QkJveChNW0xdLEwsSyxOKSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiB3fShoKDE2KS5YWVBsb3QpO2QuX1gyX0tFWT0ieDIiO2QuX1kyX0tFWT0ieTIiO2YuUmVjdGFuZ2xlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeSx3KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgRyBpbiB3KXcuaGFzT3duUHJvcGVydHkoRykmJih5W0ddPXdbR10pO3kucHJvdG90eXBlPW51bGw9PT13P09iamVjdC5jcmVhdGUodyk6KEMucHJvdG90eXBlPXcucHJvdG90eXBlLG5ldyBDKX0sdD1oKDMxKSwKbD1oKDYpLHA9aCg0OCksbT1oKDcpLG49aCgxNCkscT1oKDMpLHU9aCgwKSx4PWgoMTkpLEE9aCgyKTtkPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoKXt2YXIgQz15LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIEc9bmV3IG0uRWFzaW5nO0cuc3RhcnREZWxheSg1KTtHLnN0ZXBEdXJhdGlvbigyNTApO0cubWF4VG90YWxEdXJhdGlvbihBLlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0MuYW5pbWF0b3IoeC5BbmltYXRvci5NQUlOLEcpO0MuYXR0cigib3BhY2l0eSIsLjYpO0MuYXR0cigiZmlsbCIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtDLnNpemUoNik7dmFyIEQ9dC5jaXJjbGUoKTtDLnN5bWJvbChmdW5jdGlvbigpe3JldHVybiBEfSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIHkucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzLmNhbGwodGhpcywKQykubWFwKGZ1bmN0aW9uKEQpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy5zaXplKCkpKEQuZGF0dW0sRC5pbmRleCxELmRhdGFzZXQpO0QuZGlhbWV0ZXI9QjtyZXR1cm4gRH0pfTt3LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIG5ldyBsLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwLlN5bWJvbFNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBuLkNhbnZhc0RyYXdlcihELHAubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKEMsZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnN5bWJvbCgpKX0sZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnNpemUoKSl9KSl9KX07dy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NJWkVfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkody5fU0laRV9LRVksCkMsRyk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NZTUJPTF9LRVkpO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHcuX1NZTUJPTF9LRVkse2FjY2Vzc29yOkN9KTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTtHLmQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBEKEIsSSxOKSgwKShudWxsKX07Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RyxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksRz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpO0MueD1HO0MueT1EO0MudHJhbnNmb3JtPWZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4idHJhbnNsYXRlKCIrRyhCLEksTikrIiwiK0QoQixJLE4pKyIpIn07Qy5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpO3JldHVybiBDfTt3LnByb3RvdHlwZS5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIEM9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiBmdW5jdGlvbihELEIsCkkpe3JldHVybiBDKEQsQixJKShHKEQsQixJKSkobnVsbCl9fTt3LnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEMpe3JldHVybnt4OkMucG9zaXRpb24ueC1DLmRpYW1ldGVyLzIseTpDLnBvc2l0aW9uLnktQy5kaWFtZXRlci8yLHdpZHRoOkMuZGlhbWV0ZXIsaGVpZ2h0OkMuZGlhbWV0ZXJ9fTt3LnByb3RvdHlwZS5fZW50aXR5VmlzaWJsZU9uUGxvdD1mdW5jdGlvbihDLEcpe3ZhciBEPXttaW46Ry50b3BMZWZ0LngsbWF4OkcuYm90dG9tUmlnaHQueH07Rz17bWluOkcudG9wTGVmdC55LG1heDpHLmJvdHRvbVJpZ2h0Lnl9O0M9dGhpcy5fZW50aXR5Qm91bmRzKEMpO3JldHVybiB1LkRPTS5pbnRlcnNlY3RzQkJveChELEcsQyl9O3cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oQyl7dmFyIEc9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpOwpyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihJKXt2YXIgTj1JLmRhdHVtLE89SS5pbmRleCxIPUkuZGF0YXNldDtJPUcoTixPLEgpO3ZhciBLPUQoTixPLEgpO049QihOLE8sSCk7cmV0dXJuIEktTi8yPD1DLngmJkMueDw9SStOLzImJkstTi8yPD1DLnkmJkMueTw9SytOLzJ9KX07cmV0dXJuIHd9KGgoMTYpLlhZUGxvdCk7ZC5fU0laRV9LRVk9InNpemUiO2QuX1NZTUJPTF9LRVk9InN5bWJvbCI7Zi5TY2F0dGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSx4KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj11fWZvcih2YXIgeSBpbiB4KXguaGFzT3duUHJvcGVydHkoeSkmJih1W3ldPXhbeV0pO3UucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEEucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBBKX0sdD1oKDcpLGw9aCg2KSxwPWgoNDcpLG09aCgzKSxuPWgoMzUpLHE9aCgyKTsKZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KCl7dmFyIEE9dS5jYWxsKHRoaXMpfHx0aGlzO0EuYWRkQ2xhc3MoInNlZ21lbnQtcGxvdCIpO0EuYXR0cigic3Ryb2tlIiwobmV3IG0uQ29sb3IpLnJhbmdlKClbMF0pO0EuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIEF9ayh4LHUpO3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAuU2VnbWVudFNWR0RyYXdlcn0sZnVuY3Rpb24oKXtuLndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFNlZ21lbnQgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgdC5OdWxsfV19O3gucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT0KZnVuY3Rpb24oQSl7cmV0dXJuIngyIj09PUE/dS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieCIpOiJ5MiI9PT1BP3UucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsInkiKTp1LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS54PWZ1bmN0aW9uKEEseSl7aWYobnVsbD09QSlyZXR1cm4gdS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnguY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLngyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLngyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1gyX0tFWSl9O3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT0KQSlyZXR1cm4gdS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnkuY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLnkyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnkyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1kyX0tFWSl9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQT11LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7QS54MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTtBLngyPW51bGw9PXRoaXMueDIoKT9xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTpxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSk7QS55MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKQS55Mj1udWxsPT10aGlzLnkyKCk/cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpO3JldHVybiBBfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEEpe0E9dGhpcy5lbnRpdHlOZWFyZXN0KEEpO3JldHVybiBudWxsIT1BP1tBXTpbXX07eC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpe3ZhciB3PXttaW46QS50b3BMZWZ0LngsbWF4OkEuYm90dG9tUmlnaHQueH07QT17bWluOkEudG9wTGVmdC55LG1heDpBLmJvdHRvbVJpZ2h0Lnl9fWVsc2Ugdz1BLEE9eTtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcodyxBKX07eC5wcm90b3R5cGUuX2VudGl0aWVzSW50ZXJzZWN0aW5nPWZ1bmN0aW9uKEEseSl7dmFyIHc9dGhpcyxDPVtdLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oRCl7dy5fbGluZUludGVyc2VjdHNCb3goRCwKQSx5LEcpJiZDLnB1c2goRCl9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKEEseSx3LEMpe3ZhciBHPXRoaXMsRD1DLngxKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEI9Qy54MihBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KSxJPUMueTEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7QT1DLnkyKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpO2lmKHkubWluPD1EJiZEPD15Lm1heCYmdy5taW48PUkmJkk8PXcubWF4fHx5Lm1pbjw9QiYmQjw9eS5tYXgmJncubWluPD1BJiZBPD13Lm1heClyZXR1cm4hMDt2YXIgTj17eDpELHk6SX0sTz17eDpCLHk6QX0sSD1be3g6eS5taW4seTp3Lm1pbn0se3g6eS5taW4seTp3Lm1heH0se3g6eS5tYXgseTp3Lm1heH0se3g6eS5tYXgseTp3Lm1pbn1dO3JldHVybiAwPEguZmlsdGVyKGZ1bmN0aW9uKEssTSl7cmV0dXJuIDAhPT1NP0cuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChOLE8sSyxIW00tCjFdKSYmRy5fbGluZUludGVyc2VjdHNTZWdtZW50KEssSFtNLTFdLE4sTyk6ITF9KS5sZW5ndGh9O3gucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQ9ZnVuY3Rpb24oQSx5LHcsQyl7ZnVuY3Rpb24gRyhELEIsSSl7cmV0dXJuKEIueC1ELngpKihJLnktQi55KS0oQi55LUQueSkqKEkueC1CLngpfXJldHVybiAwPkcoQSx5LHcpKkcoQSx5LEMpfTtyZXR1cm4geH0oaCgxNikuWFlQbG90KTtkLl9YMl9LRVk9IngyIjtkLl9ZMl9LRVk9InkyIjtmLlNlZ21lbnQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDcpLHA9aCgyMCksbT0KaCgwKTtkPWgoNTApO3ZhciBuPWgoMik7aD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KCl7dmFyIHg9cS5jYWxsKHRoaXMpfHx0aGlzO3guX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geC5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB4LngoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geC55KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHguX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKEEseSx3LEMpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrKEEseSx3LEMpfSk7eC5fc3RhY2tlZEV4dGVudD1wLm1lbVRodW5rKHguX3N0YWNraW5nUmVzdWx0LGZ1bmN0aW9uKCl7cmV0dXJuIHgueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB4Ll9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSxmdW5jdGlvbihBLHksdyl7cmV0dXJuIG0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudChBLHksdyl9KTt4Ll9iYXNlbGluZVZhbHVlPTA7eC5fc3RhY2tpbmdPcmRlcj0KImJvdHRvbXVwIjt4LmFkZENsYXNzKCJzdGFja2VkLWFyZWEtcGxvdCIpO3guYXR0cigiZmlsbC1vcGFjaXR5IiwxKTt4Ll9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5beC5fYmFzZWxpbmVWYWx1ZV19O3guY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpO3JldHVybiB4fWsodSxxKTt1LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbD09eD9xLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOng/KG0uV2luZG93Lndhcm4oIldhcm5pbmc6IFN0YWNrZWQgQXJlYSBQbG90IGRvZXMgbm90IHN1cHBvcnQgY3JvcHBlZCByZW5kZXJpbmcuIiksdGhpcyk6cS5wcm90b3R5cGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQuY2FsbCh0aGlzLHgpfTt1LnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuTnVsbH07dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07dS5wcm90b3R5cGUueD1mdW5jdGlvbih4LEEpe2lmKG51bGw9PXgpcmV0dXJuIHEucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1BP3EucHJvdG90eXBlLnguY2FsbCh0aGlzLHgpOnEucHJvdG90eXBlLnguY2FsbCh0aGlzLHgsQSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnk9ZnVuY3Rpb24oeCxBKXtpZihudWxsPT14KXJldHVybiBxLnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09QT9xLnByb3RvdHlwZS55LmNhbGwodGhpcyx4KTpxLnByb3RvdHlwZS55LmNhbGwodGhpcyx4LEEpO3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj0KeDt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiBxLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkLmNhbGwodGhpcyl9O3UucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKS5zY2FsZS5zY2FsZSh0aGlzLl9iYXNlbGluZVZhbHVlKTt4PXt4MTowLHkxOngseDI6dGhpcy53aWR0aCgpLHkyOnh9O3RoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUseCl9O3UucHJvdG90eXBlLl91cGRhdGVZU2NhbGU9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKTt4PXgmJnguc2NhbGU7bnVsbCE9eCYmKHguYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLHguYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX07CnUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtxLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih4KXtyZXR1cm4ieSI9PT14P1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnEucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMseCl9O3UucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHg9dGhpcy5kYXRhc2V0cygpLEE9dGhpcy54KCkuYWNjZXNzb3IseT14Lm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdC5zZXQoQy5kYXRhKCkubWFwKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEEoRyxELEMpLnRvU3RyaW5nKCl9KSkudmFsdWVzKCl9KSx3PXUuX2RvbWFpbktleXMoeCxBKTt5LnNvbWUoZnVuY3Rpb24oQyl7cmV0dXJuIEMubGVuZ3RoIT09CncubGVuZ3RofSkmJm0uV2luZG93Lndhcm4oInRoZSBkb21haW5zIGFjcm9zcyB0aGUgZGF0YXNldHMgYXJlIG5vdCB0aGUgc2FtZS4gUGxvdCBtYXkgcHJvZHVjZSB1bmludGVuZGVkIGJlaGF2aW9yLiIpfX07dS5fZG9tYWluS2V5cz1mdW5jdGlvbih4LEEpe3ZhciB5PXQuc2V0KCk7eC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oQyxHKXt5LmFkZChBKEMsRyx3KSl9KX0pO3JldHVybiB5LnZhbHVlcygpfTt1LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geChELEIsSSl7cmV0dXJuIG0uU3RhY2tpbmcubm9ybWFsaXplS2V5KEMoRCxCLEkpKX12YXIgQT10aGlzLHk9cS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLHc9dGhpcy55KCkuYWNjZXNzb3IsQz10aGlzLngoKS5hY2Nlc3NvcixHPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7eS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3Iobi5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksCmZ1bmN0aW9uKEQsQixJKXtyZXR1cm4gQS55KCkuc2NhbGUuc2NhbGUoK3coRCxCLEkpK0cuZ2V0KEkpLmdldCh4KEQsQixJKSkub2Zmc2V0KX0sZnVuY3Rpb24oRCxCLEkpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZShHLmdldChJKS5nZXQoeChELEIsSSkpLm9mZnNldCl9KTtyZXR1cm4geX07dS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oeCxBLHkpe3ZhciB3PXEucHJvdG90eXBlLl9waXhlbFBvaW50LmNhbGwodGhpcyx4LEEseSksQz10aGlzLngoKS5hY2Nlc3Nvcih4LEEseSk7eD10aGlzLnkoKS5hY2Nlc3Nvcih4LEEseSk7eT10aGlzLnkoKS5zY2FsZS5zY2FsZSgreCt0aGlzLl9zdGFja2luZ1Jlc3VsdCgpLmdldCh5KS5nZXQobS5TdGFja2luZy5ub3JtYWxpemVLZXkoQykpLm9mZnNldCk7cmV0dXJue3g6dy54LHl9fTtyZXR1cm4gdX0oZC5BcmVhKTtmLlN0YWNrZWRBcmVhPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSwKeCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9dX1mb3IodmFyIHkgaW4geCl4Lmhhc093blByb3BlcnR5KHkpJiYodVt5XT14W3ldKTt1LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihBLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQSl9LHQ9aCg1KSxsPWgoOCkscD1oKDIwKSxtPWgoMCksbj1oKDI3KSxxPWgoMik7ZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KEEpe3ZvaWQgMD09PUEmJihBPSJ2ZXJ0aWNhbCIpO3ZhciB5PXUuY2FsbCh0aGlzLEEpfHx0aGlzO3kuX2V4dHJlbWFGb3JtYXR0ZXI9bC5pZGVudGl0eSgpO3kuX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkubGVuZ3RoKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKHcsCkMsRyxEKXtyZXR1cm4gbS5TdGFja2luZy5zdGFjayh3LEMsRyxEKX0pO3kuX3N0YWNrZWRFeHRlbnQ9cC5tZW1UaHVuayh5Ll9zdGFja2luZ1Jlc3VsdCxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX2ZpbHRlckZvclByb3BlcnR5KHkuX2lzVmVydGljYWw/InkiOiJ4Iil9LGZ1bmN0aW9uKHcsQyxHKXtyZXR1cm4gbS5TdGFja2luZy5zdGFja2VkRXh0ZW50KHcsQyxHKX0pO3kuYWRkQ2xhc3MoInN0YWNrZWQtYmFyLXBsb3QiKTt5Ll9zdGFja2luZ09yZGVyPSJib3R0b211cCI7cmV0dXJuIHl9ayh4LHUpO3gucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24oQSl7aWYobnVsbD09QSlyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPUE7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLmV4dHJlbWFGb3JtYXR0ZXI9ZnVuY3Rpb24oQSl7aWYoMD09PQphcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9leHRyZW1hRm9ybWF0dGVyO3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXI9QTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKG4uQmFyLl9MQUJFTF9BUkVBX0NMQVNTLCEwKTt2YXIgQT1uZXcgdC5TdmdDb250ZXh0KHRoaXMuX2xhYmVsQXJlYS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIoQSk7dGhpcy5fd3JpdGVyPW5ldyB0LldyaXRlcih0aGlzLl9tZWFzdXJlcixBKX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKE8sSCl7dmFyIEs9dy5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IoKSxNPXcud2lkdGgoKSxMPXcuaGVpZ2h0KCk7Ty5mb3JFYWNoKGZ1bmN0aW9uKFEpe2lmKFEuZXh0ZW50IT09CkMpe3ZhciBUPXcuZXh0cmVtYUZvcm1hdHRlcigpKFEuZXh0ZW50KSxYPXcuX21lYXN1cmVyLm1lYXN1cmUoVCksYWE9US5zdGFja2VkRGF0dW0sbGE9YWEub3JpZ2luYWxEYXR1bSxaPWFhLm9yaWdpbmFsSW5kZXg7YWE9YWEub3JpZ2luYWxEYXRhc2V0O3cuX2lzRGF0dW1PblNjcmVlbihLLE0sTCxsYSxaLGFhKSYmKGxhPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3Iody5hdHRyKG4uQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKGxhLFosYWEpLFo9RC5zY2FsZShRLmV4dGVudCksUT13Ll9nZXRQb3NpdGlvbkF0dHIoRy5zY2FsZShRLmF4aXNWYWx1ZSksbGEpK2xhLzIsUT1IKHcuX2lzVmVydGljYWw/e3g6USx5Olp9Ont4OloseTpRfSxYLGxhKSxUPXkoVCx7dG9wTGVmdDpRLGJvdHRvbVJpZ2h0Ont4OlEueCtYLndpZHRoLHk6US55K1guaGVpZ2h0fX0sbGEpLE4ucHVzaChUKSl9fSl9ZnVuY3Rpb24geShPLEgsSyl7dmFyIE09SC50b3BMZWZ0LEw9TS54LFE9TS55O009SC5ib3R0b21SaWdodC54LQpILnRvcExlZnQueDtIPUguYm90dG9tUmlnaHQueS1ILnRvcExlZnQueTtLPXcuX2lzVmVydGljYWw/TT5LOkg+SztLfHwoTD13Ll9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTCsiLCAiK1ErIikiKSxMLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCksdy5fd3JpdGVyLndyaXRlKE8sTSxILHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxMLm5vZGUoKSkpO3JldHVybiBLfXZhciB3PXRoaXM7dS5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIEM9K3RoaXMuYmFzZWxpbmVWYWx1ZSgpLEc9dGhpcy5wb3NpdGlvbigpLnNjYWxlLEQ9dGhpcy5sZW5ndGgoKS5zY2FsZSxCPW0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSksST1CLm1pbmltdW1FeHRlbnRzLE49W107QShCLm1heGltdW1FeHRlbnRzLApmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54K3guX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLHk6dy5faXNWZXJ0aWNhbD9PLnktSDpPLnktSy8yfX0pO0EoSSxmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54LUgseTp3Ll9pc1ZlcnRpY2FsP08ueSt4Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUjpPLnktSy8yfX0pO04uc29tZShmdW5jdGlvbihPKXtyZXR1cm4gT30pJiZ0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoTSwKTCxRKXtyZXR1cm4gMD4rTyhNLEwsUSk/QyhNLEwsUSk6dyhNLEwsUSl9ZnVuY3Rpb24geShNLEwsUSl7cmV0dXJuIE1hdGguYWJzKHcoTSxMLFEpLUMoTSxMLFEpKX1mdW5jdGlvbiB3KE0sTCxRKXtyZXR1cm4gTi5zY2FsZSgrTyhNLEwsUSkrSy5nZXQoUSkuZ2V0KEcoTSxMLFEpKS5vZmZzZXQpfWZ1bmN0aW9uIEMoTSxMLFEpe3JldHVybiBOLnNjYWxlKEsuZ2V0KFEpLmdldChHKE0sTCxRKSkub2Zmc2V0KX1mdW5jdGlvbiBHKE0sTCxRKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoSChNLEwsUSkpfXZhciBEPXRoaXMsQj11LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxJPXRoaXMuX2lzVmVydGljYWw/InkiOiJ4IixOPXRoaXMubGVuZ3RoKCkuc2NhbGUsTz10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLEg9dGhpcy5wb3NpdGlvbigpLmFjY2Vzc29yLEs9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtCW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6CiJ3aWR0aCJdPXk7QltJXT1mdW5jdGlvbihNLEwsUSl7cmV0dXJuIEQuX2lzVmVydGljYWw/QShNLEwsUSk6QShNLEwsUSkteShNLEwsUSl9O3JldHVybiBCfTt4LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIEE9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp1LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4geH0obi5CYXIpO2QuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSPTU7Zi5TdGFja2VkQmFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgwKTtkPWgoMjcpO3ZhciBsPWgoMik7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2Nvbm5lY3RvcnNFbmFibGVkPSExO24uYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90Iik7cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnRvdGFsPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KG0uX1RPVEFMX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KG0uX1RPVEFMX0tFWSwKbixudWxsKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihuKXt2YXIgcT10aGlzO3RoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQmJnQuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd0Nvbm5lY3RvcnMoKX0sbil9O20ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7bj1wLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxuKTt0aGlzLl9jb25uZWN0b3JBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQVJFQV9DTEFTUywhMCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihuKXtyZXR1cm4ieSI9PT1uP1t0aGlzLl9leHRlbnRdOnAucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCm4pfTttLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksdT10aGlzLnkoKS5zY2FsZSx4PWwuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy50b3RhbCgpKTtudWxsPT10aGlzLmF0dHIoInkiKSYmKHEueT1mdW5jdGlvbihBLHksdyl7dmFyIEM9bi55KCkuYWNjZXNzb3IoQSx5LHcpO2lmKHgoQSx5LHcpKXJldHVybiBNYXRoLm1pbih1LnNjYWxlKEMpLHUuc2NhbGUoMCkpO0E9bi5fc3VidG90YWxzW3ldO2lmKDA9PT15KXJldHVybiAwPkM/dS5zY2FsZShBLUMpOnUuc2NhbGUoQSk7eT1uLl9zdWJ0b3RhbHNbeS0xXTtyZXR1cm4gQT55P3Uuc2NhbGUoQSk6dS5zY2FsZSh5KX0pO251bGw9PXRoaXMuYXR0cigiaGVpZ2h0IikmJihxLmhlaWdodD1mdW5jdGlvbihBLHksdyl7dmFyIEM9eChBLHksdyk7QT1uLnkoKS5hY2Nlc3NvcihBLHksdyk7aWYoQylyZXR1cm4gTWF0aC5hYnModS5zY2FsZShBKS0KdS5zY2FsZSgwKSk7Qz1uLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQyktdS5zY2FsZShDLUEpKTt5PW4uX3N1YnRvdGFsc1t5LTFdO3JldHVybiBNYXRoLmFicyh1LnNjYWxlKEMpLXUuc2NhbGUoeSkpfSk7cVsiY2xhc3MiXT1mdW5jdGlvbihBLHksdyl7dmFyIEM9IiI7bnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoQz1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IoQSx5LHcpKyIgIik7aWYoeChBLHksdykpcmV0dXJuIEMrbS5fQkFSX1RPVEFMX0NMQVNTO0E9bi55KCkuYWNjZXNzb3IoQSx5LHcpO3JldHVybiBDKygwPEE/bS5fQkFSX0dST1dUSF9DTEFTUzptLl9CQVJfREVDTElORV9DTEFTUyl9O3JldHVybiBxfTttLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3VidG90YWxzKCk7cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PQpmdW5jdGlvbihuKXt2YXIgcT10aGlzLHU9TnVtYmVyLk1BWF9WQUxVRSx4PU51bWJlci5NSU5fVkFMVUUsQT0wLHk9ITE7bi5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih3LEMpe3ZhciBHPXEueSgpLmFjY2Vzc29yKHcsQyxuKTsodz1xLnRvdGFsKCkuYWNjZXNzb3IodyxDLG4pKSYmMCE9PUN8fChBKz1HKTtxLl9zdWJ0b3RhbHMucHVzaChBKTtBPHUmJih1PUEpO0E+eCYmKHg9QSk7dyYmKEc8dSYmKHU9RyksRz54JiYoeD1HKSk7aWYoIXkmJncpe0M9Ry1BO2ZvcihHPTA7RzxxLl9zdWJ0b3RhbHMubGVuZ3RoO0crKylxLl9zdWJ0b3RhbHNbR10rPUM7eT0hMDtBKz1DO3UrPUM7eCs9Q319KTt0aGlzLl9leHRlbnQ9W3UseF19O20ucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxxPXRoaXMuZGF0YXNldHMoKVswXSx1PTE7dTxxLmRhdGEoKS5sZW5ndGg7dSsrKXt2YXIgeD11LTEsQT1xLmRhdGEoKVt1XSwKeT1xLmRhdGEoKVt4XTt5PW4ueCh5LHgscSk7dmFyIHc9bi54KEEsdSxxKStuLndpZHRoKEEsdSxxKSxDPW4ueShBLHUscSk7aWYoMDx0aGlzLl9zdWJ0b3RhbHNbdV0mJnRoaXMuX3N1YnRvdGFsc1t1XT50aGlzLl9zdWJ0b3RhbHNbeF18fDA+dGhpcy5fc3VidG90YWxzW3VdJiZ0aGlzLl9zdWJ0b3RhbHNbdV0+PXRoaXMuX3N1YnRvdGFsc1t4XSlDPW4ueShBLHUscSkrbi5oZWlnaHQoQSx1LHEpO3RoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIix5KS5hdHRyKCJ4MiIsdykuYXR0cigieTEiLEMpLmF0dHIoInkyIixDKX19O20ucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRhdGFzZXRzKCk7MDxuLmxlbmd0aCYmKG49bltuLmxlbmd0aC0xXSx0aGlzLl9zdWJ0b3RhbHM9W10sdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KG4pKX07cmV0dXJuIG19KGQuQmFyKTsKaC5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIjtoLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIjtoLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCI7aC5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiO2guX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSI7aC5fVE9UQUxfS0VZPSJ0b3RhbCI7Zi5XYXRlcmZhbGw9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7CnN3aXRjaChuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09bS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKG0uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpO249dC5zY2FsZU9yZGluYWwoKS5yYW5nZShtLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlICJDYXRlZ29yeTEwIjpjYXNlICJjYXRlZ29yeTEwIjpjYXNlICIxMCI6bj10LnNjYWxlT3JkaW5hbCh0LnNjaGVtZUNhdGVnb3J5MTApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjAiOmNhc2UgImNhdGVnb3J5MjAiOmNhc2UgIjIwIjpuPXQuc2NhbGVPcmRpbmFsKHQuc2NoZW1lQ2F0ZWdvcnkyMCk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGIiOmNhc2UgImNhdGVnb3J5MjBiIjpjYXNlICIyMGIiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGMiOmNhc2UgImNhdGVnb3J5MjBjIjpjYXNlICIyMGMiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYyk7CmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpO31xLl9kM1NjYWxlPW47cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBsLkFycmF5LnVuaXEobil9O20ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTttLmludmFsaWRhdGVDb2xvckNhY2hlPWZ1bmN0aW9uKCl7bS5fcGxvdHRhYmxlQ29sb3JDYWNoZT1udWxsfTttLl9nZXRQbG90dGFibGVDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIG49W10scT10LnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLHU9bC5Db2xvci5jb2xvclRlc3QocSwiIikseD0wLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0wIik7bnVsbCE9QSYmeDx0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUyYmCihBIT09dXx8QSE9PW5bbi5sZW5ndGgtMV0pOyluLnB1c2goQSkseCsrLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0iK3gpO3EucmVtb3ZlKCk7cmV0dXJuIG59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3ZhciBxPXRoaXMuX2QzU2NhbGUobik7bj10aGlzLmRvbWFpbigpLmluZGV4T2Yobik7bj1NYXRoLmZsb29yKG4vdGhpcy5yYW5nZSgpLmxlbmd0aCk7cmV0dXJuIGwuQ29sb3IubGlnaHRlbkNvbG9yKHEsTWF0aC5sb2cobiptLl9MT09QX0xJR0hURU5fRkFDVE9SKzEpKX07bS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07bS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fZ2V0UmFuZ2U9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O3JldHVybiBtfShoKDE3KS5TY2FsZSk7ZC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjY7ZC5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2O2YuQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0ibGluZWFyIik7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChuKXtjYXNlICJsaW5lYXIiOnEuX2NvbG9yU2NhbGU9CnQuc2NhbGVMaW5lYXIoKTticmVhaztjYXNlICJsb2ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZUxvZygpO2JyZWFrO2Nhc2UgInNxcnQiOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVNxcnQoKTticmVhaztjYXNlICJwb3ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVBvdygpfWlmKG51bGw9PXEuX2NvbG9yU2NhbGUpdGhyb3cgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3EucmFuZ2UobS5SRURTKTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24obil7bj10LmV4dGVudChuKTtyZXR1cm4gbnVsbD09blswXXx8bnVsbD09blsxXT9bXTpufTttLnByb3RvdHlwZS5fZDNJbnRlcnBvbGF0ZWRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnJhbmdlKFswLDFdKS5pbnRlcnBvbGF0ZSh0aGlzLl9pbnRlcnBvbGF0ZUNvbG9ycygpKX07bS5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzPQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2NvbG9yUmFuZ2U7aWYoMj5uLmxlbmd0aCl0aHJvdyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHEpe3E9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHEpKTtxKj1uLmxlbmd0aC0xO3ZhciB1PU1hdGguZmxvb3IocSkseD1xLXU7cmV0dXJuIHQuaW50ZXJwb2xhdGVMYWIoblt1XSxuW01hdGguY2VpbChxKV0pKHgpfX19O20ucHJvdG90eXBlLl9yZXNldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5fZDNTY2FsZT10aGlzLl9kM0ludGVycG9sYXRlZFNjYWxlKCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O20ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpOzA8bi5sZW5ndGgmJnRoaXMuX3NldERvbWFpbihbbC5NYXRoLm1pbihuLAowKSxsLk1hdGgubWF4KG4sMCldKX07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yUmFuZ2V9O20ucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihuKXt0aGlzLl9jb2xvclJhbmdlPW47dGhpcy5fcmVzZXRTY2FsZSgpfTtyZXR1cm4gbX0oaCgxNykuU2NhbGUpO2QuUkVEUz0iI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7CmQuQkxVRVM9IiNGRkZGRkYgI0NDRkZGRiAjQTVGRkZEICM4NUY3RkIgIzZFRDNFRiAjNTVBN0UwICM0MTdGRDAgIzI1NDVEMyAjMEIwMkUxIi5zcGxpdCgiICIpO2QuUE9TTkVHPSIjMEIwMkUxICMyNTQ1RDMgIzQxN0ZEMCAjNTVBN0UwICM2RUQzRUYgIzg1RjdGQiAjQTVGRkZEICNDQ0ZGRkYgI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7Zi5JbnRlcnBvbGF0ZWRDb2xvcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT0KbC5jYWxsKHRoaXMpfHx0aGlzO20uX2QzU2NhbGU9dC5zY2FsZUxpbmVhcigpO3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24obSl7cmV0dXJuIG1bMF09PT1tWzFdP1ttWzBdLTEsbVsxXSsxXTptfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShtKX07cC5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5zY2FsZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5pbnZlcnQobSl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihtKXt0aGlzLmRvbWFpbihtKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obSl7dGhpcy5fZDNTY2FsZS5yYW5nZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChtKX07cC5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07CnAucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihtKS5uaWNlKG4pLmRvbWFpbigpfTtyZXR1cm4gcH0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuTGluZWFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxuKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgdSBpbiBuKW4uaGFzT3duUHJvcGVydHkodSkmJihtW3VdPW5bdV0pO20ucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHEucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBxKX0sdD1oKDEpLGw9aCgwKSxwPWgoMyk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKHEpe3ZvaWQgMD09PXEmJihxPTEwKTt2YXIgdT1tLmNhbGwodGhpcyl8fHRoaXM7dS5fZDNTY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fYmFzZT1xO3UuX3Bpdm90PXUuX2Jhc2U7dS5fc2V0RG9tYWluKHUuX2RlZmF1bHRFeHRlbnQoKSk7CmlmKDE+PXEpdGhyb3cgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgXHgzZSAxIik7cmV0dXJuIHV9ayhuLG0pO24ucHJvdG90eXBlLl9hZGp1c3RlZExvZz1mdW5jdGlvbihxKXt2YXIgdT0wPnE/LTE6MTtxKj11O3E8dGhpcy5fcGl2b3QmJihxKz0odGhpcy5fcGl2b3QtcSkvdGhpcy5fcGl2b3QpO3E9TWF0aC5sb2cocSkvTWF0aC5sb2codGhpcy5fYmFzZSk7cmV0dXJuIHEqdX07bi5wcm90b3R5cGUuX2ludmVydGVkQWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocSl7dmFyIHU9MD5xPy0xOjE7cT1NYXRoLnBvdyh0aGlzLl9iYXNlLHEqdSk7cTx0aGlzLl9waXZvdCYmKHE9dGhpcy5fcGl2b3QqKHEtMSkvKHRoaXMuX3Bpdm90LTEpKTtyZXR1cm4gcSp1fTtuLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0aGlzLl9hZGp1c3RlZExvZyhxKSl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5faW52ZXJ0ZWRBZGp1c3RlZExvZyh0aGlzLl9kM1NjYWxlLmludmVydChxKSl9OwpuLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKHEpfTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLmludmVydChxKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocSl7dGhpcy5kb21haW4ocSl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn07bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPXE7bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsClt0aGlzLl9hZGp1c3RlZExvZyhxWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhxWzFdKV0pfTtuLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcShHLEQsQil7cmV0dXJuW0csRCxCXS5zb3J0KGZ1bmN0aW9uKEksTil7cmV0dXJuIEktTn0pWzFdfXZhciB1PWwuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSx4PWwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSxBPXEodSx4LC10aGlzLl9waXZvdCkseT1xKHUseCx0aGlzLl9waXZvdCk7QT10aGlzLl9sb2dUaWNrcygtQSwtdSkubWFwKGZ1bmN0aW9uKEcpe3JldHVybi1HfSkucmV2ZXJzZSgpO3k9dGhpcy5fbG9nVGlja3MoeSx4KTt2YXIgdz1NYXRoLm1heCh1LAotdGhpcy5fcGl2b3QpLEM9TWF0aC5taW4oeCx0aGlzLl9waXZvdCk7dz10LnNjYWxlTGluZWFyKCkuZG9tYWluKFt3LENdKS50aWNrcyh0aGlzLl9ob3dNYW55VGlja3ModyxDKSk7QT1BLmNvbmNhdCh3KS5jb25jYXQoeSk7MT49QS5sZW5ndGgmJihBPXQuc2NhbGVMaW5lYXIoKS5kb21haW4oW3UseF0pLnRpY2tzKCkpO3JldHVybiBBfTtuLnByb3RvdHlwZS5fbG9nVGlja3M9ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzLEE9dGhpcy5faG93TWFueVRpY2tzKHEsdSk7aWYoMD09PUEpcmV0dXJuW107dmFyIHk9TWF0aC5mbG9vcihNYXRoLmxvZyhxKS9NYXRoLmxvZyh0aGlzLl9iYXNlKSksdz1NYXRoLmNlaWwoTWF0aC5sb2codSkvTWF0aC5sb2codGhpcy5fYmFzZSkpO0E9dC5yYW5nZSh3LHksLU1hdGguY2VpbCgody15KS9BKSk7eT10LnJhbmdlKHRoaXMuX2Jhc2UsMSwtKHRoaXMuX2Jhc2UtMSkpLm1hcChNYXRoLmZsb29yKTt2YXIgQz1sLkFycmF5LnVuaXEoeSk7QT1BLm1hcChmdW5jdGlvbihHKXtyZXR1cm4gQy5tYXAoZnVuY3Rpb24oRCl7cmV0dXJuIE1hdGgucG93KHguX2Jhc2UsCkctMSkqRH0pfSk7cmV0dXJuIGwuQXJyYXkuZmxhdHRlbihBKS5maWx0ZXIoZnVuY3Rpb24oRyl7cmV0dXJuIHE8PUcmJkc8PXV9KS5zb3J0KGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEctRH0pfTtuLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHEsdSl7dmFyIHg9dGhpcy5fYWRqdXN0ZWRMb2cobC5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxBPXRoaXMuX2FkanVzdGVkTG9nKGwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSk7cmV0dXJuIE1hdGguY2VpbCgodGhpcy5fYWRqdXN0ZWRMb2codSktdGhpcy5fYWRqdXN0ZWRMb2cocSkpLyhBLXgpKnAuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX07bi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fYmFzZV19O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj0KZnVuY3Rpb24ocSl7cmV0dXJuIHFbMF09PT1xWzFdPyhxPXFbMF0sMDxxP1txL3RoaXMuX2Jhc2UscSp0aGlzLl9iYXNlXTowPT09cT9bLXRoaXMuX2Jhc2UsdGhpcy5fYmFzZV06W3EqdGhpcy5fYmFzZSxxL3RoaXMuX2Jhc2VdKTpxfTtuLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtuLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fZDNTY2FsZS5yYW5nZShxKX07bi5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07cmV0dXJuIG59KGgoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtmLk1vZGlmaWVkTG9nPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2YuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uKHQpe2lmKDA+PXQpdGhyb3cgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGwpe2w9CmwuZG9tYWluKCk7dmFyIHA9TWF0aC5taW4obFswXSxsWzFdKTtsPU1hdGgubWF4KGxbMF0sbFsxXSk7dmFyIG09TWF0aC5jZWlsKHAvdCkqdDtwPTA9PT1wJXQ/W106W3BdO3ZhciBuPWsuTWF0aC5yYW5nZSgwLE1hdGguZmxvb3IoKGwtbSkvdCkrMSkubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBtK3EqdH0pO3JldHVybiBwLmNvbmNhdChuKS5jb25jYXQoMD09PWwldD9bXTpbbF0pfX07Zi5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbD10LmRlZmF1bHRUaWNrcygpO3JldHVybiBsLmZpbHRlcihmdW5jdGlvbihwLG0pe3JldHVybiAwPT09cCUxfHwwPT09bXx8bT09PWwubGVuZ3RoLTF9KX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTsKcC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDI4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1wLmNhbGwodGhpcyl8fHRoaXM7bi5fZDNTY2FsZT10LnNjYWxlVGltZSgpO24uYXV0b0RvbWFpbigpO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS50aWNrSW50ZXJ2YWw9ZnVuY3Rpb24obixxKXt2b2lkIDA9PT1xJiYocT0xKTt2YXIgdT10LnNjYWxlVGltZSgpO20udGltZUludGVydmFsVG9EM1RpbWUobikuZXZlcnkocSk7dS5kb21haW4odGhpcy5kb21haW4oKSk7dS5yYW5nZSh0aGlzLnJhbmdlKCkpO3JldHVybiB1LnRpY2tzKCl9O20ucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obil7aWYoblsxXTxuWzBdKXRocm93IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHAucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApuKX07bS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSxuZXcgRGF0ZSgiMTk3MC0wMS0wMiIpXX07bS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKG4pe3ZhciBxPW5bMF0uZ2V0VGltZSgpLHU9blsxXS5nZXRUaW1lKCk7cmV0dXJuIHE9PT11PyhuPW5ldyBEYXRlKHEpLG4uc2V0RGF0ZShuLmdldERhdGUoKS0xKSx1PW5ldyBEYXRlKHUpLHUuc2V0RGF0ZSh1LmdldERhdGUoKSsxKSxbbix1XSk6bn07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuc2NhbGUobmV3IERhdGUobikpfTttLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmludmVydChuKS5nZXRUaW1lKCl9O20ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW25bMF0udmFsdWVPZigpLG5bMV0udmFsdWVPZigpXX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRvbWFpbigpO3JldHVybltuWzBdLnZhbHVlT2YoKSxuWzFdLnZhbHVlT2YoKV19O20ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKG4pe3RoaXMuZG9tYWluKFtuZXcgRGF0ZShuWzBdKSxuZXcgRGF0ZShuWzFdKV0pfTttLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTttLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4obik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9OwptLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obil7dGhpcy5fZDNTY2FsZS5yYW5nZShuKX07bS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChuKX07bS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07bS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihuKS5uaWNlKCkuZG9tYWluKCl9O20udGltZUludGVydmFsVG9EM1RpbWU9ZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UgbC5UaW1lSW50ZXJ2YWwuc2Vjb25kOnJldHVybiB0LnRpbWVTZWNvbmQ7Y2FzZSBsLlRpbWVJbnRlcnZhbC5taW51dGU6cmV0dXJuIHQudGltZU1pbnV0ZTtjYXNlIGwuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIHQudGltZUhvdXI7Y2FzZSBsLlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIHQudGltZURheTsKY2FzZSBsLlRpbWVJbnRlcnZhbC53ZWVrOnJldHVybiB0LnRpbWVXZWVrO2Nhc2UgbC5UaW1lSW50ZXJ2YWwubW9udGg6cmV0dXJuIHQudGltZU1vbnRoO2Nhc2UgbC5UaW1lSW50ZXJ2YWwueWVhcjpyZXR1cm4gdC50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK24pO319O3JldHVybiBtfShoKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7Zi5UaW1lPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9QXJyYXk7Zi5hZGQ9ZnVuY3Rpb24obCxwKXtpZihsLmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiBsLm1hcChmdW5jdGlvbihtLG4pe3JldHVybiBsW25dK3Bbbl19KX07Zi51bmlxPWZ1bmN0aW9uKGwpe3ZhciBwPWsuc2V0KCksbT1bXTtsLmZvckVhY2goZnVuY3Rpb24obil7cC5oYXMoU3RyaW5nKG4pKXx8CihwLmFkZChTdHJpbmcobikpLG0ucHVzaChuKSl9KTtyZXR1cm4gbX07Zi5mbGF0dGVuPWZ1bmN0aW9uKGwpe3JldHVybiB0LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbCl9O2YuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24obCxwKXtmb3IodmFyIG09W10sbj0wO248cDtuKyspbVtuXT0iZnVuY3Rpb24iPT09dHlwZW9mIGw/bChuKTpsO3JldHVybiBtfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dGhpcy5tYXhJbmRleD10aGlzLm1pbkluZGV4PXRoaXMuZXhpdEluZGV4PXRoaXMuZW50cnlJbmRleD1rO3RoaXMuYnVja2V0VmFsdWU9dDt0aGlzLm1heFZhbHVlPXRoaXMubWluVmFsdWU9bH1oLnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKGspe3JldHVybiBrPT10aGlzLmJ1Y2tldFZhbHVlfTtoLnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbihrLHQpe2s8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9ayx0aGlzLm1pbkluZGV4PQp0KTtrPnRoaXMubWF4VmFsdWUmJih0aGlzLm1heFZhbHVlPWssdGhpcy5tYXhJbmRleD10KTt0aGlzLmV4aXRJbmRleD10fTtoLnByb3RvdHlwZS5nZXRVbmlxdWVJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIGs9W3RoaXMuZW50cnlJbmRleCx0aGlzLm1heEluZGV4LHRoaXMubWluSW5kZXgsdGhpcy5leGl0SW5kZXhdO3JldHVybiBrLmZpbHRlcihmdW5jdGlvbih0LGwpe3JldHVybiAwPT1sfHx0IT1rW2wtMV19KX07cmV0dXJuIGh9KCk7Zi5CdWNrZXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gbnVsbCE9PQp0JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuY2FsbENhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgcD10aGlzLG09W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspbVtuXT1hcmd1bWVudHNbbl07dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3EuYXBwbHkocCxtKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gbH0oaCg1OCkuU2V0KTtmLkNhbGxiYWNrU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe2Z1bmN0aW9uIG0odSl7dS89MjU1O3JldHVybi4wMzkyOD49dT91LzEyLjkyOmwucG93KCh1Ky4wNTUpLzEuMDU1LDIuNCl9dmFyIG49dC5yZ2IocCk7cD1tKG4ucik7dmFyIHE9bShuLmcpO249bShuLmIpO3JldHVybi4yMTI2KnArLjcxNTIqcSsuMDcyMipufXZhciB0PWgoMSksbD1NYXRoO2YuY29udHJhc3Q9ZnVuY3Rpb24ocCxtKXtwPWsocCkrLjA1O209ayhtKSsuMDU7cmV0dXJuIHA+bT9wL206bS9wfTtmLmxpZ2h0ZW5Db2xvcj0KZnVuY3Rpb24ocCxtKXtyZXR1cm4gdC5jb2xvcihwKS5icmlnaHRlcihtKS5yZ2IoKS50b1N0cmluZygpfTtmLmNvbG9yVGVzdD1mdW5jdGlvbihwLG0pe3AuY2xhc3NlZChtLCEwKTt2YXIgbj1wLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7bj0vXCgoLispXCkvLmV4ZWMobik7aWYoIW4pcmV0dXJuIG51bGw7bj1uWzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHEpe3E9K3E7dmFyIHU9cS50b1N0cmluZygxNik7cmV0dXJuIDE2PnE/IjAiK3U6dX0pO2lmKDQ9PT1uLmxlbmd0aCYmIjAwIj09PW5bM10pcmV0dXJuIG51bGw7bj0iIyIrbi5qb2luKCIiKTtwLmNsYXNzZWQobSwhMSk7cmV0dXJuIG59fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoNTcpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fZW50aXRpZXM9W107dGhpcy5fcnRyZWU9bmV3IHQuUlRyZWU7dGhpcy5fdHJlZT1rLnF1YWR0cmVlKCkueChmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLngpfSkueShmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLnkpfSl9CmwucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihwLG0sbil7KHg9dGhpcy5fZW50aXRpZXMpLnB1c2guYXBwbHkoeCxwKTtpZih2b2lkIDAhPT1uKWZvcihuPXQuUlRyZWVCb3VuZHMuYm91bmRzKG4pLHg9MDt4PHAubGVuZ3RoO3grKyl7dmFyIHE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpO3QuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKG4sdSkmJih0aGlzLl90cmVlLmFkZChxKSx0aGlzLl9ydHJlZS5pbnNlcnQodSxxKSl9ZWxzZSBmb3IodGhpcy5fdHJlZS5hZGRBbGwocCkseD0wO3g8cC5sZW5ndGg7eCsrKXE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpLHRoaXMuX3J0cmVlLmluc2VydCh1LHEpO3ZhciB4fTtsLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl90cmVlLmZpbmQocC54LHAueSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9OwpsLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RZKHQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHApKX07bC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50aXRpZXN9O3JldHVybiBsfSgpO2YuRW50aXR5U3RvcmU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNTYpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuTWFwP3RoaXMuX2VzNk1hcD1uZXcgd2luZG93Lk1hcDp0aGlzLl9rZXlWYWx1ZVBhaXJzPVtdfXQucHJvdG90eXBlLnNldD1mdW5jdGlvbihsLHApe2lmKGsuaXNOYU4obCkpdGhyb3cgRXJyb3IoIk5hTiBtYXkgbm90IGJlIHVzZWQgYXMgYSBrZXkgdG8gdGhlIE1hcCIpOwppZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5zZXQobCxwKSx0aGlzO2Zvcih2YXIgbT0wO208dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbV0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1ttXS52YWx1ZT1wLHRoaXM7dGhpcy5fa2V5VmFsdWVQYWlycy5wdXNoKHtrZXk6bCx2YWx1ZTpwfSk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmdldD1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5nZXQobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLnZhbHVlfTt0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuaGFzKGwpOwpmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWwpcmV0dXJuITA7cmV0dXJuITF9O3QucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24obCxwKXt2YXIgbT10aGlzO251bGwhPXRoaXMuX2VzNk1hcD90aGlzLl9lczZNYXAuZm9yRWFjaChmdW5jdGlvbihuLHEpe3JldHVybiBsLmNhbGwocCxuLHEsbSl9LHApOnRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaChmdW5jdGlvbihuKXtsLmNhbGwocCxuLnZhbHVlLG4ua2V5LG0pfSl9O3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnNwbGljZShwLDEpLCEwO3JldHVybiExfTsKcmV0dXJuIHR9KCk7Zi5NYXA9ZH0sZnVuY3Rpb24oZCxmKXtmLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgaD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKyloW2tdPWFyZ3VtZW50c1trXTtrPXt9O2Zvcih2YXIgdD0wO3Q8aC5sZW5ndGg7dCsrKWZvcih2YXIgbD1oW3RdLHA9MCxtPU9iamVjdC5rZXlzKGwpO3A8bS5sZW5ndGg7cCsrKXt2YXIgbj1tW3BdO2tbbl09bFtuXX1yZXR1cm4ga319LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9TWF0aC5jZWlsKGsubGVuZ3RoLzIpLHA9MDtwPGw7cCsrKXRbMF0uaW5zZXJ0KGtbcF0pO2ZvcihwPWw7cDxrLmxlbmd0aDtwKyspdFsxXS5pbnNlcnQoa1twXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneVRyaXZpYWw9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihrLHQpe2s9Cmsuc2xpY2UoKTtmb3IodGhpcy5jaG9vc2VGaXJzdFNwbGl0KGssdCk7MDxrLmxlbmd0aDspdGhpcy5hZGROZXh0KGssdCl9O2gucHJvdG90eXBlLmNob29zZUZpcnN0U3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9MCxwPTAsbT1rLmxlbmd0aC0xLG49ay5sZW5ndGgtMSxxPTE7cTxrLmxlbmd0aC0xO3ErKyl7dmFyIHU9a1txXTt1LmJvdW5kcy54bD5rW21dLmJvdW5kcy54bD9tPXE6dS5ib3VuZHMueGg8a1tsXS5ib3VuZHMueGgmJihsPXEpO3UuYm91bmRzLnlsPmtbbl0uYm91bmRzLnlsP249cTp1LmJvdW5kcy55aDxrW3BdLmJvdW5kcy55aCYmKHA9cSl9cD1NYXRoLmFicyhrW2xdLmJvdW5kcy54aC1rW21dLmJvdW5kcy54bCk+TWF0aC5hYnMoa1twXS5ib3VuZHMueWgta1tuXS5ib3VuZHMueWwpP1tsLG1dOltwLG5dO2w9cFswXTtwPXBbMV07bD09PXAmJihsPTAscD1rLmxlbmd0aC0xKTt0WzBdLmluc2VydChrLnNwbGljZShNYXRoLm1heChsLHApLDEpWzBdKTt0WzFdLmluc2VydChrLnNwbGljZShNYXRoLm1pbihsLApwKSwxKVswXSl9O2gucHJvdG90eXBlLmFkZE5leHQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9bnVsbCxwPW51bGwsbT1udWxsLG49MDtuPGsubGVuZ3RoO24rKyl7dmFyIHE9a1tuXSx1PXRbMF0udW5pb25BcmVhRGlmZmVyZW5jZShxLmJvdW5kcyk7cT10WzFdLnVuaW9uQXJlYURpZmZlcmVuY2UocS5ib3VuZHMpO2lmKHU8cHx8bnVsbD09bClsPW4scD11LG09dFswXTtxPHAmJihsPW4scD1xLG09dFsxXSl9bS5pbnNlcnQoay5zcGxpY2UobCwxKVswXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneUxpbmVhcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhtKXtyZXR1cm4gU3RyaW5nKG0pfXZhciB0PWgoMSksbD1oKDApO2Q9aCgxMCk7Zi5JU3RhY2tpbmdPcmRlcj1kLm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciBwPU1hdGg7Zi5zdGFjaz1mdW5jdGlvbihtLG4scSx1KXt2b2lkIDA9PT11JiYodT0iYm90dG9tdXAiKTt2YXIgeD10Lm1hcCgpLEE9CnQubWFwKCkseT1uZXcgbC5NYXA7InRvcGRvd24iPT09dSYmKG09bS5zbGljZSgpLG0ucmV2ZXJzZSgpKTttLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9bmV3IGwuTWFwO3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oRyxEKXt2YXIgQj1rKG4oRyxELHcpKSxJPStxKEcsRCx3KSxOPTA8PUk/eDpBO2lmKE4uaGFzKEIpKXt2YXIgTz1OLmdldChCKTtOLnNldChCLE8rSSl9ZWxzZSBPPTAsTi5zZXQoQixJKTtDLnNldChCLHtvZmZzZXQ6Tyx2YWx1ZTpJLGF4aXNWYWx1ZTpuKEcsRCx3KSxvcmlnaW5hbERhdHVtOkcsb3JpZ2luYWxEYXRhc2V0Oncsb3JpZ2luYWxJbmRleDpEfSl9KTt5LnNldCh3LEMpfSk7cmV0dXJuIHl9O2Yuc3RhY2tlZEV4dGVudHM9ZnVuY3Rpb24obSl7dmFyIG49bmV3IGwuTWFwLHE9bmV3IGwuTWFwO20uZm9yRWFjaChmdW5jdGlvbih1KXt1LmZvckVhY2goZnVuY3Rpb24oeCxBKXt2YXIgeT1sLk1hdGgubWF4KFt4Lm9mZnNldCt4LnZhbHVlLHgub2Zmc2V0XSwKeC5vZmZzZXQpLHc9bC5NYXRoLm1pbihbeC5vZmZzZXQreC52YWx1ZSx4Lm9mZnNldF0seC5vZmZzZXQpLEM9eC5heGlzVmFsdWU7bi5oYXMoQSk/bi5nZXQoQSkuZXh0ZW50PHkmJm4uc2V0KEEse2V4dGVudDp5LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp4fSk6bi5zZXQoQSx7ZXh0ZW50OnksYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTtxLmhhcyhBKT9xLmdldChBKS5leHRlbnQ+dyYmcS5zZXQoQSx7ZXh0ZW50OncsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTpxLnNldChBLHtleHRlbnQ6dyxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06eH0pfSl9KTtyZXR1cm57bWF4aW11bUV4dGVudHM6bixtaW5pbXVtRXh0ZW50czpxfX07Zi5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT1bXTttLmZvckVhY2goZnVuY3Rpb24oQSx5KXt5LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKHcsQyl7aWYobnVsbD09cXx8cSh3LEMseSkpdz1BLmdldChrKG4odyxDLHkpKSksCnUucHVzaCh3LnZhbHVlK3cub2Zmc2V0KX0pfSk7bT1sLk1hdGgubWF4KHUsMCk7dmFyIHg9bC5NYXRoLm1pbih1LDApO3JldHVybltwLm1pbih4LDApLHAubWF4KDAsbSldfTtmLm5vcm1hbGl6ZUtleT1rfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtmLmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24obCl7bD1sLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt2YXIgcD1sLl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3I7bnVsbD09cCYmKHA9bmV3IHQobCksbC5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yPXApO3JldHVybiBwfTt2YXIgdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCl7dGhpcy5fcm9vdEVsZW1lbnQ9cH1sLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24ocCxtKXtwPXt4OnAseTptfTttPWsuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bT9wOmsuTWF0aC5hcHBseVRyYW5zZm9ybShtLApwKX07bC5pc0V2ZW50SW5zaWRlPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIGsuRE9NLmNvbnRhaW5zKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG0udGFyZ2V0KX07cmV0dXJuIGx9KCk7Zi5UcmFuc2xhdG9yPXR9LGZ1bmN0aW9uKGQsZixoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGs9aCgxMjQpO2guZChmLCJlYXNlTGluZWFyIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTt2YXIgdD1oKDEyNik7aC5kKGYsImVhc2VRdWFkIixmdW5jdGlvbigpe3JldHVybiB0LmF9KTtoLmQoZiwiZWFzZVF1YWRJbiIsZnVuY3Rpb24oKXtyZXR1cm4gdC5ifSk7aC5kKGYsImVhc2VRdWFkT3V0IixmdW5jdGlvbigpe3JldHVybiB0LmN9KTtoLmQoZiwiZWFzZVF1YWRJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7dmFyIGw9aCgxMjEpO2guZChmLCJlYXNlQ3ViaWMiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO2guZChmLCJlYXNlQ3ViaWNJbiIsCmZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2guZChmLCJlYXNlQ3ViaWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pO2guZChmLCJlYXNlQ3ViaWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7dmFyIHA9aCgxMjUpO2guZChmLCJlYXNlUG9seSIsZnVuY3Rpb24oKXtyZXR1cm4gcC5hfSk7aC5kKGYsImVhc2VQb2x5SW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2guZChmLCJlYXNlUG9seU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5jfSk7aC5kKGYsImVhc2VQb2x5SW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO3ZhciBtPWgoMTI3KTtoLmQoZiwiZWFzZVNpbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5hfSk7aC5kKGYsImVhc2VTaW5JbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5ifSk7aC5kKGYsImVhc2VTaW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uY30pO2guZChmLCJlYXNlU2luSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pO3ZhciBuPWgoMTIzKTtoLmQoZiwKImVhc2VFeHAiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2guZChmLCJlYXNlRXhwSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYn0pO2guZChmLCJlYXNlRXhwT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmN9KTtoLmQoZiwiZWFzZUV4cEluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcT1oKDEyMCk7aC5kKGYsImVhc2VDaXJjbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYX0pO2guZChmLCJlYXNlQ2lyY2xlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYn0pO2guZChmLCJlYXNlQ2lyY2xlT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmN9KTtoLmQoZiwiZWFzZUNpcmNsZUluT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmF9KTt2YXIgdT1oKDExOSk7aC5kKGYsImVhc2VCb3VuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYX0pO2guZChmLCJlYXNlQm91bmNlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYn0pO2guZChmLCJlYXNlQm91bmNlT3V0IixmdW5jdGlvbigpe3JldHVybiB1LmF9KTsKaC5kKGYsImVhc2VCb3VuY2VJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdS5jfSk7dmFyIHg9aCgxMTgpO2guZChmLCJlYXNlQmFjayIsZnVuY3Rpb24oKXtyZXR1cm4geC5hfSk7aC5kKGYsImVhc2VCYWNrSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHguYn0pO2guZChmLCJlYXNlQmFja091dCIsZnVuY3Rpb24oKXtyZXR1cm4geC5jfSk7aC5kKGYsImVhc2VCYWNrSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHguYX0pO3ZhciBBPWgoMTIyKTtoLmQoZiwiZWFzZUVsYXN0aWMiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luIixmdW5jdGlvbigpe3JldHVybiBBLmJ9KTtoLmQoZiwiZWFzZUVsYXN0aWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luT3V0IixmdW5jdGlvbigpe3JldHVybiBBLmN9KX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSk7aC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTsKaC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgaz1mdW5jdGlvbiBuKG0pe2Z1bmN0aW9uIHEodSl7cmV0dXJuIHUqdSooKG0rMSkqdS1tKX1tPSttO3Eub3ZlcnNob290PW47cmV0dXJuIHF9KDEuNzAxNTgpLHQ9ZnVuY3Rpb24gcShuKXtmdW5jdGlvbiB1KHgpe3JldHVybi0teCp4KigobisxKSp4K24pKzF9bj0rbjt1Lm92ZXJzaG9vdD1xO3JldHVybiB1fSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT4oQSo9Mik/QSpBKigocSsxKSpBLXEpOihBLT0yKSpBKigocSsxKSpBK3EpKzIpLzJ9cT0rcTt4Lm92ZXJzaG9vdD11O3JldHVybiB4fSgxLjcwMTU4KX0sZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKHkpe3JldHVybih5PSt5KTxrP0EqeSp5Onk8bD9BKih5LT10KSp5K3A6eTxuP0EqKHktPW0pKnkrcTpBKih5LT11KSp5K3h9Zi5iPWZ1bmN0aW9uKHkpe3JldHVybiAxLWgoMS15KX07Zi5hPWg7Zi5jPWZ1bmN0aW9uKHkpe3JldHVybigxPj0KKHkqPTIpPzEtaCgxLXkpOmgoeS0xKSsxKS8yfTt2YXIgaz00LzExLHQ9Ni8xMSxsPTgvMTEscD0uNzUsbT05LzExLG49MTAvMTEscT0uOTM3NSx1PTIxLzIyLHg9Ljk4NDM3NSxBPTEvay9rfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1oKmgpfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLWgqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpPzEtTWF0aC5zcXJ0KDEtaCpoKTpNYXRoLnNxcnQoMS0oaC09MikqaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBoKmgqaH07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybi0taCpoKmgrMX07Zi5hPWZ1bmN0aW9uKGgpe3JldHVybigxPj0oaCo9Mik/aCpoKmg6KGgtPTIpKmgqaCsyKS8yfX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiB0fSk7aC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTsKaC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgaz0yKk1hdGguUEksdD1mdW5jdGlvbiB1KG4scSl7ZnVuY3Rpb24geCh5KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0teSkqTWF0aC5zaW4oKEEteSkvcSl9dmFyIEE9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihxLz1rKTt4LmFtcGxpdHVkZT1mdW5jdGlvbih5KXtyZXR1cm4gdSh5LHEqayl9O3gucGVyaW9kPWZ1bmN0aW9uKHkpe3JldHVybiB1KG4seSl9O3JldHVybiB4fSgxLC4zKSxsPWZ1bmN0aW9uIHgocSx1KXtmdW5jdGlvbiBBKHcpe3JldHVybiAxLXEqTWF0aC5wb3coMiwtMTAqKHc9K3cpKSpNYXRoLnNpbigodyt5KS91KX12YXIgeT1NYXRoLmFzaW4oMS8ocT1NYXRoLm1heCgxLHEpKSkqKHUvPWspO0EuYW1wbGl0dWRlPWZ1bmN0aW9uKHcpe3JldHVybiB4KHcsdSprKX07QS5wZXJpb2Q9ZnVuY3Rpb24odyl7cmV0dXJuIHgocSx3KX07cmV0dXJuIEF9KDEsLjMpLHA9ZnVuY3Rpb24gQSh1LHgpe2Z1bmN0aW9uIHkoQyl7cmV0dXJuKDA+CihDPTIqQy0xKT91Kk1hdGgucG93KDIsMTAqQykqTWF0aC5zaW4oKHctQykveCk6Mi11Kk1hdGgucG93KDIsLTEwKkMpKk1hdGguc2luKCh3K0MpL3gpKS8yfXZhciB3PU1hdGguYXNpbigxLyh1PU1hdGgubWF4KDEsdSkpKSooeC89ayk7eS5hbXBsaXR1ZGU9ZnVuY3Rpb24oQyl7cmV0dXJuIEEoQyx4KmspfTt5LnBlcmlvZD1mdW5jdGlvbihDKXtyZXR1cm4gQSh1LEMpfTtyZXR1cm4geX0oMSwuMyl9LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLnBvdygyLDEwKmgtMTApfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP01hdGgucG93KDIsMTAqaC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKmgpKS8yfX0sZnVuY3Rpb24oZCxmKXtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuK2h9fSxmdW5jdGlvbihkLGYsaCl7aC5kKGYsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTtoLmQoZiwKImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTtoLmQoZiwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO3ZhciBrPWZ1bmN0aW9uIG4obSl7ZnVuY3Rpb24gcSh1KXtyZXR1cm4gTWF0aC5wb3codSxtKX1tPSttO3EuZXhwb25lbnQ9bjtyZXR1cm4gcX0oMyksdD1mdW5jdGlvbiBxKG4pe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIDEtTWF0aC5wb3coMS14LG4pfW49K247dS5leHBvbmVudD1xO3JldHVybiB1fSgzKSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT49KEEqPTIpP01hdGgucG93KEEscSk6Mi1NYXRoLnBvdygyLUEscSkpLzJ9cT0rcTt4LmV4cG9uZW50PXU7cmV0dXJuIHh9KDMpfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gaCpofTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqKDItaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP2gqaDotLWgqKDItaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKHQpe3JldHVybiAxLQpNYXRoLmNvcyh0KmspfTtmLmM9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqayl9O2YuYT1mdW5jdGlvbih0KXtyZXR1cm4oMS1NYXRoLmNvcyhoKnQpKS8yfTt2YXIgaD1NYXRoLlBJLGs9aC8yfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsKXtyZXR1cm4hMD09PXQobCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGwpfXZhciB0PWgoMTI5KTtkLmV4cG9ydHM9ZnVuY3Rpb24obCl7aWYoITE9PT1rKGwpKXJldHVybiExO2w9bC5jb25zdHJ1Y3RvcjtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGwpcmV0dXJuITE7bD1sLnByb3RvdHlwZTtyZXR1cm4hMT09PWsobCl8fCExPT09bC5oYXNPd25Qcm9wZXJ0eSgiaXNQcm90b3R5cGVPZiIpPyExOiEwfX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWZ1bmN0aW9uKGYpe3JldHVybiBudWxsIT1mJiYib2JqZWN0Ij09PXR5cGVvZiBmJiYhMT09PUFycmF5LmlzQXJyYXkoZil9fSxmdW5jdGlvbihkLApmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09dCYmKHQ9MTApO3ZvaWQgMD09PWwmJihsPXt9KTt2YXIgcD10aGlzO3RoaXMuY3R4PWs7dGhpcy5saW5lSGVpZ2h0PXQ7dGhpcy5zdHlsZT1sO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obSl7cC5jdHguZm9udD1wLnN0eWxlLmZvbnQ7cmV0dXJue3dpZHRoOnAuY3R4Lm1lYXN1cmVUZXh0KG0pLndpZHRoLGhlaWdodDpwLmxpbmVIZWlnaHR9fX07dGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24obSxuLHEpe251bGw9PXEmJihxPXAuY3R4KTtxLnNhdmUoKTtxLnRyYW5zbGF0ZShuLnRyYW5zbGF0ZVswXSxuLnRyYW5zbGF0ZVsxXSk7cS5yb3RhdGUobi5yb3RhdGUqTWF0aC5QSS8xODApO3JldHVybiBwLmNyZWF0ZUNhbnZhc1BlbihxKX07dm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9aC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuPWZ1bmN0aW9uKGspe3ZhciB0PQp0aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7ay5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe2sudGV4dEFsaWduPXA7bnVsbCE9dC5zdHlsZS5mb250JiYoay5mb250PXQuc3R5bGUuZm9udCk7bnVsbCE9dC5zdHlsZS5maWxsJiYoay5maWxsU3R5bGU9dC5zdHlsZS5maWxsLGsuZmlsbFRleHQobCxtLG4pKTtudWxsIT10LnN0eWxlLnN0cm9rZSYmKGsuc3Ryb2tlU3R5bGU9dC5zdHlsZS5maWxsLGsuc3Ryb2tlVGV4dChsLG0sbikpfX19O3JldHVybiBofSgpO2YuQ2FudmFzQ29udGV4dD1kfSxmdW5jdGlvbihkLGYpe3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe31rLmFwcGVuZD1mdW5jdGlvbih0LGwpe2Zvcih2YXIgcD1bXSxtPTI7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMl09YXJndW1lbnRzW21dO3A9ay5jcmVhdGUuYXBwbHkoayxbbF0uY29uY2F0KHApKTt0LmFwcGVuZENoaWxkKHApO3JldHVybiBwfTtrLmNyZWF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGw9CltdLHA9MTtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWxbcC0xXT1hcmd1bWVudHNbcF07cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoay5TVkdfTlMsdCk7ay5hZGRDbGFzc2VzLmFwcGx5KGssW3BdLmNvbmNhdChsKSk7cmV0dXJuIHB9O2suYWRkQ2xhc3Nlcz1mdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD0xO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbFtwLTFdPWFyZ3VtZW50c1twXTtsPWwuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT1tfSk7bnVsbCE9dC5jbGFzc0xpc3Q/bC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3QuY2xhc3NMaXN0LmFkZChtKX0pOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsbC5qb2luKCIgIikpfTtrLmdldERpbWVuc2lvbnM9ZnVuY3Rpb24odCl7aWYodC5nZXRCQm94KXRyeXt2YXIgbD10LmdldEJCb3goKTtyZXR1cm57d2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9fWNhdGNoKHApe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19O3JldHVybiBrfSgpOwpoLlNWR19OUz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuU3ZnVXRpbHM9aDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayh0LGwscCl7dm9pZCAwPT09cCYmKHA9ITEpO3ZhciBtPXRoaXM7dGhpcy5lbGVtZW50PXQ7dGhpcy5jbGFzc05hbWU9bDt0aGlzLmFkZFRpdGxlRWxlbWVudD1wO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXt2YXIgbj1tLmdldFRleHRFbGVtZW50cyhtLmVsZW1lbnQpLHE9bi5wYXJlbnRFbGVtZW50LHU9bi5jb250YWluZXJFbGVtZW50LHg9bi50ZXh0RWxlbWVudDtyZXR1cm4gZnVuY3Rpb24oQSl7cS5hcHBlbmRDaGlsZCh1KTt4LnRleHRDb250ZW50PUE7QT1oLmdldERpbWVuc2lvbnMoeCk7cS5yZW1vdmVDaGlsZCh1KTtyZXR1cm4gQX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKG4scSx1KXtudWxsPT11JiYodT1tLmVsZW1lbnQpO3U9aC5hcHBlbmQodSwiZyIsInRleHQtY29udGFpbmVyIixtLmNsYXNzTmFtZSk7bS5hZGRUaXRsZUVsZW1lbnQmJgooaC5hcHBlbmQodSwidGl0bGUiKS50ZXh0Q29udGVudD1uLHUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbikpO249aC5hcHBlbmQodSwiZyIsInRleHQtYXJlYSIpO24uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitxLnRyYW5zbGF0ZVswXSsiLCIrcS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIisocS5yb3RhdGUrIikiKSk7cmV0dXJuIG0uY3JlYXRlU3ZnTGluZVBlbihuKX19ay5wcm90b3R5cGUuc2V0QWRkVGl0bGVFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGl0bGVFbGVtZW50PXR9O2sucHJvdG90eXBlLmNyZWF0ZVN2Z0xpbmVQZW49ZnVuY3Rpb24odCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPWguYXBwZW5kKHQsInRleHQiLCJ0ZXh0LWxpbmUiKTtxLnRleHRDb250ZW50PWw7cS5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIixwKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO3Euc2V0QXR0cmlidXRlKCJ5IiwKIi0wLjI1ZW0iKX19fTtrLnByb3RvdHlwZS5nZXRUZXh0RWxlbWVudHM9ZnVuY3Rpb24odCl7aWYoInRleHQiPT09dC50YWdOYW1lKXt2YXIgbD10LnBhcmVudEVsZW1lbnQ7bnVsbD09bCYmKGw9dC5wYXJlbnROb2RlKTtsLnJlbW92ZUNoaWxkKHQpO3JldHVybntjb250YWluZXJFbGVtZW50OnQscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50OnR9fXZhciBwPXQucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPXApcmV0dXJuIGw9dC5wYXJlbnRFbGVtZW50LG51bGw9PWwmJihsPXQucGFyZW50Tm9kZSksbC5yZW1vdmVDaGlsZCh0KSx7Y29udGFpbmVyRWxlbWVudDp0LHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDpwfTtsPWguY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OnQsdGV4dEVsZW1lbnQ6bH19O3JldHVybiBrfSgpO2YuU3ZnQ29udGV4dD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9CnRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMjEpLGw9aCgzNik7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZhciBxPXAuY2FsbCh0aGlzLG4pfHx0aGlzO3EuZGltQ2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuX21lYXN1cmVOb3RGcm9tQ2FjaGU9ZnVuY3Rpb24obil7cmV0dXJuIHAucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4pfTttLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7CnJldHVybiB0aGlzLmRpbUNhY2hlLmdldChuKX07bS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmRpbUNhY2hlLmNsZWFyKCk7cC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKX07cmV0dXJuIG19KGgoNjApLkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2YuQ2FjaGVNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg1OSksdD1oKDYyKSxsPWgoNjQpLHA9aCg2Nik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG0obil7dGhpcy5jb250ZXh0PW47dGhpcy5tZWFzdXJlcj1uZXcgdC5DYWNoZU1lYXN1cmVyKHRoaXMuY29udGV4dCk7dGhpcy53cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy53cml0ZXI9bmV3IHAuV3JpdGVyKHRoaXMubWVhc3VyZXIsdGhpcy5jb250ZXh0LHRoaXMud3JhcHBlcil9bS5zdmc9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuZXcgbShuZXcgay5TdmdDb250ZXh0KG4scSx1KSl9O20uY2FudmFzPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbmV3IG0obmV3IGsuQ2FudmFzQ29udGV4dChuLApxLHUpKX07bS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixxLHUseCxBKXt0aGlzLndyaXRlci53cml0ZShuLHEsdSx4LEEpfTttLnByb3RvdHlwZS5jbGVhck1lYXN1cmVyQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLm1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBtfSgpO2YuVHlwZXNldHRlcj1kfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMuY2FjaGU9e307dGhpcy5jb21wdXRlPWt9aC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGspe3RoaXMuY2FjaGUuaGFzT3duUHJvcGVydHkoayl8fCh0aGlzLmNhY2hlW2tdPXRoaXMuY29tcHV0ZShrKSk7cmV0dXJuIHRoaXMuY2FjaGVba119O2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jYWNoZT17fTtyZXR1cm4gdGhpc307cmV0dXJuIGh9KCk7Zi5DYWNoZT1kfSxmdW5jdGlvbihkLGYpe2YuTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5hcnJheUVxPWZ1bmN0aW9uKGssdCl7aWYobnVsbD09Cmt8fG51bGw9PXQpcmV0dXJuIGs9PT10O2lmKGsubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspaWYoa1tsXSE9PXRbbF0pcmV0dXJuITE7cmV0dXJuITB9O2gub2JqRXE9ZnVuY3Rpb24oayx0KXtpZihudWxsPT1rfHxudWxsPT10KXJldHVybiBrPT09dDt2YXIgbD1PYmplY3Qua2V5cyhrKS5zb3J0KCkscD1PYmplY3Qua2V5cyh0KS5zb3J0KCksbT1sLm1hcChmdW5jdGlvbihxKXtyZXR1cm4ga1txXX0pLG49cC5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHRbcV19KTtyZXR1cm4gaC5hcnJheUVxKGwscCkmJmguYXJyYXlFcShtLG4pfTtoLnN0cmljdEVxPWZ1bmN0aW9uKGssdCl7cmV0dXJuIGs9PT10fTtoLmRlZmF1bHRzPWZ1bmN0aW9uKGspe2Zvcih2YXIgdD1bXSxsPTE7bDxhcmd1bWVudHMubGVuZ3RoO2wrKyl0W2wtMV09YXJndW1lbnRzW2xdO2lmKG51bGw9PWspdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7CnZhciBwPU9iamVjdChrKTt0LmZvckVhY2goZnVuY3Rpb24obSl7aWYobnVsbCE9bSlmb3IodmFyIG4gaW4gbSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxuKSYmKHBbbl09bVtuXSl9KTtyZXR1cm4gcH07cmV0dXJuIGh9KCl9LGZ1bmN0aW9uKGQsZil7Zi5TdHJpbmdNZXRob2RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLmNvbWJpbmVXaGl0ZXNwYWNlPWZ1bmN0aW9uKGspe3JldHVybiBrLnJlcGxhY2UoL1sgXHRdKy9nLCIgIil9O2guaXNOb3RFbXB0eVN0cmluZz1mdW5jdGlvbihrKXtyZXR1cm4gayYmIiIhPT1rLnRyaW0oKX07aC50cmltU3RhcnQ9ZnVuY3Rpb24oayx0KXtpZighaylyZXR1cm4gaztrPWsuc3BsaXQoIiIpO3ZhciBsPXQ/ZnVuY3Rpb24ocCl7cmV0dXJuIHAuc3BsaXQodCkuc29tZShoLmlzTm90RW1wdHlTdHJpbmcpfTpoLmlzTm90RW1wdHlTdHJpbmc7cmV0dXJuIGsucmVkdWNlKGZ1bmN0aW9uKHAsbSl7cmV0dXJuIGwocCttKT8KcCttOnB9LCIiKX07aC50cmltRW5kPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuIGs7az1rLnNwbGl0KCIiKTtrLnJldmVyc2UoKTtrPWgudHJpbVN0YXJ0KGsuam9pbigiIiksdCkuc3BsaXQoIiIpO2sucmV2ZXJzZSgpO3JldHVybiBrLmpvaW4oIiIpfTtyZXR1cm4gaH0oKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3RoaXMuV29yZERpdmlkZXJSZWdFeHA9L1xXLzt0aGlzLldoaXRlc3BhY2VSZWdFeHA9L1xzL31oLnByb3RvdHlwZS50b2tlbml6ZT1mdW5jdGlvbihrKXt2YXIgdD10aGlzO3JldHVybiBrLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24obCxwKXtyZXR1cm4gbC5zbGljZSgwLC0xKS5jb25jYXQodC5zaG91bGRDcmVhdGVOZXdUb2tlbihsW2wubGVuZ3RoLTFdLHApKX0sWyIiXSl9O2gucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuW3RdO3ZhciBsPWtbay5sZW5ndGgtMV07cmV0dXJuIHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpJiYKdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QodCk/W2srdF06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QobCl8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KHQpP1trLHRdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKXx8dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KHQpP2w9PT10P1trK3RdOltrLHRdOltrK3RdfTtyZXR1cm4gaH0oKTtmLlRva2VuaXplcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUud3JhcD0KZnVuY3Rpb24ocCxtLG4scSl7ZnVuY3Rpb24gdShEKXtyZXR1cm4gdC5wcm90b3R5cGUud3JhcC5jYWxsKHgscCxtLEQscSl9dmFyIHg9dGhpczt2b2lkIDA9PT1xJiYocT1JbmZpbml0eSk7aWYoMTxwLnNwbGl0KCJcbiIpLmxlbmd0aCl0aHJvdyBFcnJvcigiU2luZ2xlTGluZVdyYXBwZXIgaXMgZGVzaWduZWQgdG8gd29yayBvbmx5IG9uIHNpbmdsZSBsaW5lIik7dmFyIEE9dShuKTtpZigyPkEubm9MaW5lcylyZXR1cm4gQTtmb3IodmFyIHk9MCx3PTA7dzxsLk5PX1dSQVBfSVRFUkFUSU9OUyYmbj55Oysrdyl7dmFyIEM9KG4reSkvMixHPXUoQyk7dGhpcy5hcmVTYW1lUmVzdWx0cyhBLEcpPyhuPUMsQT1HKTp5PUN9cmV0dXJuIEF9O2wucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIHAubm9MaW5lcz09PW0ubm9MaW5lcyYmcC50cnVuY2F0ZWRUZXh0PT09bS50cnVuY2F0ZWRUZXh0fTtyZXR1cm4gbH0oaCg2NSkuV3JhcHBlcik7ZC5OT19XUkFQX0lURVJBVElPTlM9CjU7Zi5TaW5nbGVMaW5lV3JhcHBlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgyMSksdD17dGV4dFJvdGF0aW9uOjAsdGV4dFNoZWFyOjAseEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCJ9O2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSxuKXt0aGlzLl9tZWFzdXJlcj1wO3RoaXMuX3BlbkZhY3Rvcnk9bTt0aGlzLl93cmFwcGVyPW59bC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24ocCl7dGhpcy5fbWVhc3VyZXI9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbihwKXt0aGlzLl93cmFwcGVyPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24ocCl7dGhpcy5fcGVuRmFjdG9yeT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihwLG0sbixxLHUpe3ZvaWQgMD09PXEmJihxPXt9KTtxPWsuTWV0aG9kcy5kZWZhdWx0cyh7fSx0LHEpO2lmKC0xPT09bC5TdXBwb3J0ZWRSb3RhdGlvbi5pbmRleE9mKHEudGV4dFJvdGF0aW9uKSl0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgcm90YXRpb24gLSAiKwpxLnRleHRSb3RhdGlvbisiLiBTdXBwb3J0ZWQgcm90YXRpb25zIGFyZSAiK2wuU3VwcG9ydGVkUm90YXRpb24uam9pbigiLCAiKSk7aWYobnVsbCE9cS50ZXh0U2hlYXImJi04MD5xLnRleHRTaGVhcnx8ODA8cS50ZXh0U2hlYXIpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHNoZWFyIGFuZ2xlIC0gIitxLnRleHRTaGVhcisiLiBNdXN0IGJlIGJldHdlZW4gLTgwIGFuZCA4MCIpO3ZhciB4PTQ1PE1hdGguYWJzKE1hdGguYWJzKHEudGV4dFJvdGF0aW9uKS05MCksQT14P206bix5PXg/bjptLHc9cS50ZXh0U2hlYXIsQz13Kk1hdGguUEkvMTgwO3g9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt2YXIgRz14Kk1hdGgudGFuKEMpO0E9QS9NYXRoLmNvcyhDKS1NYXRoLmFicyhHKTt2YXIgRD15Kk1hdGguY29zKEMpO3k9ay5TdHJpbmdNZXRob2RzLmNvbWJpbmVXaGl0ZXNwYWNlKHApO3k9KHRoaXMuX3dyYXBwZXI/dGhpcy5fd3JhcHBlci53cmFwKHksdGhpcy5fbWVhc3VyZXIsCkEsRCkud3JhcHBlZFRleHQ6eSkuc3BsaXQoIlxuIik7Qz1sLlhPZmZzZXRGYWN0b3JbcS54QWxpZ25dKkEqTWF0aC5zaW4oQyktbC5ZT2Zmc2V0RmFjdG9yW3EueUFsaWduXSooRC15Lmxlbmd0aCp4KTt3PXEudGV4dFJvdGF0aW9uK3c7c3dpdGNoKHEudGV4dFJvdGF0aW9uKXtjYXNlIDkwOm09W20rQywwXTticmVhaztjYXNlIC05MDptPVstQyxuXTticmVhaztjYXNlIDE4MDptPVttLG4rQ107YnJlYWs7ZGVmYXVsdDptPVswLC1DXX1wPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKHAse3RyYW5zbGF0ZTptLHJvdGF0ZTp3fSx1KTt0aGlzLndyaXRlTGluZXMoeSxwLEEseCxHLHEueEFsaWduKTtudWxsIT1wLmRlc3Ryb3kmJnAuZGVzdHJveSgpfTtsLnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHAsbSxuLHEsdSx4KXtwLmZvckVhY2goZnVuY3Rpb24oQSx5KXttLndyaXRlKEEsbC5BbmNob3JDb252ZXJ0ZXJbeF0sKDA8dT8oeSsxKSp1OnkqdSkrbipsLlhPZmZzZXRGYWN0b3JbeF0sCih5KzEpKnEpfSl9O3JldHVybiBsfSgpO2QuU3VwcG9ydGVkUm90YXRpb249Wy05MCwwLDE4MCw5MF07ZC5BbmNob3JDb252ZXJ0ZXI9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9O2QuWE9mZnNldEZhY3Rvcj17Y2VudGVyOi41LGxlZnQ6MCxyaWdodDoxfTtkLllPZmZzZXRGYWN0b3I9e2JvdHRvbToxLGNlbnRlcjouNSx0b3A6MH07Zi5Xcml0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9aCg2OSk7ZD1oKDcpO2YuQW5pbWF0b3JzPWQ7ZD1oKDY3KTtmLkF4ZXM9ZDtkPWgoMzcpO2YuQ29tcG9uZW50cz1kO2Q9aCgyMyk7Zi5Db25maWdzPWQ7ZD1oKDgpO2YuRm9ybWF0dGVycz1kO2Q9aCgzMCk7Zi5SZW5kZXJDb250cm9sbGVyPWQ7ZD1oKDM5KTtmLlJlbmRlclBvbGljaWVzPWQ7ZD1oKDMxKTtmLlN5bWJvbEZhY3Rvcmllcz1kO2Q9aCgxMyk7Zi5EaXNwYXRjaGVycz0KZDtkPWgoMTQpO2YuRHJhd2Vycz1kO2Q9aCgyNSk7Zi5JbnRlcmFjdGlvbnM9ZDtkPWgoMTkpO2YuUGxvdHM9ZDtkPWgoMyk7Zi5TY2FsZXM9ZDtkPWgoMCk7Zi5VdGlscz1kO2soaCgyMikpO2Q9aCgyOCk7Zi5UaW1lSW50ZXJ2YWw9ZC5UaW1lSW50ZXJ2YWw7ayhoKDQpKTtrKGgoMjkpKTtrKGgoMzgpKTtkPWgoNjgpO2YudmVyc2lvbj1kLnZlcnNpb247ayhoKDI0KSk7ayhoKDYpKTtrKGgoMTUpKTtrKGgoNDApKTtrKGgoMTYpKTtrKGgoMikpO2soaCgxMSkpO2soaCgxNykpfV0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy9wbG90dGFibGUtaW50ZXJhY3Rpb25zLmpzCnZhciByZzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSl7Y29uc3Qgbj1bXTtmb3IoO20mJm0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYobi5wdXNoKG0pLG0uYXNzaWduZWRTbG90KW09bS5hc3NpZ25lZFNsb3Q7ZWxzZSBpZihtLnBhcmVudEVsZW1lbnQpbT1tLnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBxPW0ucGFyZW50Tm9kZTttPXEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3EuaG9zdDpxIT09bT9xOm51bGx9cmV0dXJuIG59ZnVuY3Rpb24gZihtKXt2YXIgbj1kKG0pO209aDtsZXQgcT1udWxsO2Zvcihjb25zdCB4IG9mIG4pe249UGxvdHRhYmxlLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKHgpO2lmKG51bGwhPW4pe3ZhciB1PXguY2xpZW50V2lkdGgvMjtjb25zdCBBPXguY2xpZW50SGVpZ2h0LzI7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFt1LEFdKTttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5TWF0cml4KG0sUGxvdHRhYmxlLlV0aWxzLk1hdGguaW52ZXJ0TWF0cml4KG4pKTsKbT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFstdSwtQV0pfW49eC5zY3JvbGxMZWZ0O3U9eC5zY3JvbGxUb3A7aWYobnVsbD09PXF8fHg9PT1xKW4tPXgub2Zmc2V0TGVmdCt4LmNsaWVudExlZnQsdS09eC5vZmZzZXRUb3AreC5jbGllbnRUb3AscT14Lm9mZnNldFBhcmVudDttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKG0sW24sdV0pfXJldHVybiBtfWNvbnN0IGg9WzEsMCwwLDEsMCwwXTtjbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLlV0aWxzLlRyYW5zbGF0b3J7Y29tcHV0ZVBvc2l0aW9uKG0sbil7bT17eDptLHk6bn07bj1mKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bj9tOlBsb3R0YWJsZS5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKG4sbSl9fWNsYXNzIHQgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2V7Y29uc3RydWN0b3IobSl7c3VwZXIobSk7dGhpcy5fZXZlbnRUYXJnZXQ9bS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CnRoaXMuX3RyYW5zbGF0b3I9bmV3IGsobS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKG0pe2NvbnN0IG49bS5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcT1uW3QuX0RJU1BBVENIRVJfS0VZXTtxfHwocT1uZXcgdChtKSxuW3QuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3RvcihtKXtzdXBlcihtKTt0aGlzLl9ldmVudFRhcmdldD1tLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt0aGlzLl90cmFuc2xhdG9yPW5ldyBrKG0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihtKXtjb25zdCBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHE9bltsLl9ESVNQQVRDSEVSX0tFWV07cXx8KHE9bmV3IGwobSksbltsLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9fVBsb3R0YWJsZS5JbnRlcmFjdGlvbi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PQpmdW5jdGlvbihtKXtyZXR1cm4gMDw9bS54JiYwPD1tLnkmJm0ueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJm0ueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBwIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10LmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX19Yi5Qb2ludGVySW50ZXJhY3Rpb249cH0pKHJnfHwocmc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1jaGFydC1oZWxwZXJzL3Z6LWNoYXJ0LWhlbHBlcnMuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXtsZXQgdD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7dC50aWNrR2VuZXJhdG9yKCk7bGV0IGw9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIik7bC5mb3JtYXR0ZXIoYi5zdGVwRm9ybWF0dGVyKTtyZXR1cm57c2NhbGU6dCxheGlzOmwsYWNjZXNzb3I6cD0+cC5zdGVwfX1mdW5jdGlvbiBmKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuVGltZTtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5UaW1lKHQsImJvdHRvbSIpLGFjY2Vzc29yOmw9Pmwud2FsbF90aW1lfX1mdW5jdGlvbiBoKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTp0LGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIiksYWNjZXNzb3I6Yi5yZWxhdGl2ZUFjY2Vzc29yfX1iLlNZTUJPTFNfTElTVD1be2NoYXJhY3RlcjoiXHUyNWZjIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5zcXVhcmV9LAp7Y2hhcmFjdGVyOiJcdTI1YzYiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6Ilx1MjViMiIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGV9LHtjaGFyYWN0ZXI6Ilx1MjYwNSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3Rhcn0se2NoYXJhY3RlcjoiXHUyNzFhIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO2xldCBrOyhmdW5jdGlvbih0KXt0LlNURVA9InN0ZXAiO3QuUkVMQVRJVkU9InJlbGF0aXZlIjt0LldBTExfVElNRT0id2FsbF90aW1lIn0pKGs9Yi5YVHlwZXx8KGIuWFR5cGU9e30pKTtiLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7Yi5TVEVQX0ZPUk1BVFRFUl9QUkVDSVNJT049NDtiLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OPTM7Yi5UT09MVElQX1lfUElYRUxfT0ZGU0VUPTIwO2IuVE9PTFRJUF9DSVJDTEVfU0laRT00O2IuTkFOX1NZTUJPTF9TSVpFPQo2O2IubXVsdGlzY2FsZUZvcm1hdHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbD0+e2xldCBwPU1hdGguYWJzKGwpOzFFLTE1PnAmJihwPTApO3JldHVybigxRTQ8PXA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOjA8cCYmLjAxPnA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOmQzLmZvcm1hdCgiLiIrdCsifmciKSkobCl9fTtiLmNvbXB1dGVEb21haW49ZnVuY3Rpb24odCxsKXt0PXQuZmlsdGVyKG49PmlzRmluaXRlKG4pKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuWy0uMSwxLjFdO2w/KHQ9Xy5zb3J0QnkodCksbD1kMy5xdWFudGlsZSh0LC4wNSksdD1kMy5xdWFudGlsZSh0LC45NSkpOihsPWQzLm1pbih0KSx0PWQzLm1heCh0KSk7bGV0IHAsbT10LWw7cD0wPT09bT8xLjEqTWF0aC5hYnMobCkrMS4xOi4yKm07bD1bMDw9bCYmbDxtPy0uMSp0OmwtcCx0K3BdO3JldHVybiBsPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGwpLm5pY2UoKS5kb21haW4oKX07Yi5hY2Nlc3Nvcml6ZT1mdW5jdGlvbih0KXtyZXR1cm4gbD0+CmxbdF19O2Iuc3RlcEZvcm1hdHRlcj1kMy5mb3JtYXQoYC4ke2IuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OfX5zYCk7Yi5zdGVwWD1kO2IudGltZUZvcm1hdHRlcj1QbG90dGFibGUuRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKTtiLndhbGxYPWY7Yi5yZWxhdGl2ZUFjY2Vzc29yPSh0LGwscCk9PntpZihudWxsIT10LnJlbGF0aXZlKXJldHVybiB0LnJlbGF0aXZlO2w9cC5kYXRhKCk7cmV0dXJuKCt0LndhbGxfdGltZS0oMDxsLmxlbmd0aD8rbFswXS53YWxsX3RpbWU6MCkpLzM2RTV9O2IucmVsYXRpdmVGb3JtYXR0ZXI9dD0+e2xldCBsPSIiLHA9TWF0aC5mbG9vcih0LzI0KTt0LT0yNCpwO3AmJihsKz1wKyJkICIpO2xldCBtPU1hdGguZmxvb3IodCk7dD02MCoodC1tKTtpZihtfHxwKWwrPW0rImggIjtsZXQgbj1NYXRoLmZsb29yKHQpO3Q9NjAqKHQtbik7aWYobnx8bXx8cClsKz1uKyJtICI7cmV0dXJuIGwrTWF0aC5mbG9vcih0KSsicyJ9O2IucmVsYXRpdmVYPQpoO2IuZ2V0WENvbXBvbmVudHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2Ugay5TVEVQOnJldHVybiBkKCk7Y2FzZSBrLldBTExfVElNRTpyZXR1cm4gZigpO2Nhc2Ugay5SRUxBVElWRTpyZXR1cm4gaCgpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgeFR5cGU6ICIrdCk7fX19KShyZ3x8KHJnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy92ei1jaGFydC10b29sdGlwLmpzCnZhciBFaDsKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihoKXtoLkFVVE89ImF1dG8iO2guQk9UVE9NPSJib3R0b20iO2guUklHSFQ9InJpZ2h0In0pKGQ9Yi5Ub29sdGlwUG9zaXRpb258fChiLlRvb2x0aXBQb3NpdGlvbj17fSkpO2NvbnN0IGY9e2JveFNoYWRvdzoiMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgLjMpIixvcGFjaXR5OjAscG9zaXRpb246ImZpeGVkIix3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0iLHpJbmRleDo1fTtQb2x5bWVyKHtpczoidnotY2hhcnQtdG9vbHRpcCIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7Y29udGVudENvbXBvbmVudE5hbWU6U3RyaW5nLHBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpkLkFVVE99LG1pbkRpc3RGcm9tRWRnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTV9fSxyZWFkeSgpe3RoaXMuX3R1bm5lbD10aGlzLl9yYWY9dGhpcy5fc3R5bGVDYWNoZT1udWxsfSxhdHRhY2hlZCgpe3RoaXMuX3R1bm5lbD10aGlzLl9jcmVhdGVUdW5uZWwoKTt0aGlzLl9oaWRlT25CbHVyPQooKT0+e2RvY3VtZW50LmhpZGRlbiYmdGhpcy5oaWRlKCl9O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9oaWRlT25CbHVyKX0sZGV0YWNoZWQoKXt0aGlzLmhpZGUoKTt0aGlzLl9yZW1vdmVUdW5uZWwodGhpcy5fdHVubmVsKTt0aGlzLl90dW5uZWw9bnVsbDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGNvbnRlbnQoKXtyZXR1cm4gdGhpcy5fdHVubmVsLnNoYWRvd1Jvb3R9LGhpZGUoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKTt0aGlzLl9zdHlsZUNhY2hlPW51bGw7dGhpcy5fdHVubmVsLnN0eWxlLm9wYWNpdHk9MH0sdXBkYXRlQW5kUG9zaXRpb24oaCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fcmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX3JlcG9zaXRpb25JbXBsKGgpfSl9LApfcmVwb3NpdGlvbkltcGwoaCl7Y29uc3Qgaz10aGlzLl90dW5uZWw7aD1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IHQ9ay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPXdpbmRvdy5pbm5lckhlaWdodCxwPWRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsbT1oLnRvcCxuPW0raC5oZWlnaHQscT10LmhlaWdodCtyZy5UT09MVElQX1lfUElYRUxfT0ZGU0VUO2xldCB1PW51bGwseD1NYXRoLm1heCh0aGlzLm1pbkRpc3RGcm9tRWRnZSxoLmxlZnQpLEE9bnVsbCx5PW07dGhpcy5wb3NpdGlvbj09ZC5SSUdIVD94PWgucmlnaHQ6KHk9bityZy5UT09MVElQX1lfUElYRUxfT0ZGU0VULHA8eCt0LndpZHRoK3RoaXMubWluRGlzdEZyb21FZGdlJiYoeD1udWxsLEE9dGhpcy5taW5EaXN0RnJvbUVkZ2UpKTt0aGlzLnBvc2l0aW9uPT1kLkFVVE8mJjA8aC50b3AtcSYmbDxoLnRvcCtoLmhlaWdodCtxJiYoeT1udWxsLHU9bC1tK3JnLlRPT0xUSVBfWV9QSVhFTF9PRkZTRVQpO2g9e29wYWNpdHk6MSwKbGVmdDp4P2Ake3h9cHhgOm51bGwscmlnaHQ6QT9gJHtBfXB4YDpudWxsLHRvcDp5P2Ake3l9cHhgOm51bGwsYm90dG9tOnU/YCR7dX1weGA6bnVsbH07Xy5pc0VxdWFsKHRoaXMuX3N0eWxlQ2FjaGUsaCl8fChPYmplY3QuYXNzaWduKGsuc3R5bGUsaCksdGhpcy5fc3R5bGVDYWNoZT1oKX0sX2NyZWF0ZVR1bm5lbCgpe2lmKCF0aGlzLmNvbnRlbnRDb21wb25lbnROYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJSZXF1aXJlIGBjb250ZW50Q29tcG9uZW50TmFtZWAgdG8gYmUgYSBuYW1lIG9mIGEgUG9seW1lciBjb21wb25lbnQiKTtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSk7T2JqZWN0LmFzc2lnbihoLnN0eWxlLGYpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7cmV0dXJuIGh9LF9yZW1vdmVUdW5uZWwoaCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoKX19KX0pKEVofHwoRWg9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0L2RyYWdab29tSW50ZXJhY3Rpb24uanMKdmFyIEZoOwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLlNlbGVjdGlvbkJveExheWVye2NvbnN0cnVjdG9yKGYsaCxrKXtzdXBlcigpO3RoaXMuZWFzZUZuPWQzLmVhc2VDdWJpY0luT3V0O3RoaXMuX2FuaW1hdGlvblRpbWU9NzUwO3RoaXMueFNjYWxlKGYpO3RoaXMueVNjYWxlKGgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbj1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5EcmFnO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuQ2xpY2s7dGhpcy5zZXR1cENhbGxiYWNrcygpO3RoaXMudW56b29tTWV0aG9kPWs7dGhpcy5vbkRldGFjaCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCl9KTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyl9KX1pbnRlcmFjdGlvblN0YXJ0KGYpe3RoaXMub25TdGFydD0KZn1pbnRlcmFjdGlvbkVuZChmKXt0aGlzLm9uRW5kPWZ9ZHJhZ0ludGVyYWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn1zZXR1cENhbGxiYWNrcygpe2xldCBmPSExO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChoPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDpofSk7dGhpcy5vblN0YXJ0KCl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKChoLGspPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7dGhpcy5ib3hWaXNpYmxlKCEwKTtmPSEwfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCgoaCxrKT0+e3RoaXMuYm94VmlzaWJsZSghMSk7dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7aWYoZil0aGlzLnpvb20oKTtlbHNlIHRoaXMub25FbmQoKTtmPSExfSk7dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5vbkRvdWJsZUNsaWNrKHRoaXMudW56b29tLmJpbmQodGhpcykpfWFuaW1hdGlvblRpbWUoZil7aWYobnVsbD09CmYpcmV0dXJuIHRoaXMuX2FuaW1hdGlvblRpbWU7aWYoMD5mKXRocm93IEVycm9yKCJhbmltYXRpb25UaW1lIGNhbm5vdCBiZSBuZWdhdGl2ZSIpO3RoaXMuX2FuaW1hdGlvblRpbWU9ZjtyZXR1cm4gdGhpc31lYXNlKGYpe2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgZil0aHJvdyBFcnJvcigiZWFzZSBmdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24iKTswPT09ZigwKSYmMT09PWYoMSl8fFBsb3R0YWJsZS5VdGlscy5XaW5kb3cud2FybigiRWFzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IG1haW50YWluIGludmFyaWFudCBmKDApXHgzZFx4M2QwIFx4MjZceDI2IGYoMSlceDNkXHgzZDEuIEJhZCBiZWhhdmlvciBtYXkgcmVzdWx0LiIpO3RoaXMuZWFzZUZuPWY7cmV0dXJuIHRoaXN9em9vbSgpe2xldCBmPXRoaXMueEV4dGVudCgpWzBdLnZhbHVlT2YoKSxoPXRoaXMueEV4dGVudCgpWzFdLnZhbHVlT2YoKSxrPXRoaXMueUV4dGVudCgpWzFdLnZhbHVlT2YoKSx0PXRoaXMueUV4dGVudCgpWzBdLnZhbHVlT2YoKTsKZiE9PWgmJmshPT10JiZ0aGlzLmludGVycG9sYXRlWm9vbShmLGgsayx0KX11bnpvb20oKXt2YXIgZj10aGlzLnhTY2FsZSgpO2YuX2RvbWFpbk1pbj1udWxsO2YuX2RvbWFpbk1heD1udWxsO2Y9Zi5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUoKS5kb21haW4oZik7dGhpcy51bnpvb21NZXRob2QoKX1pc1pvb21pbmcoZil7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoIWYpO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZW5hYmxlZCghZil9aW50ZXJwb2xhdGVab29tKGYsaCxrLHQpe2xldCBsPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMF0udmFsdWVPZigpLHA9dGhpcy54U2NhbGUoKS5kb21haW4oKVsxXS52YWx1ZU9mKCksbT10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxuPXRoaXMueVNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLHE9dGhpcy5lYXNlRm4sdT0oeSx3LEMpPT5kMy5pbnRlcnBvbGF0ZU51bWJlcih5LHcpKHEoQykpO3RoaXMuaXNab29taW5nKCEwKTsKbGV0IHg9RGF0ZS5ub3coKSxBPSgpPT57dmFyIHk9RGF0ZS5ub3coKS14O3k9MD09PXRoaXMuX2FuaW1hdGlvblRpbWU/MTpNYXRoLm1pbigxLHkvdGhpcy5fYW5pbWF0aW9uVGltZSk7bGV0IHc9dShsLGYseSksQz11KHAsaCx5KSxHPXUobSxrLHkpLEQ9dShuLHQseSk7dGhpcy54U2NhbGUoKS5kb21haW4oW3csQ10pO3RoaXMueVNjYWxlKCkuZG9tYWluKFtHLERdKTsxPnk/UGxvdHRhYmxlLlV0aWxzLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChBKToodGhpcy5vbkVuZCgpLHRoaXMuaXNab29taW5nKCExKSl9O0EoKX19Yi5EcmFnWm9vbUxheWVyPWR9KShGaHx8KEZoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvcGFuWm9vbURyYWdMYXllci5qcwp2YXIgR2g7CihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oaCl7aFtoLk5PTkU9MF09Ik5PTkUiO2hbaC5EUkFHX1pPT01JTkc9MV09IkRSQUdfWk9PTUlORyI7aFtoLlBBTk5JTkc9Ml09IlBBTk5JTkcifSkoZHx8KGQ9e30pKTtjbGFzcyBmIGV4dGVuZHMgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IoaCxrLHQpe3N1cGVyKCk7dGhpcy5zdGF0ZT1kLk5PTkU7dGhpcy5wYW5TdGFydENhbGxiYWNrPW5ldyBQbG90dGFibGUuVXRpbHMuQ2FsbGJhY2tTZXQ7dGhpcy5wYW5FbmRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuWm9vbT1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5QYW5ab29tKGgsayk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PmYuaXNQYW5LZXkocCkmJjA9PT1wLmJ1dHRvbik7dGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSk7dGhpcy5kcmFnWm9vbUxheWVyPW5ldyBGaC5EcmFnWm9vbUxheWVyKGgsCmssdCk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PiFmLmlzUGFuS2V5KHApJiYwPT09cC5idXR0b24pO3RoaXMuYXBwZW5kKHRoaXMuZHJhZ1pvb21MYXllcik7Y29uc3QgbD10aGlzLm9uV2hlZWwuYmluZCh0aGlzKTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPVBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKGwpO3RoaXMucGFuWm9vbS5hdHRhY2hUbyh0aGlzKX0pO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLnBhblpvb20uZGV0YWNoRnJvbSgpO3RoaXMuX21vdXNlRGlzcGF0Y2hlciYmKHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbChsKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbCl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJgp0aGlzLnNldFN0YXRlKGQuUEFOTklORyl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgpPT57dGhpcy5zdGF0ZT09ZC5QQU5OSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KTt0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJnRoaXMuc2V0U3RhdGUoZC5EUkFHX1pPT01JTkcpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWQuRFJBR19aT09NSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KX1vbldoZWVsKGgsayl7aWYoIXRoaXMuY2FuU2Nyb2xsWm9vbShrKSYmKGg9dGhpcy5lbGVtZW50KCksaC5zZWxlY3QoIi5oZWxwIikuZW1wdHkoKSkpe3ZhciB0PWguYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJoZWxwIiwhMCk7dC5hcHBlbmQoInNwYW4iKS50ZXh0KCJBbHQgKyBTY3JvbGwgdG8gWm9vbSIpOwp0Lm9uKCJhbmltYXRpb25lbmQiLCgpPT52b2lkIHQucmVtb3ZlKCkpfX1zdGF0aWMgaXNQYW5LZXkoaCl7cmV0dXJuISFoLmFsdEtleXx8ISFoLnNoaWZ0S2V5fWNhblNjcm9sbFpvb20oaCl7cmV0dXJuIGguYWx0S2V5fXNldFN0YXRlKGgpe2lmKHRoaXMuc3RhdGUhPWgpe3ZhciBrPXRoaXMuc3RhdGU7dGhpcy5zdGF0ZT1oO3RoaXMucm9vdCgpLnJlbW92ZUNsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaykpO3RoaXMucm9vdCgpLmFkZENsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaCkpO2s9PWQuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCk7aD09ZC5QQU5OSU5HJiZ0aGlzLnBhblN0YXJ0Q2FsbGJhY2suY2FsbENhbGxiYWNrcygpfX1zdGF0ZUNsYXNzTmFtZShoKXtzd2l0Y2goaCl7Y2FzZSBkLlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgZC5EUkFHX1pPT01JTkc6cmV0dXJuImRyYWctem9vbWluZyI7ZGVmYXVsdDpyZXR1cm4iIn19b25QYW5TdGFydChoKXt0aGlzLnBhblN0YXJ0Q2FsbGJhY2suYWRkKGgpfW9uUGFuRW5kKGgpe3RoaXMucGFuRW5kQ2FsbGJhY2suYWRkKGgpfW9uU2Nyb2xsWm9vbShoKXt0aGlzLnBhblpvb20ub25ab29tRW5kKGgpfW9uRHJhZ1pvb21TdGFydChoKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25TdGFydChoKX1vbkRyYWdab29tRW5kKGgpe3RoaXMuZHJhZ1pvb21MYXllci5pbnRlcmFjdGlvbkVuZChoKX19CmIuUGFuWm9vbURyYWdMYXllcj1mfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3RmLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlF1YW50aXRhdGl2ZVNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZil7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1mfWlnbm9yZU91dGxpZXIoZil7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZj8odGhpcy5faWdub3JlT3V0bGllcj1mLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX19Yi5UZlNjYWxlPWR9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvbGluZWFyLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2lnbm9yZU91dGxpZXI9ITE7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKGYpe3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49Zn1fbmljZURvbWFpbihmLGgpe2NvbnN0IFtrLHRdPWYsbD10LWs7Zj0wPT09bD8xLjEqTWF0aC5hYnMoaykrMS4xOmwqdGhpcy5wYWRQcm9wb3J0aW9uKCk7cmV0dXJuIHN1cGVyLl9uaWNlRG9tYWluKFswPD1rJiZrPGw/LS4xKnQ6ay1mLHQrZl0saCl9X2dldFVuYm91bmRlZEV4dGVudChmKXtmPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGYpO2xldCBoPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09Zi5sZW5ndGgmJihmPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oZixoWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoZixoWzFdKV0saD10aGlzLl9uaWNlRG9tYWluKGYpKTsKcmV0dXJuIGh9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX1leHRlbnRPZlZhbHVlcyhmKXt2YXIgaD1mPWYuZmlsdGVyKGs9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIoaykpO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtoPWYuc29ydCgobCxwKT0+bC1wKTtjb25zdCBrPWQzLnF1YW50aWxlKGgsLjA1KSx0PWQzLnF1YW50aWxlKGgsLjk1KTtoPWYuZmlsdGVyKGw9Pmw+PWsmJmw8PXQpfWY9ZDMuZXh0ZW50KGgpO3JldHVybiBudWxsPT1mWzBdfHxudWxsPT1mWzFdP1tdOmZ9aWdub3JlT3V0bGllcihmKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBmPyh0aGlzLl9pZ25vcmVPdXRsaWVyPWYsdGhpcyk6dGhpcy5faWdub3JlT3V0bGllcn19Yi5MaW5lYXJTY2FsZT1kfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xvZy1zY2FsZS5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrKXtyZXR1cm4gTWF0aC5sb2cxMChrKX1mdW5jdGlvbiBmKGspe3JldHVybiBNYXRoLnBvdygxMCxrKX1iLk1JTl9QT1NJVElWRV9WQUxVRT1NYXRoLnBvdygyLC0xMDc0KTtjbGFzcyBoIGV4dGVuZHMgYi5UZlNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9kM0xvZ1NjYWxlPWQzLnNjYWxlTG9nKCk7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zY2FsZShrKXtyZXR1cm4gMD49az9OYU46dGhpcy5fZDNMb2dTY2FsZShrKX1pbnZlcnQoayl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuaW52ZXJ0KGspfXNjYWxlVHJhbnNmb3JtYXRpb24oayl7cmV0dXJuIHRoaXMuc2NhbGUoayl9aW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbihrKXtyZXR1cm4gdGhpcy5pbnZlcnQoayl9Z2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKXtyZXR1cm4gdGhpcy5kb21haW4oKX1fZ2V0RG9tYWluKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59X3NldERvbWFpbihrKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPQprO2NvbnN0IFt0LGxdPWs7c3VwZXIuX3NldERvbWFpbihbTWF0aC5tYXgoYi5NSU5fUE9TSVRJVkVfVkFMVUUsdCksbF0pfV9uaWNlRG9tYWluKGspe2NvbnN0IFt0LGxdPWs7az1NYXRoLm1heChkKGIuTUlOX1BPU0lUSVZFX1ZBTFVFKSxkKHQpKTtjb25zdCBwPWQobCk7dmFyIG09cC1rO209bT9tKnRoaXMucGFkUHJvcG9ydGlvbigpOjE7cmV0dXJuW2YoTWF0aC5tYXgoZChiLk1JTl9QT1NJVElWRV9WQUxVRSksay1tKSksZihwK20pXX1fZ2V0VW5ib3VuZGVkRXh0ZW50KGspe2s9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoayk7bGV0IHQ9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1rLmxlbmd0aCYmKGs9W1Bsb3R0YWJsZS5VdGlscy5NYXRoLm1pbihrLHRbMF0pLFBsb3R0YWJsZS5VdGlscy5NYXRoLm1heChrLHRbMV0pXSx0PXRoaXMuX25pY2VEb21haW4oaykpO3JldHVybiB0fV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe3JldHVybiBzdXBlci5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKS5tYXAoaz0+CjA8az9rOmIuTUlOX1BPU0lUSVZFX1ZBTFVFKX1fZGVmYXVsdEV4dGVudCgpe3JldHVyblsxLDEwXX1fYmFja2luZ1NjYWxlRG9tYWluKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNMb2dTY2FsZS5kb21haW4oayk7cmV0dXJuIHRoaXN9X2dldFJhbmdlKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUucmFuZ2UoKX1fc2V0UmFuZ2Uoayl7dGhpcy5fZDNMb2dTY2FsZS5yYW5nZShrKX1kZWZhdWx0VGlja3MoKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS50aWNrcygpfXRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX1leHRlbnRPZlZhbHVlcyhrKXtsZXQgdD1rPWsuZmlsdGVyKGw9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIobCkmJjA8bCk7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2s9ay5tYXAoZCkuc29ydCgobSxuKT0+bS1uKTtjb25zdCBsPWQzLnF1YW50aWxlKGssLjA1KSxwPWQzLnF1YW50aWxlKGssCi45NSk7dD1rLmZpbHRlcihtPT5tPj1sJiZtPD1wKS5tYXAoZil9az1kMy5leHRlbnQodCk7cmV0dXJuIG51bGw9PWtbMF18fG51bGw9PWtbMV0/W106a319Yi5Mb2dTY2FsZT1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrW2suVEVYVD0wXT0iVEVYVCI7a1trLkRPTT0xXT0iRE9NIn0pKGR8fChkPXt9KSk7bGV0IGY7KGZ1bmN0aW9uKGspe2suTE9HPSJsb2ciO2suTElORUFSPSJsaW5lYXIifSkoZnx8KGY9e30pKTtjbGFzcyBoe2NvbnN0cnVjdG9yKGssdCxsLHAsbSxuLHEsdSx4LEEseSl7dGhpcy5zZXJpZXNOYW1lcz1bXTt0aGlzLm5hbWUyZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPXA7dGhpcy50b29sdGlwPW07dGhpcy5kYXRhc2V0cz1bXTt0aGlzLl9pZ25vcmVZT3V0bGllcnM9ITE7dGhpcy5sYXN0UG9pbnRzRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy5uYW5EYXRhc2V0PW5ldyBQbG90dGFibGUuRGF0YXNldDt0aGlzLnlWYWx1ZUFjY2Vzc29yPXQ7dGhpcy5zeW1ib2xGdW5jdGlvbj1BO3RoaXMub25EYXRhc2V0Q2hhbmdlZD10aGlzLl9vbkRhdGFzZXRDaGFuZ2VkLmJpbmQodGhpcyk7dGhpcy5fZGVmYXVsdFhSYW5nZT0KdTt0aGlzLl9kZWZhdWx0WVJhbmdlPXg7dGhpcy50b29sdGlwQ29sdW1ucz1uO3RoaXMuYnVpbGRDaGFydChrLGwscSx5KX1idWlsZENoYXJ0KGssdCxsLHApe3RoaXMuZGVzdHJveSgpO2s9aygpO3RoaXMueEFjY2Vzc29yPWsuYWNjZXNzb3I7dGhpcy54U2NhbGU9ay5zY2FsZTt0aGlzLnhBeGlzPWsuYXhpczt0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpO3AmJnRoaXMueEF4aXMuZm9ybWF0dGVyKHApO3RoaXMueVNjYWxlPWguZ2V0WVNjYWxlRnJvbVR5cGUodCk7dGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKT0+dGhpcy5nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKSk7dGhpcy55QXhpcz1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwibGVmdCIpO3A9cmcubXVsdGlzY2FsZUZvcm1hdHRlcihyZy5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIocCk7CnRoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oKTt0aGlzLmZpbGxBcmVhPWw7cD1uZXcgYi5QYW5ab29tRHJhZ0xheWVyKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLCgpPT50aGlzLnJlc2V0RG9tYWluKCkpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uPXRoaXMuY3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHApO3RoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudDtsPXRoaXMuYnVpbGRQbG90KHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLGwpO3RoaXMuZ3JpZGxpbmVzPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO2s9bnVsbDt0IT09Zi5MT0cmJihrPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigiaG9yaXpvbnRhbCIpLGsuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApKTt0PW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigidmVydGljYWwiKTsKdC5zY2FsZSh0aGlzLnhTY2FsZSkudmFsdWUoMCk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxrLHQsbCx0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQscF0pO3RoaXMuY2VudGVyLmFkZENsYXNzKCJtYWluIik7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChrLHQsbCl7bCYmKHRoaXMubWFyZ2luQXJlYVBsb3Q9bmV3IFBsb3R0YWJsZS5QbG90cy5BcmVhLHRoaXMubWFyZ2luQXJlYVBsb3QueCh0aGlzLnhBY2Nlc3NvcixrKSx0aGlzLm1hcmdpbkFyZWFQbG90LnkobC5oaWdoZXJBY2Nlc3Nvcix0KSx0aGlzLm1hcmdpbkFyZWFQbG90LnkwKGwubG93ZXJBY2Nlc3NvciksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsIiwocSx1LHgpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeC5tZXRhZGF0YSgpLm5hbWUpKSwKdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoInN0cm9rZS13aWR0aCIsMCkpO3RoaXMuc21vb3RoZWRBY2Nlc3Nvcj1xPT5xLnNtb290aGVkO2w9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO2wueCh0aGlzLnhBY2Nlc3NvcixrKTtsLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTtsLmF0dHIoInN0cm9rZSIsKHEsdSx4KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHgubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5saW5lUGxvdD1sO3RoaXMuc2V0dXBUb29sdGlwcyhsKTtsZXQgcD1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7cC54KHRoaXMueEFjY2Vzc29yLGspO3AueSh0aGlzLnNtb290aGVkQWNjZXNzb3IsdCk7cC5hdHRyKCJzdHJva2UiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMuc21vb3RoTGluZVBsb3Q9cDtpZih0aGlzLnN5bWJvbEZ1bmN0aW9uKXt2YXIgbT0KbmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO20ueCh0aGlzLnhBY2Nlc3NvcixrKTttLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTttLmF0dHIoImZpbGwiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5zeW1ib2woKHEsdSx4KT0+dGhpcy5zeW1ib2xGdW5jdGlvbih4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90PW19bT1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bS54KHRoaXMueEFjY2Vzc29yLGspO20ueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHQpO20uYXR0cigiZmlsbCIscT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHEubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5kYXRhc2V0cyhbdGhpcy5sYXN0UG9pbnRzRGF0YXNldF0pO3RoaXMuc2NhdHRlclBsb3Q9Cm07bGV0IG49bmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO24ueCh0aGlzLnhBY2Nlc3NvcixrKTtuLnkocT0+cS5kaXNwbGF5WSx0KTtuLmF0dHIoImZpbGwiLHE9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShxLm5hbWUpKTtuLmF0dHIoIm9wYWNpdHkiLDEpO24uc2l6ZSgyKnJnLk5BTl9TWU1CT0xfU0laRSk7bi5kYXRhc2V0cyhbdGhpcy5uYW5EYXRhc2V0XSk7bi5zeW1ib2woUGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSk7dGhpcy5uYW5EaXNwbGF5PW47az1bbixtLHAsbF07dGhpcy5tYXJnaW5BcmVhUGxvdCYmay5wdXNoKHRoaXMubWFyZ2luQXJlYVBsb3QpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZrLnB1c2godGhpcy5tYXJrZXJzU2NhdHRlclBsb3QpO3JldHVybiBuZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoayl9X29uRGF0YXNldENoYW5nZWQoayl7dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnJlc21vb3RoRGF0YXNldChrKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfWlnbm9yZVlPdXRsaWVycyhrKXtrIT09CnRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz1rLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy55U2NhbGUuaWdub3JlT3V0bGllcihrKSx0aGlzLnJlc2V0WURvbWFpbigpKX1nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKXtjb25zdCBrPXRoaXMuZ2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCk7cmV0dXJuIF8uZmxhdHRlbkRlZXAodGhpcy5kYXRhc2V0cy5tYXAodD0+ay5tYXAobD0+dC5kYXRhKCkubWFwKHA9PmwocCwtMSx0KSkpKSkuZmlsdGVyKGlzRmluaXRlKX11cGRhdGVTcGVjaWFsRGF0YXNldHMoKXtjb25zdCBrPXRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpO3ZhciB0PXRoaXMuZGF0YXNldHMubWFwKGw9PntsZXQgcD1udWxsLG09bC5kYXRhKCkuZmlsdGVyKG49PiFpc05hTihrKG4sLTEsbCkpKTswPG0ubGVuZ3RoJiYocD1tW20ubGVuZ3RoLTFdLHAubmFtZT1sLm1ldGFkYXRhKCkubmFtZSxwLnJlbGF0aXZlPQpyZy5yZWxhdGl2ZUFjY2Vzc29yKHAsLTEsbCkpO3JldHVybiBwfSkuZmlsdGVyKGw9Pm51bGwhPWwpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YSh0KTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cy5tYXAodGhpcy5jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMpKTt0PV8uZmxhdHRlbih0aGlzLmRhdGFzZXRzLm1hcChsPT57bGV0IHA9bnVsbCxtPWwuZGF0YSgpLG49MDtmb3IoO248bS5sZW5ndGgmJm51bGw9PXA7KWlzTmFOKGsobVtuXSwtMSxsKSl8fChwPWsobVtuXSwtMSxsKSksbisrO251bGw9PXAmJihwPTApO2xldCBxPVtdO2ZvcihuPTA7bjxtLmxlbmd0aDtuKyspaXNOYU4oayhtW25dLC0xLGwpKT8obVtuXS5uYW1lPWwubWV0YWRhdGEoKS5uYW1lLG1bbl0uZGlzcGxheVk9cCxtW25dLnJlbGF0aXZlPXJnLnJlbGF0aXZlQWNjZXNzb3IobVtuXSwtMSxsKSxxLnB1c2gobVtuXSkpOgpwPWsobVtuXSwtMSxsKTtyZXR1cm4gcX0pKTt0aGlzLm5hbkRhdGFzZXQuZGF0YSh0KX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCk7dGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtpZihudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlKXZhciBrPXRoaXMuX2RlZmF1bHRYUmFuZ2U7ZWxzZSBrPXRoaXMueFNjYWxlLGsuX2RvbWFpbk1pbj1udWxsLGsuX2RvbWFpbk1heD1udWxsLGs9ay5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUuZG9tYWluKGspfXJlc2V0WURvbWFpbigpe251bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2U/dGhpcy55U2NhbGUuZG9tYWluKHRoaXMuX2RlZmF1bHRZUmFuZ2UpOih0aGlzLnlTY2FsZS5hdXRvRG9tYWluKCksdGhpcy55U2NhbGUuZG9tYWluKHRoaXMueVNjYWxlLmRvbWFpbigpKSl9Z2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCl7Y29uc3Qgaz1bdGhpcy5nZXRZQXhpc0FjY2Vzc29yKCldO3RoaXMuZmlsbEFyZWEmJmsucHVzaCh0aGlzLmZpbGxBcmVhLmxvd2VyQWNjZXNzb3IsCnRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpO3JldHVybiBrfWdldFlBeGlzQWNjZXNzb3IoKXtyZXR1cm4gdGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yfWNyZWF0ZVRvb2x0aXBJbnRlcmFjdGlvbihrKXtjb25zdCB0PW5ldyByZy5Qb2ludGVySW50ZXJhY3Rpb24sbD0oKT0+e3QuZW5hYmxlZCghMSk7dGhpcy5oaWRlVG9vbHRpcHMoKX0scD0oKT0+dC5lbmFibGVkKCEwKTtrLm9uUGFuU3RhcnQobCk7ay5vbkRyYWdab29tU3RhcnQobCk7ay5vblBhbkVuZChwKTtrLm9uRHJhZ1pvb21FbmQocCk7ay5vblNjcm9sbFpvb20oKCk9PnRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodGhpcy5fbGFzdE1vdXNlUG9zaXRpb24pKTt0Lm9uUG9pbnRlck1vdmUobT0+e3RoaXMuX2xhc3RNb3VzZVBvc2l0aW9uPW07dGhpcy51cGRhdGVUb29sdGlwQ29udGVudChtKX0pO3Qub25Qb2ludGVyRXhpdCgoKT0+dGhpcy5oaWRlVG9vbHRpcHMoKSk7CnJldHVybiB0fXVwZGF0ZVRvb2x0aXBDb250ZW50KGspe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2xldCB0PXt4OmsueCx5OmsueSxkYXR1bTpudWxsLGRhdGFzZXQ6bnVsbH0sbD10aGlzLmdyaWRsaW5lcy5jb250ZW50KCkubm9kZSgpLmdldEJCb3goKTt2YXIgcD10aGlzLmxpbmVQbG90LmRhdGFzZXRzKCkubWFwKHU9PnRoaXMuZmluZENsb3Nlc3RQb2ludCh0LHUpKS5maWx0ZXIoQm9vbGVhbik7bGV0IG09UGxvdHRhYmxlLlV0aWxzLkRPTS5pbnRlcnNlY3RzQkJveCxuPXAuZmlsdGVyKHU9Pm0odS54LHUueSxsKXx8aXNOYU4odGhpcy55VmFsdWVBY2Nlc3Nvcih1LmRhdHVtLDAsdS5kYXRhc2V0KSkpLHE9bi5maWx0ZXIodT0+IWlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodS5kYXR1bSwKMCx1LmRhdGFzZXQpKSk7MCE9PXAubGVuZ3RoPyh0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIikscD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShxLHU9PnUuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpLHAuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoInBvaW50IiwhMCkscC5hdHRyKCJyIixyZy5UT09MVElQX0NJUkNMRV9TSVpFKS5hdHRyKCJjeCIsdT0+dS54KS5hdHRyKCJjeSIsdT0+dS55KS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpLmF0dHIoImZpbGwiLHU9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh1LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSkscC5leGl0KCkucmVtb3ZlKCksdGhpcy5kcmF3VG9vbHRpcHMobix0LHRoaXMudG9vbHRpcENvbHVtbnMpKTp0aGlzLmhpZGVUb29sdGlwcygpfSkpfWhpZGVUb29sdGlwcygpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWUpOwp0aGlzLnRvb2x0aXAuaGlkZSgpO3RoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIik7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHMoayl7ay5vbkRldGFjaCgoKT0+e3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCExKX0pO2sub25BbmNob3IoKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5hdHRhY2hUbyhrKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCEwKX0pfWRyYXdUb29sdGlwcyhrLHQsbCl7aWYoay5sZW5ndGgpe3ZhciBwPXRoaXMuY29sb3JTY2FsZTtsPVt7dGl0bGU6IiIsc3RhdGljOiExLGV2YWxUeXBlOmQuRE9NLGV2YWx1YXRlKHkpe2QzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInNwYW4iKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9PnAuc2NhbGUoeS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwpyZXR1cm4iIn0sZW50ZXIoeSl7ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKT0+cC5zY2FsZSh5LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSl9fSwuLi5sXTt2YXIgbT15PT5NYXRoLnBvdyh5LngtdC54LDIpK01hdGgucG93KHkueS10LnksMiksbj1fLm1pbihrLm1hcChtKSkscT10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3I7az0iYXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0Qnkoayx5PT5xKHkuZGF0dW0sLTEseS5kYXRhc2V0KSk6ImRlc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLHk9PnEoeS5kYXR1bSwtMSx5LmRhdGFzZXQpKS5yZXZlcnNlKCk6Im5lYXJlc3QiPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLG0pOmsuc2xpY2UoMCkucmV2ZXJzZSgpOwp2YXIgdT10aGlzLHg9ZDMuc2VsZWN0KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxBPXguc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGwseT0+eS50aXRsZSk7QS5lbnRlcigpLmFwcGVuZCgidGgiKS50ZXh0KHk9PnkudGl0bGUpLm5vZGVzKCk7QS5leGl0KCkucmVtb3ZlKCk7az14LnNlbGVjdCgidGJvZHkiKS5zZWxlY3RBbGwoInRyIikuZGF0YShrLHk9PnkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpO2suY2xhc3NlZCgiZGlzdGFudCIseT0+e3ZhciB3PXkuZGF0YXNldC5kYXRhKClbMF0sQz1fLmxhc3QoeS5kYXRhc2V0LmRhdGEoKSk7dz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3Nvcih3LDAseS5kYXRhc2V0KSk7Qz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihDLDAseS5kYXRhc2V0KSk7eT10aGlzLnNtb290aGluZ0VuYWJsZWQ/eS5kYXR1bS5zbW9vdGhlZDp0aGlzLnlWYWx1ZUFjY2Vzc29yKHkuZGF0dW0sCjAseS5kYXRhc2V0KTtyZXR1cm4gdC54PHd8fHQueD5DfHxpc05hTih5KX0pLmNsYXNzZWQoImNsb3Nlc3QiLHk9Pm0oeSk9PT1uKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcyxsLHkpfSkub3JkZXIoKTtrLmV4aXQoKS5yZW1vdmUoKTtrLmVudGVyKCkuYXBwZW5kKCJ0ciIpLmVhY2goZnVuY3Rpb24oeSl7dS5kcmF3VG9vbHRpcFJvdyh0aGlzLGwseSl9KS5ub2RlcygpO3RoaXMudG9vbHRpcC51cGRhdGVBbmRQb3NpdGlvbih0aGlzLnRhcmdldFNWRy5ub2RlKCkpfWVsc2UgdGhpcy50b29sdGlwLmhpZGUoKX1kcmF3VG9vbHRpcFJvdyhrLHQsbCl7Y29uc3QgcD10aGlzO2s9ZDMuc2VsZWN0KGspLnNlbGVjdEFsbCgidGQiKS5kYXRhKHQpO2suZWFjaChmdW5jdGlvbihtKXttLnN0YXRpY3x8cC5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKHAsdGhpcyxtLGwpfSk7ay5lbnRlcigpLmFwcGVuZCgidGQiKS5lYWNoKGZ1bmN0aW9uKG0pe20uZW50ZXImJm0uZW50ZXIuY2FsbCh0aGlzLApsKTtwLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwocCx0aGlzLG0sbCl9KX1kcmF3VG9vbHRpcENvbHVtbihrLHQsbCl7Y29uc3QgcD10aGlzLnNtb290aGluZ0VuYWJsZWQ7dC5ldmFsVHlwZT09ZC5ET00/dC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSk6ZDMuc2VsZWN0KGspLnRleHQodC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSkpfWZpbmRDbG9zZXN0UG9pbnQoayx0KXtjb25zdCBsPXQuZGF0YSgpLm1hcCgobixxKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IobixxLHQpKSk7bGV0IHA9Xy5zb3J0ZWRJbmRleChsLGsueCk7aWYoMD09bC5sZW5ndGgpcmV0dXJuIG51bGw7cD09PWwubGVuZ3RoPy0tcDowIT09cCYmKHA9TWF0aC5hYnMobFtwLTFdLWsueCk8TWF0aC5hYnMobFtwXS1rLngpP3AtMTpwKTtrPXQuZGF0YSgpW3BdO2NvbnN0IG09dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcihrLApwLHQpOnRoaXMueVZhbHVlQWNjZXNzb3IoayxwLHQpO3JldHVybnt4OmxbcF0seTp0aGlzLnlTY2FsZS5zY2FsZShtKSxkYXR1bTprLGRhdGFzZXQ6dH19cmVzbW9vdGhEYXRhc2V0KGspe2xldCB0PWsuZGF0YSgpO2NvbnN0IGw9dGhpcy5zbW9vdGhpbmdXZWlnaHQ7bGV0IHA9MDx0Lmxlbmd0aD8wOk5hTixtPTA7Y29uc3Qgbj10Lm1hcCgodSx4KT0+dGhpcy55VmFsdWVBY2Nlc3Nvcih1LHgsaykpLHE9bi5ldmVyeSh1PT51PT1uWzBdKTt0LmZvckVhY2goKHUseCk9Pnt4PW5beF07cXx8IU51bWJlci5pc0Zpbml0ZSh4KT91LnNtb290aGVkPXg6KHA9cCpsKygxLWwpKngsbSsrLHg9MSwxIT09bCYmKHg9MS1NYXRoLnBvdyhsLG0pKSx1LnNtb290aGVkPXAveCl9KX1nZXREYXRhc2V0KGspe3ZvaWQgMD09PXRoaXMubmFtZTJkYXRhc2V0c1trXSYmKHRoaXMubmFtZTJkYXRhc2V0c1trXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se25hbWU6ayxtZXRhOm51bGx9KSk7cmV0dXJuIHRoaXMubmFtZTJkYXRhc2V0c1trXX1zdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUoayl7aWYoaz09PQpmLkxPRylyZXR1cm4gbmV3IGIuTG9nU2NhbGU7aWYoaz09PWYuTElORUFSKXJldHVybiBuZXcgYi5MaW5lYXJTY2FsZTt0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIHlTY2FsZSB0eXBlICIrayk7fXNldFZpc2libGVTZXJpZXMoayl7dGhpcy5zZXJpZXNOYW1lcz1rPWsuc29ydCgpO2sucmV2ZXJzZSgpO3RoaXMuZGF0YXNldHMuZm9yRWFjaCh0PT50Lm9mZlVwZGF0ZSh0aGlzLm9uRGF0YXNldENoYW5nZWQpKTt0aGlzLmRhdGFzZXRzPWsubWFwKHQ9PnRoaXMuZ2V0RGF0YXNldCh0KSk7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKHQ9PnQub25VcGRhdGUodGhpcy5vbkRhdGFzZXRDaGFuZ2VkKSk7dGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoayl7Y29uc3QgdD1rLmRhdGEoKTtpZigyMD49dC5sZW5ndGgpcmV0dXJuIGs7Y29uc3QgbD1NYXRoLmNlaWwodC5sZW5ndGgvMjApLHA9QXJyYXkoTWF0aC5mbG9vcih0Lmxlbmd0aC9sKSk7Zm9yKGxldCBtPTAsbj0wO208cC5sZW5ndGg7bSsrLG4rPWwpcFttXT10W25dO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQocCxrLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoayx0KXt0aGlzLmdldERhdGFzZXQoaykuZGF0YSh0KTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1zZXRTZXJpZXNNZXRhZGF0YShrLHQpe3Q9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmdldERhdGFzZXQoaykubWV0YWRhdGEoKSx7bWV0YTp0fSk7dGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKHQpfXNtb290aGluZ1VwZGF0ZShrKXt0aGlzLnNtb290aGluZ1dlaWdodD0Kazt0aGlzLmRhdGFzZXRzLmZvckVhY2godD0+dGhpcy5yZXNtb290aERhdGFzZXQodCkpO3RoaXMuc21vb3RoaW5nRW5hYmxlZHx8KHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhpbmdFbmFibGVkPSEwLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cykpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSwKdGhpcy5zbW9vdGhpbmdFbmFibGVkPSExLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKX1zZXRUb29sdGlwU29ydGluZ01ldGhvZChrKXt0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPWt9cmVuZGVyVG8oayl7dGhpcy50YXJnZXRTVkc9azt0aGlzLm91dGVyLnJlbmRlclRvKGspO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTsKdGhpcy5vdXRlci5yZWRyYXcoKX0pfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5faW52YWxpZGF0ZUxheW91dFJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IGs9dGhpcy5fbGFzdERyYXdCQm94LndpZHRoLHt3aWR0aDp0fT10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7MD09ayYmazx0JiZ0aGlzLm91dGVyLmludmFsaWRhdGVDYWNoZSgpfXRoaXMuX2xhc3REcmF3QkJveD10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZGVzdHJveSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpOwp3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCl9b25BbmNob3Ioayl7aWYodGhpcy5vdXRlcil0aGlzLm91dGVyLm9uQW5jaG9yKGspfX1iLkxpbmVDaGFydD1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmpzCihmdW5jdGlvbihiKXtjb25zdCBkPXJnLm11bHRpc2NhbGVGb3JtYXR0ZXIocmcuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLGY9aD0+aXNOYU4oaCk/Ik5hTiI6ZChoKTtiLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TPVt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmg9PmguZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiU21vb3RoZWQiLGV2YWx1YXRlKGgsayl7cmV0dXJuIGYoay5zbW9vdGhpbmdFbmFibGVkP2guZGF0dW0uc21vb3RoZWQ6aC5kYXR1bS5zY2FsYXIpfX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6aD0+ZihoLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6aD0+cmcuc3RlcEZvcm1hdHRlcihoLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOmg9PnJnLnRpbWVGb3JtYXR0ZXIoaC5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpoPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGguZGF0dW0sCi0xLGguZGF0YXNldCkpfV07UG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQyIixwcm9wZXJ0aWVzOntjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxzeW1ib2xGdW5jdGlvbjpPYmplY3Qsc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTouNn0seFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0seEF4aXNGb3JtYXR0ZXI6T2JqZWN0LHlWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+aD0+aC5zY2FsYXJ9LHRvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5iLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TfSxmaWxsQXJlYTpPYmplY3QsCmRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSx5U2NhbGVUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToibGluZWFyIn0saWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LHRvb2x0aXBQb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6RWguVG9vbHRpcFBvc2l0aW9uLkJPVFRPTX0sX2NoYXJ0Ok9iamVjdCxfdmlzaWJsZVNlcmllc0NhY2hlOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3Nlcmllc0RhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNNZXRhZGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZDp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9tYWtlQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeFR5cGUsIHlWYWx1ZUFjY2Vzc29yLCB5U2NhbGVUeXBlLCB0b29sdGlwQ29sdW1ucywgY29sb3JTY2FsZSwgaXNBdHRhY2hlZCkiLAoiX3JlbG9hZEZyb21DYWNoZShfY2hhcnQsIF92aXNpYmxlU2VyaWVzQ2FjaGUpIiwiX3Ntb290aGluZ0NoYW5nZWQoc21vb3RoaW5nRW5hYmxlZCwgc21vb3RoaW5nV2VpZ2h0LCBfY2hhcnQpIiwiX3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCh0b29sdGlwU29ydGluZ01ldGhvZCwgX2NoYXJ0KSIsIl9vdXRsaWVyc0NoYW5nZWQoaWdub3JlWU91dGxpZXJzLCBfY2hhcnQpIl0scmVhZHkoKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxhdHRhY2hlZCgpe2NvbnN0IGg9e2NhcHR1cmU6ITAscGFzc2l2ZTohMH07dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4odGhpcywibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywKImtleXVwIix0aGlzLl9vbktleVVwLmJpbmQodGhpcyksaCl9LGRldGFjaGVkKCl7dGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzLmZvckVhY2goKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk9PntoLnJlbW92ZUV2ZW50TGlzdGVuZXIoayx0LGwpfSksdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCkpfSxfbGlzdGVuKGgsayx0LGw9e30pe3RoaXMuX2xpc3RlbmVyc3x8KHRoaXMuX2xpc3RlbmVycz1uZXcgU2V0KTt0aGlzLl9saXN0ZW5lcnMuYWRkKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk7aC5hZGRFdmVudExpc3RlbmVyKGssdCxsKX0sX29uS2V5RG93bihoKXt0aGlzLnRvZ2dsZUNsYXNzKCJwYW5rZXkiLGIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbktleVVwKGgpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsCmIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbk1vdXNlRG93bigpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITApfSxfb25Nb3VzZVVwKCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMSl9LHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oaCl7Xy5pc0VxdWFsKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSxoKXx8KHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1oKX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihoLGspe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGgsayl9LHNldFNlcmllc01ldGFkYXRhKGgsayl7dGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLGspfSxyZXNldERvbWFpbjpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5yZXNldERvbWFpbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmCnRoaXMuX2NoYXJ0LnJlZHJhdygpfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKGgsayx0LGwscCxtKXtrfHxoP2smJihoPSgpPT5yZy5nZXRYQ29tcG9uZW50cyhrKSk6aD1yZy5zdGVwWDtudWxsIT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpLHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGgmJnRoaXMueVZhbHVlQWNjZXNzb3ImJnRoaXMudG9vbHRpcENvbHVtbnMpe3ZhciBuPW5ldyBiLkxpbmVDaGFydChoLHRoaXMueVZhbHVlQWNjZXNzb3IsbCxtLHRoaXMuJC50b29sdGlwLHRoaXMudG9vbHRpcENvbHVtbnMsdGhpcy5maWxsQXJlYSx0aGlzLmRlZmF1bHRYUmFuZ2UsdGhpcy5kZWZhdWx0WVJhbmdlLAp0aGlzLnN5bWJvbEZ1bmN0aW9uLHRoaXMueEF4aXNGb3JtYXR0ZXIpLHE9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7bi5yZW5kZXJUbyhxKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2NoYXJ0PW47dGhpcy5fY2hhcnQub25BbmNob3IoKCk9PnRoaXMuZmlyZSgiY2hhcnQtYXR0YWNoZWQiKSl9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChoPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShoLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXXx8W10pfSksdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZpbHRlcihoPT50aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdKS5mb3JFYWNoKGg9Pnt0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLHRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbaF0pfSksdGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpKX0sCl9zbW9vdGhpbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5fY2hhcnQuc21vb3RoaW5nVXBkYXRlKHRoaXMuc21vb3RoaW5nV2VpZ2h0KTp0aGlzLl9jaGFydC5zbW9vdGhpbmdEaXNhYmxlKCkpfSxfb3V0bGllcnNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0Lmlnbm9yZVlPdXRsaWVycyh0aGlzLmlnbm9yZVlPdXRsaWVycyl9LF90b29sdGlwU29ydGluZ01ldGhvZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcFNvcnRpbmdNZXRob2QodGhpcy50b29sdGlwU29ydGluZ01ldGhvZCl9LGdldEV4cG9ydGVyKCl7cmV0dXJuIG5ldyBiLkxpbmVDaGFydEV4cG9ydGVyKHRoaXMuJC5jaGFydGRpdil9fSl9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdnotbGluZS1jaGFydDIuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotbGluZS1jaGFydC10b29sdGlwIn0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQtZXhwb3J0ZXIuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrLkdST1VQPSJHIjtrLkRJVj0iRElWIjtrLlNWRz0iU1ZHIjtrLlRFWFQ9IlRFWFQifSkoZHx8KGQ9e30pKTtjbGFzcyBme2NvbnN0cnVjdG9yKGspe3RoaXMudW5pcXVlSWQ9MDt0aGlzLnJvb3Q9a31leHBvcnRBc1N0cmluZygpe2NvbnN0IGs9dGhpcy5jb252ZXJ0KHRoaXMucm9vdCk7aWYoIWspcmV0dXJuIiI7Y29uc3QgdD10aGlzLmNyZWF0ZVJvb3RTdmcoKTt0LmFwcGVuZENoaWxkKGspO3JldHVybiB0Lm91dGVySFRNTH1jcmVhdGVVbmlxdWVJZCgpe3JldHVybmAkeyJjbGlwIn1fJHt0aGlzLnVuaXF1ZUlkKyt9YH1nZXRTaXplKCl7cmV0dXJuIHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jcmVhdGVSb290U3ZnKCl7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdmciKSx0PXRoaXMuZ2V0U2l6ZSgpO2suc2V0QXR0cmlidXRlTlMoInN2ZyIsInZpZXdCb3giLGAwIDAgJHt0LndpZHRofSAke3QuaGVpZ2h0fWApOwprLnNldEF0dHJpYnV0ZSgieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIpO3JldHVybiBrfWNvbnZlcnQoayl7bGV0IHQ9bnVsbDt2YXIgbD1rLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYoay5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREV8fGwhPWQuRElWJiZsIT1kLlNWRyl0PWsuY2xvbmVOb2RlKCk7ZWxzZXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZC5HUk9VUCk7dmFyIHA9d2luZG93LmdldENvbXB1dGVkU3R5bGUoayksbT1wYXJzZUludChwLmxlZnQsMTApLG49cGFyc2VJbnQocC50b3AsMTApO2lmKG18fG4pbD10aGlzLmNyZWF0ZVVuaXF1ZUlkKCksdC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke219LCAke259KWApLHQuc2V0QXR0cmlidXRlKCJjbGlwLXBhdGgiLGB1cmwoIyR7bH0pYCksbj1wYXJzZUludChwLmhlaWdodCwxMCksbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJyZWN0IiksbS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKU3RyaW5nKHBhcnNlSW50KHAud2lkdGgsMTApKSksbS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKG4pKSxwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygic3ZnIiwiY2xpcFBhdGgiKSxwLmlkPWwscC5hcHBlbmRDaGlsZChtKSx0LmFwcGVuZENoaWxkKHApfUFycmF5LmZyb20oay5jaGlsZE5vZGVzKS5tYXAocT0+dGhpcy5jb252ZXJ0KHEpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChxPT50LmFwcGVuZENoaWxkKHEpKTtyZXR1cm4gdC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT1kLkdST1VQJiYhdC5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUoayk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKGssdCkpfXN0cmlwQ2xhc3Moayl7ay5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJmsucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpO3JldHVybiBrfXRyYW5zZmVyU3R5bGUoayx0KXtpZih0Lm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdDsKY29uc3QgbD10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7az13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShrKTtsPT1kLlRFWFQmJk9iamVjdC5hc3NpZ24odC5zdHlsZSx7Zm9udEZhbWlseTprLmZvbnRGYW1pbHksZm9udFNpemU6ay5mb250U2l6ZSxmb250V2VpZ2h0OmsuZm9udFdlaWdodH0pO2whPWQuR1JPVVAmJih0LnNldEF0dHJpYnV0ZSgiZmlsbCIsay5maWxsKSx0LnNldEF0dHJpYnV0ZSgic3Ryb2tlIixrLnN0cm9rZSksdC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsay5zdHJva2VXaWR0aCkpOyIxIiE9ay5vcGFjaXR5JiZ0LnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsay5vcGFjaXR5KTtyZXR1cm4gdH1zaG91bGRPbWl0Tm9kZSgpe3JldHVybiExfX1iLlBsb3R0YWJsZUV4cG9ydGVyPWY7Y2xhc3MgaCBleHRlbmRzIGZ7c2hvdWxkT21pdE5vZGUoayl7cmV0dXJuIGsubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFP2suY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKToKITF9fWIuTGluZUNoYXJ0RXhwb3J0ZXI9aH0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyL3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPVtdLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gXy50aHJvdHRsZShmdW5jdGlvbiBoKCl7aWYoMCE9Yi5sZW5ndGgpe3ZhciBrPWIuc2hpZnQoKTtrLmFjdGl2ZSYmKGsucmVkcmF3KCksay5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITEpO3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSgwKTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGgpfX0sMTAwKX0oKTtQb2x5bWVyKHtpczoidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIscHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9maXhCYWRTdGF0ZVdoZW5BY3RpdmUifSxkYXRhU2VyaWVzOkFycmF5LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxsb2dTY2FsZUFjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9nU2NhbGVDaGFuZ2VkIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDpPYmplY3QseFR5cGU6U3RyaW5nLHlWYWx1ZUFjY2Vzc29yOk9iamVjdCxmaWxsQXJlYTpPYmplY3QsCnNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRvb2x0aXBDb2x1bW5zOkFycmF5LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyx0b29sdGlwUG9zaXRpb246U3RyaW5nLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLGRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSxzeW1ib2xGdW5jdGlvbjpPYmplY3QsY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6cGYucnVuc0NvbG9yU2NhbGV9KX0sX3Jlc2V0RG9tYWluT25OZXh0TG9hZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2RhdGFTZXJpZXNDaGFuZ2VkKGRhdGFTZXJpZXMuKikiLCJfbG9hZEtleUNoYW5nZWQobG9hZEtleSkiXSxvbkxvYWRGaW5pc2goKXswPAp0aGlzLmRhdGFUb0xvYWQubGVuZ3RoJiZ0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQmJih0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITEsdGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCkpO3RoaXMucmVkcmF3KCl9LGRldGFjaGVkKCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKX0sZXhwb3J0QXNTdmdTdHJpbmcoKXtyZXR1cm4gdGhpcy4kLmNoYXJ0LmdldEV4cG9ydGVyKCkuZXhwb3J0QXNTdHJpbmcoKX0scmVzZXREb21haW4oKXt0aGlzLiQuY2hhcnQucmVzZXREb21haW4oKX0sc2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGYsaCl9LHNldFNlcmllc01ldGFkYXRhKGYsaCl7dGhpcy4kLmNoYXJ0LnNldFNlcmllc01ldGFkYXRhKGYsaCl9LHJlZHJhdygpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZik7dGhpcy5fcmVkcmF3UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmFjdGl2ZT8KdGhpcy4kLmNoYXJ0LnJlZHJhdygpOnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwfSl9LF9sb2FkS2V5Q2hhbmdlZCgpe3RoaXMucmVzZXQoKTt0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITB9LF9kYXRhU2VyaWVzQ2hhbmdlZCgpe3RoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyl9LF9sb2dTY2FsZUNoYW5nZWQoZil7dGhpcy4kLmNoYXJ0LnlTY2FsZVR5cGU9Zj8ibG9nIjoibGluZWFyIjt0aGlzLnJlZHJhdygpfSxfZml4QmFkU3RhdGVXaGVuQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlJiYoYi5wdXNoKHRoaXMpLGQoKSl9LF9vbkNoYXJ0QXR0YWNoZWQoKXt0aGlzLmFjdGl2ZXx8KHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItZGlhbG9nLXNjcm9sbGFibGUvcGFwZXItZGlhbG9nLXNjcm9sbGFibGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nLXNjcm9sbGFibGUiLHByb3BlcnRpZXM6e2RpYWxvZ0VsZW1lbnQ6e3R5cGU6T2JqZWN0fX0sZ2V0IHNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzLiQuc2Nyb2xsYWJsZX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTt0aGlzLmNsYXNzTGlzdC5hZGQoIm5vLXBhZGRpbmciKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVTY3JvbGxTdGF0ZS5iaW5kKHRoaXMpKX0sdXBkYXRlU2Nyb2xsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJpcy1zY3JvbGxlZCIsMDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ApO3RoaXMudG9nZ2xlQ2xhc3MoImNhbi1zY3JvbGwiLHRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpO3RoaXMudG9nZ2xlQ2xhc3MoInNjcm9sbGVkLXRvLWJvdHRvbSIsCnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCt0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ+PXRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCl9LF9lbnN1cmVUYXJnZXQ6ZnVuY3Rpb24oKXsodGhpcy5kaWFsb2dFbGVtZW50PXRoaXMuZGlhbG9nRWxlbWVudHx8dGhpcy5wYXJlbnRFbGVtZW50KSYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycyYmMDw9dGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKFBvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGwpPyh0aGlzLmRpYWxvZ0VsZW1lbnQuc2l6aW5nVGFyZ2V0PXRoaXMuc2Nyb2xsVGFyZ2V0LHRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoImZpdCIpKTp0aGlzLmRpYWxvZ0VsZW1lbnQmJnRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5hZGQoImZpdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1hcmtkb3duLXZpZXcvdGYtbWFya2Rvd24tdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1tYXJrZG93bi12aWV3Iixwcm9wZXJ0aWVzOntodG1sOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGF0dGFjaGVkKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5tYXJrZG93biwhMCl9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXJkLWhlYWRpbmcvdXRpbC5qcwp2YXIgSGg7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoZil7aWYoIWYpcmV0dXJuIG51bGw7bGV0IGg9Zi5tYXRjaCgvXiMoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkkLyk7aWYoIWgpcmV0dXJuIG51bGw7aWYoND09Zi5sZW5ndGgpZm9yKGY9MTszPj1mO2YrKyloW2ZdKz1oW2ZdO3JldHVybltwYXJzZUludChoWzFdLDE2KSxwYXJzZUludChoWzJdLDE2KSxwYXJzZUludChoWzNdLDE2KV19Yi5mb3JtYXREYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBmP2YudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn07Yi5waWNrVGV4dENvbG9yPWZ1bmN0aW9uKGYpe3JldHVybihmPWQoZikpPzEyNTxNYXRoLnJvdW5kKCgyOTkqZlswXSs1ODcqZlsxXSsxMTQqZlsyXSkvMUUzKT8iaW5oZXJpdCI6IiNlZWUiOiJpbmhlcml0In19KShIaHx8KEhoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2FyZC1oZWFkaW5nL3RmLWNhcmQtaGVhZGluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXJkLWhlYWRpbmciLHByb3BlcnRpZXM6e2Rpc3BsYXlOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0YWc6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHJ1bjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVzY3JpcHRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGNvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcnVuQmFja2dyb3VuZDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQmFja2dyb3VuZChjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX25hbWVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlTmFtZUxhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn0sX3RhZ0xhYmVsOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9jb21wdXRlVGFnTGFiZWwoZGlzcGxheU5hbWUsIHRhZykifX0sX3VwZGF0ZUhlYWRpbmdTdHlsZSgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXJkLWhlYWRpbmctYmFja2dyb3VuZC1jb2xvciI6dGhpcy5fcnVuQmFja2dyb3VuZCwiLS10Zi1jYXJkLWhlYWRpbmctY29sb3IiOnRoaXMuX3J1bkNvbG9yfSl9LF9jb21wdXRlUnVuQmFja2dyb3VuZChiKXtyZXR1cm4gYnx8Im5vbmUifSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBIaC5waWNrVGV4dENvbG9yKGIpfSxfY29tcHV0ZU5hbWVMYWJlbChiLGQpe3JldHVybiBifHxkfHwiIn0sX2NvbXB1dGVUYWdMYWJlbChiLGQpe3JldHVybiBkJiZkIT09Yj9kOiIifSxfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2coYil7dGhpcy4kLmRlc2NyaXB0aW9uRGlhbG9nLnBvc2l0aW9uVGFyZ2V0PWIudGFyZ2V0O3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy50b2dnbGUoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL3RmLWRvd25sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZG93bmxvYWRlciIscHJvcGVydGllczp7X3J1bjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJ1bnM6QXJyYXksdGFnOlN0cmluZyx1cmxGbjpGdW5jdGlvbn0sX2NzdlVybChiLGQsZil7cmV0dXJuIGQ/dmMuYWRkUGFyYW1zKGYoYixkKSx7Zm9ybWF0OiJjc3YifSk6IiJ9LF9qc29uVXJsKGIsZCxmKXtyZXR1cm4gZD9mKGIsZCk6IiJ9LF9jc3ZOYW1lKGIsZCl7cmV0dXJuIGQ/YHJ1bi0ke2R9LXRhZy0ke2J9LmNzdmA6IiJ9LF9qc29uTmFtZShiLGQpe3JldHVybiBkP2BydW4tJHtkfS10YWctJHtifS5qc29uYDoiIn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1jYXJkIixwcm9wZXJ0aWVzOnt0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTpCb29sZWFuLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bkxpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfbG9hZERhdGFDYWxsYmFjazp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Zj1mLm1hcChrPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqa1swXSksc3RlcDprWzFdLHNjYWxhcjprWzJdfSkpO2NvbnN0IGg9dGhpcy5fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bShkKTtiLnNldFNlcmllc01ldGFkYXRhKGgsZCk7Yi5zZXRTZXJpZXNEYXRhKGgsCmYpfX0scmVhZE9ubHk6ITB9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHt0YWc6YixydW46ZH0pPT52Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi9zY2FsYXJzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6YixydW46ZH0pKX19LF9kb3dubG9hZFVybEZuOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCk9PnRoaXMuZ2V0RGF0YUxvYWRVcmwoe3RhZzpiLHJ1bjpkfSl9fSxyZXF1ZXN0RGF0YTpGdW5jdGlvbixfZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYil9fSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGI9CkdoLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TLnNsaWNlKCksZD1iLmZpbmRJbmRleChmPT4iTmFtZSI9PWYudGl0bGUpO2Iuc3BsaWNlKGQsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PntmPWYuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGYpfX0pO3JldHVybiBifX19LHJlbG9hZCgpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGI9dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpOwpiJiZiLnJlc2V0RG9tYWluKCl9LF91cGRhdGVEb3dubG9hZExpbmsoKXtjb25zdCBiPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5leHBvcnRBc1N2Z1N0cmluZygpO3RoaXMuJCQoIiNzdmdMaW5rIikuaHJlZj1gZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke2J0b2EoYil9YH0sX3J1bnNGcm9tRGF0YShiKXtyZXR1cm4gYi5tYXAoZD0+ZC5ydW4pfSxfZ2V0RGF0YVNlcmllcygpe3JldHVybiB0aGlzLmRhdGFUb0xvYWQubWFwKGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYikpfSxfZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOmIsZXhwZXJpbWVudDpkPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtkLm5hbWUsYl0pfSxfZ2V0U2VyaWVzRGlzcGxheU5hbWVGcm9tRGF0dW0oYil7cmV0dXJuIGIucnVufSxfZ2V0Q29sb3JTY2FsZSgpe3JldHVybiBudWxsIT09dGhpcy5jb2xvclNjYWxlP3RoaXMuY29sb3JTY2FsZToKe3NjYWxlOmI9PntbLGJdPUpTT04ucGFyc2UoYik7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yYW5nZS1iZWhhdmlvci9pcm9uLXJhbmdlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmFuZ2VCZWhhdmlvcj17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZShiKS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKGIpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbihiKXtiPXBhcnNlRmxvYXQoYik7CmlmKCF0aGlzLnN0ZXApcmV0dXJuIGI7Yj1NYXRoLnJvdW5kKChiLXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiAxPnRoaXMuc3RlcD9iLygxL3RoaXMuc3RlcCkrdGhpcy5taW46Yip0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTt0aGlzLnZhbHVlPXRoaXMub2xkVmFsdWU9aXNOYU4oYik/dGhpcy5vbGRWYWx1ZTpiO3JldHVybiB0aGlzLnZhbHVlIT09Yn0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXByb2dyZXNzL3BhcGVyLXByb2dyZXNzLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXByb2dyZXNzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWNvbmRhcnlSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMH0saW5kZXRlcm1pbmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdG9nZ2xlSW5kZXRlcm1pbmF0ZSJ9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIn19LG9ic2VydmVyczpbIl9wcm9ncmVzc0NoYW5nZWQoc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSkiXSxob3N0QXR0cmlidXRlczp7cm9sZToicHJvZ3Jlc3NiYXIifSxfdG9nZ2xlSW5kZXRlcm1pbmF0ZTpmdW5jdGlvbihiKXt0aGlzLnRvZ2dsZUNsYXNzKCJpbmRldGVybWluYXRlIiwKYix0aGlzLiQucHJpbWFyeVByb2dyZXNzKX0sX3RyYW5zZm9ybVByb2dyZXNzOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS50cmFuc2Zvcm09Yi5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlWCgiK2QvMTAwKyIpIn0sX21haW5SYXRpb0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyxiKX0sX3Byb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbihiLGQsZixoLGspe2I9dGhpcy5fY2xhbXBWYWx1ZShiKTtkPXRoaXMuX2NsYW1wVmFsdWUoZCk7dmFyIHQ9MTAwKnRoaXMuX2NhbGNSYXRpbyhiKSxsPTEwMCp0aGlzLl9jYWxjUmF0aW8oZCk7dGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8odCk7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnNlY29uZGFyeVByb2dyZXNzLHQpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsbCk7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz1iO2s/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciKToKdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixmKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLGI/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09Yn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zbGlkZXIvcGFwZXItc2xpZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNsaWRlciIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yLFBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NuYXBzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwaW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZCJ9LGVkaXRhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltbWVkaWF0ZVZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sbWF4TWFya2Vyczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGV4cGFuZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfSwKaWdub3JlQmFyVG91Y2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZHJhZ2dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYW5zaXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sbWFya2Vyczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVLbm9iKHZhbHVlLCBtaW4sIG1heCwgc25hcHMsIHN0ZXApIiwiX3ZhbHVlQ2hhbmdlZCh2YWx1ZSkiLCJfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkKGltbWVkaWF0ZVZhbHVlKSIsIl91cGRhdGVNYXJrZXJzKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykiXSxob3N0QXR0cmlidXRlczp7cm9sZToic2xpZGVyIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7bGVmdDoiX2xlZnRLZXkiLHJpZ2h0OiJfcmlnaHRLZXkiLCJkb3duIHBhZ2Vkb3duIGhvbWUiOiJfZGVjcmVtZW50S2V5IiwidXAgcGFnZXVwIGVuZCI6Il9pbmNyZW1lbnRLZXkifSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMuJC5zbGlkZXJCYXIsImF1dG8iKX0saW5jcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUrdGhpcy5zdGVwKX0sZGVjcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUtdGhpcy5zdGVwKX0sX3VwZGF0ZUtub2I6ZnVuY3Rpb24oYixkLGYpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixkKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsZik7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGIpO3RoaXMuX3Bvc2l0aW9uS25vYigxMDAqdGhpcy5fY2FsY1JhdGlvKGIpKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgidmFsdWUtY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZHJhZ2dpbmc/CnRoaXMuZmlyZSgiaW1tZWRpYXRlLXZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSk6dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlfSxfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpfSxfZXhwYW5kS25vYjpmdW5jdGlvbigpe3RoaXMuX3NldEV4cGFuZCghMCl9LF9yZXNldEtub2I6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERlYm91bmNlcigiZXhwYW5kS25vYiIpO3RoaXMuX3NldEV4cGFuZCghMSl9LF9wb3NpdGlvbktub2I6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbihiKSkpO3RoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkpO3RoaXMuJC5zbGlkZXJLbm9iLnN0eWxlLmxlZnQ9dGhpcy5yYXRpbysiJSI7dGhpcy5kcmFnZ2luZyYmCih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKmIvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbihiKXtiLnN0b3BQcm9wYWdhdGlvbigpO3N3aXRjaChiLmRldGFpbC5zdGF0ZSl7Y2FzZSAic3RhcnQiOnRoaXMuX3RyYWNrU3RhcnQoYik7YnJlYWs7Y2FzZSAidHJhY2siOnRoaXMuX3RyYWNrWChiKTticmVhaztjYXNlICJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt0aGlzLl9rbm9ic3RhcnR4PXRoaXMuX3N0YXJ0eD10aGlzLl94PXRoaXMucmF0aW8qdGhpcy5fdy8xMDA7dGhpcy5fbWlueD0tdGhpcy5fc3RhcnR4O3RoaXMuX21heHg9CnRoaXMuX3ctdGhpcy5fc3RhcnR4O3RoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7dGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKGIpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQoYik7dGhpcy5feD10aGlzLl9zdGFydHgrTWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LGIuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odGhpcy5feC90aGlzLl93KjEwMCkpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX2NhbGNSYXRpbyh0aGlzLmltbWVkaWF0ZVZhbHVlKSp0aGlzLl93LXRoaXMuX2tub2JzdGFydHgrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwp0aGlzLl9zZXREcmFnZ2luZyghMSk7dGhpcy5fcmVzZXRLbm9iKCk7dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlO2IudHJhbnNmb3JtPWIud2Via2l0VHJhbnNmb3JtPSIiO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2tub2Jkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2V4cGFuZEtub2IoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFydHJhY2s6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dCYXJFdmVudChiKSYmdGhpcy5fb25UcmFjayhiKX0sX2JhcmNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt2YXIgZD10aGlzLiQuc2xpZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9KGIuZGV0YWlsLngtZC5sZWZ0KS90aGlzLl93KjEwMDt0aGlzLl9pc1JUTCYmKGQ9MTAwLWQpO3ZhciBmPXRoaXMucmF0aW87dGhpcy5fc2V0VHJhbnNpdGluZyghMCk7dGhpcy5fcG9zaXRpb25Lbm9iKGQpOwpmPT09dGhpcy5yYXRpbyYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSk7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0pO2IucHJldmVudERlZmF1bHQoKTt0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2FsbG93QmFyRXZlbnQoYikmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayhiKSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtiLnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24oYixkLGYsaCl7aHx8dGhpcy5fc2V0TWFya2VycyhbXSk7ZD1NYXRoLnJvdW5kKChmLWQpL3RoaXMuc3RlcCk7ZD5iJiYoZD1iKTtpZigwPmR8fCFpc0Zpbml0ZShkKSlkPTA7dGhpcy5fc2V0TWFya2VycyhBcnJheShkKSl9LF9tZXJnZUNsYXNzZXM6ZnVuY3Rpb24oYil7cmV0dXJuIE9iamVjdC5rZXlzKGIpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gYltkXX0pLmpvaW4oIiAiKX0sCl9nZXRDbGFzc05hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lcmdlQ2xhc3Nlcyh7ZGlzYWJsZWQ6dGhpcy5kaXNhYmxlZCxwaW46dGhpcy5waW4sc25hcHM6dGhpcy5zbmFwcyxyaW5nOnRoaXMuaW1tZWRpYXRlVmFsdWU8PXRoaXMubWluLGV4cGFuZDp0aGlzLmV4cGFuZCxkcmFnZ2luZzp0aGlzLmRyYWdnaW5nLHRyYW5zaXRpbmc6dGhpcy50cmFuc2l0aW5nLGVkaXRhYmxlOnRoaXMuZWRpdGFibGV9KX0sX2FsbG93QmFyRXZlbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIXRoaXMuaWdub3JlQmFyVG91Y2h8fGIuZGV0YWlsLnNvdXJjZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudH0sZ2V0IF9pc1JUTCgpe3ZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7cmV0dXJuIHRoaXMuX19pc1JUTH0sX2xlZnRLZXk6ZnVuY3Rpb24oYil7dGhpcy5faXNSVEw/dGhpcy5faW5jcmVtZW50S2V5KGIpOgp0aGlzLl9kZWNyZW1lbnRLZXkoYil9LF9yaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9kZWNyZW1lbnRLZXkoYik6dGhpcy5faW5jcmVtZW50S2V5KGIpfSxfaW5jcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiZW5kIj09PWIuZGV0YWlsLmtleT90aGlzLnZhbHVlPXRoaXMubWF4OnRoaXMuaW5jcmVtZW50KCksdGhpcy5maXJlKCJjaGFuZ2UiKSxiLnByZXZlbnREZWZhdWx0KCkpfSxfZGVjcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiaG9tZSI9PT1iLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1pbjp0aGlzLmRlY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYi5wcmV2ZW50RGVmYXVsdCgpKX0sX2NoYW5nZVZhbHVlOmZ1bmN0aW9uKGIpe3RoaXMudmFsdWU9Yi50YXJnZXQudmFsdWU7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW5wdXRLZXlEb3duOmZ1bmN0aW9uKGIpe2Iuc3RvcFByb3BhZ2F0aW9uKCl9LApfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5zbGlkZXJLbm9iO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJnRoaXMuZW5zdXJlUmlwcGxlKCk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHRoaXMuX3JpcHBsZS5ob2xkRG93bj1iKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNtb290aGluZy1pbnB1dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zbW9vdGhpbmctaW5wdXQiLHByb3BlcnRpZXM6e3N0ZXA6TnVtYmVyLG1heDpOdW1iZXIsbWluOk51bWJlcix3ZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOi42LG5vdGlmeTohMH0sX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQifSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkIn19LF91cGRhdGVXZWlnaHQ6Xy5kZWJvdW5jZShmdW5jdGlvbihiKXt0aGlzLndlaWdodD1ifSwyNTApLF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKTsKdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyx0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcil9LF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkOmZ1bmN0aW9uKCl7MD4rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0P3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMCI6MTwrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0JiYodGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIxIik7dmFyIGI9K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDtpc05hTihiKXx8dGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyxiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3Nob3dEb3dubG9hZExpbmtzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOnBkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciJ9LF9zbW9vdGhpbmdXZWlnaHQ6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6cGQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIiwKe2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0sX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfZ2V0Q2F0ZWdvcnlJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5iPT5iLnRhZ30sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDUwKX19LGJlaGF2aW9yczpbcWQuQXJyYXlVcGRhdGVIZWxwZXJdLG9ic2VydmVyczpbIl91cGRhdGVDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIl0sCl9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyOnBkLmdldEJvb2xlYW5PYnNlcnZlcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLF9pZ25vcmVZT3V0bGllcnNPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKGIpe3JldHVybiAwPGJ9LF9nZXRDYXRlZ29yeUtleShiKXtyZXR1cm4gYi5tZXRhZGF0YS50eXBlPT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFM/IiI6Yi5uYW1lfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT4Ke3RoaXMuX3JlbG9hZENoYXJ0cygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfdXBkYXRlQ2F0ZWdvcmllcyhiLGQsZil7Yj1fLm1hcFZhbHVlcyhiLGg9Pk9iamVjdC5rZXlzKGgpKTsKZD0kYy5jYXRlZ29yaXplVGFncyhiLGQsZik7ZC5mb3JFYWNoKGg9PntoLml0ZW1zPWguaXRlbXMubWFwKGs9Pih7dGFnOmsudGFnLHNlcmllczprLnJ1bnMubWFwKHQ9Pih7cnVuOnQsdGFnOmsudGFnfSkpfSkpfSk7dGhpcy51cGRhdGVBcnJheVByb3AoIl9jYXRlZ29yaWVzIixkLHRoaXMuX2dldENhdGVnb3J5S2V5KX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtjb25zdCBoPWYudGFnLGs9e307Zi5zZXJpZXMuZm9yRWFjaCgoe3J1bjpwfSk9PntrW3BdPWRbcF1baF19KTtmPWgucmVwbGFjZSgvXC9zY2FsYXJfc3VtbWFyeSQvLCIiKTtsZXQge2Rlc2NyaXB0aW9uOnQsZGlzcGxheU5hbWU6bH09cmYuYWdncmVnYXRlVGFnSW5mbyhrLGYpO2IubWV0YWRhdGEudHlwZT09JGMuQ2F0ZWdvcnlUeXBlLlBSRUZJWF9HUk9VUCYmbC5zdGFydHNXaXRoKGIubmFtZSsiLyIpJiYobD1sLnNsaWNlKGIubmFtZS5sZW5ndGgrMSkpO3JldHVybntkZXNjcmlwdGlvbjp0LGRpc3BsYXlOYW1lOmx9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItaGVscGVycy5qcwp2YXIgVGk7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGgsayx0LGwscCl7dGhpcy5ydW49aDt0aGlzLnRhZz1rO3RoaXMubmFtZT10O3RoaXMuc2NhbGFyRGF0YT1sO3RoaXMuc3ltYm9sPXB9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YShoKXt0aGlzLnNjYWxhckRhdGE9aH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19Yi5EYXRhU2VyaWVzPWQ7Yi5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lPWZ1bmN0aW9uKGgsayl7cmV0dXJuYCR7a30gKCR7aH0pYH07Y2xhc3MgZntjb25zdHJ1Y3RvcihoKXt0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZT1ofXNjYWxlKGgpe3JldHVybiB0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZS5zY2FsZSh0aGlzLnBhcnNlUnVuTmFtZShoKSl9cGFyc2VSdW5OYW1lKGgpe3JldHVybihoPWgubWF0Y2goL1woKC4qKVwpJC8pKT8KaFsxXToiIn19Yi5EYXRhU2VyaWVzQ29sb3JTY2FsZT1mfSkoVGl8fChUaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx4VHlwZTpTdHJpbmcsYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHRpdGxlOlN0cmluZyxtYXJnaW5DaGFydFNlcmllczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcihtYXJnaW5DaGFydFNlcmllcykifSxfdGFnRmlsdGVySW52YWxpZDpCb29sZWFuLF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn0sCl9maWxsQXJlYTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6e2xvd2VyQWNjZXNzb3I6Yj0+Yi5sb3dlcixoaWdoZXJBY2Nlc3NvcjpiPT5iLnVwcGVyfX0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSxkPWY9PmlzTmFOKGYpPyJOYU4iOmIoZik7cmV0dXJuW3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiTG93ZXIgTWFyZ2luIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0ubG93ZXIpfSx7dGl0bGU6IlVwcGVyIE1hcmdpbiIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnVwcGVyKX0se3RpdGxlOiJTdGVwIixldmFsdWF0ZTpmPT5yZy5zdGVwRm9ybWF0dGVyKGYuZGF0dW0uc3RlcCl9LHt0aXRsZToiVGltZSIsCmV2YWx1YXRlOmY9PnJnLnRpbWVGb3JtYXR0ZXIoZi5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpmPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGYuZGF0dW0sLTEsZi5kYXRhc2V0KSl9XX19LF9taXNzaW5nVGFnczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3N0ZXBzTWlzbWF0Y2g6T2JqZWN0fSxvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwKIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYj10aGlzLiQubG9hZGVyO2ImJmIucmVzZXREb21haW4oKX0sX2NzdlVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiB2Yy5hZGRQYXJhbXMoYix7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKGIpe3JldHVybihkLGYsaCk9PntpZihoLnJlZ2V4X3ZhbGlkKXt2YXIgaz1fLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLAp0PVtdO18uZm9yRWFjaChiLGw9Pnt2YXIgcD0hMSxtPWgudGFnX3RvX2V2ZW50c1tsLnZhbHVlXTtjb25zdCBuPWgudGFnX3RvX2V2ZW50c1tsLmxvd2VyXSxxPWgudGFnX3RvX2V2ZW50c1tsLnVwcGVyXTtfLmlzVW5kZWZpbmVkKG0pJiYodC5wdXNoKGwudmFsdWUpLHA9ITApO18uaXNVbmRlZmluZWQobikmJih0LnB1c2gobC5sb3dlcikscD0hMCk7Xy5pc1VuZGVmaW5lZChxKSYmKHQucHVzaChsLnVwcGVyKSxwPSEwKTtpZighcCl7dmFyIHU9eT0+eVsxXTtpZihwPXRoaXMuX2ZpbmRTdGVwTWlzbWF0Y2gobCxtLm1hcCh1KSxuLm1hcCh1KSxxLm1hcCh1KSkpdGhpcy5zZXQoIl9zdGVwc01pc21hdGNoIixwKTtlbHNle3ZhciB4PXk9PnlbMl07cD1tLm1hcCgoeSx3KT0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKnlbMF0pLHN0ZXA6dSh5KSxzY2FsYXI6eCh5KSxsb3dlcjp4KG5bd10pLHVwcGVyOngocVt3XSl9KSk7bT1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGYsbC52YWx1ZSk7CnZhciBBPWtbbV07QT9BLnNldERhdGEocCk6KGw9dGhpcy5fY3JlYXRlTmV3RGF0YVNlcmllcyhmLGwudmFsdWUsbSxwKSxrW21dPWwpfX19KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGspO2Q9Xy5maW5kSW5kZXgodGhpcy5fbWlzc2luZ1RhZ3MsbD0+bC5ydW49PT1mKTtpZih0Lmxlbmd0aCYmMyE9dC5sZW5ndGgpe2NvbnN0IGw9e3J1bjpmLHRhZ3M6dH07MDw9ZD90aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixkLDEsbCk6dGhpcy5wdXNoKCJfbWlzc2luZ1RhZ3MiLGwpfWVsc2UgMDw9ZCYmdGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsZCwxKX1lbHNlIHRoaXMuc2V0KCJfdGFnRmlsdGVySW52YWxpZCIsITApfX0sX2ZpbmRTdGVwTWlzbWF0Y2goYixkLGYsaCl7cmV0dXJuIF8uaXNFcXVhbChmLGQpJiZfLmlzRXF1YWwoaCxkKT9udWxsOntzZXJpZXNPYmplY3Q6Yix2YWx1ZVN0ZXBzOmQsbG93ZXJTdGVwczpmLHVwcGVyU3RlcHM6aH19LF9jcmVhdGVOZXdEYXRhU2VyaWVzKGIsCmQsZixoKXt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXXw9MDtkPW5ldyBUaS5EYXRhU2VyaWVzKGIsZCxmLGgscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdXSk7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdKzEpJXJnLlNZTUJPTFNfTElTVC5sZW5ndGg7cmV0dXJuIGR9LF91cGRhdGVDaGFydChiKXtfLmZvck93bihiLGQ9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoZC5nZXROYW1lKCksZC5nZXREYXRhKCkpfSl9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBiPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLGRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sCl9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYj0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1tiXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChiLGQpe3JldHVybiBiW2RdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYil7cmV0dXJuIF8uZmxhdHRlbihiLm1hcChkPT5bZC52YWx1ZSxkLmxvd2VyLGQudXBwZXJdKSkubWFwKGQ9PiIoIit0aGlzLl9lc2NhcGVSZWdleENoYXJhY3RlcnMoZCkrIikiKS5qb2luKCJ8Iil9LF9lc2NhcGVSZWdleENoYXJhY3RlcnMoYil7cmV0dXJuIGIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJFx4MjYiKX0sX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLAohdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhiKXtyZXR1cm4gYnx8InVudGl0bGVkIn0sX3NlcGFyYXRlV2l0aENvbW1hcyhiKXtyZXR1cm4gYi5qb2luKCIsICIpfSxfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4oKXt0aGlzLnNldCgiX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQiLCF0aGlzLl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKX0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsdGFnUmVnZXhlczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbixzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcih0YWdSZWdleGVzKSJ9LF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn19LApvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJC5sb2FkZXI7YiYmYi5yZXNldERvbWFpbigpfSxfY3N2VXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gdmMuYWRkUGFyYW1zKGIse2Zvcm1hdDoiY3N2In0pfSxfanNvblVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLAp7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2lmKGYucmVnZXhfdmFsaWQpe2NvbnN0IGg9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKTtfLmZvck93bihmLnRhZ190b19ldmVudHMsKGssdCk9Pntjb25zdCBsPWsubWFwKG09Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyptWzBdKSxzdGVwOm1bMV0sc2NhbGFyOm1bMl19KSk7az1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGQsdCk7Y29uc3QgcD1oW2tdO3A/cC5zZXREYXRhKGwpOihfLmlzVW5kZWZpbmVkKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdKSYmKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPQowKSx0PW5ldyBUaS5EYXRhU2VyaWVzKGQsdCxrLGwscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdXSksaFtrXT10LHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXSsxKSVyZy5TWU1CT0xTX0xJU1QubGVuZ3RoKX0pO3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIsaCl9fX0sX3VwZGF0ZUNoYXJ0KGIpe09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtkLGZdKT0+e3RoaXMuJC5sb2FkZXIuc2V0U2VyaWVzRGF0YShkLGYuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlbGVjdGVkUnVuc1NldChiKXtjb25zdCBkPXt9O18uZm9yRWFjaChiLGY9PntkW2ZdPTF9KTtyZXR1cm4gZH0sX2NvbXB1dGVTZXJpZXNOYW1lcygpe2NvbnN0IGI9bmV3IFNldCh0aGlzLnJ1bnMpO3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5maWx0ZXIoKFssCmRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sX3JlZnJlc2hEYXRhU2VyaWVzKCl7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix7fSl9LF9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW2JdLmdldFN5bWJvbCgpLm1ldGhvZCgpfSxfZGV0ZXJtaW5lU3ltYm9sKGIsZCl7cmV0dXJuIGJbZF0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyfSxfY29tcHV0ZVRhZ0ZpbHRlcihiKXtyZXR1cm4gMT09PWIubGVuZ3RoP2JbMF06Yi5tYXAoZD0+IigiK2QrIikiKS5qb2luKCJ8Iil9LF9nZXRUb2dnbGVNYXRjaGVzSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9LF9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKGIpe3JldHVybiBifHwKInVudGl0bGVkIn0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6cGQuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOi42fSksb2JzZXJ2ZXI6Il9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlciJ9LF9pZ25vcmVZT3V0bGllcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfbGF5b3V0Ok9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfbGF5b3V0KSJ9LF9vcGVuZWRDYXRlZ29yaWVzOnt0eXBlOk9iamVjdH0sX2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+CntmLmNhbmNlbGxlZHx8KHRoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwhZi52YWx1ZS5jdXN0b21fc2NhbGFycyksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZXRyaWV2ZUxheW91dEFuZERhdGEoKSl9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZCl9LF9yZWxvYWRDaGFydHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCwgdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9sYXlvdXQiKSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2xheW91dCIsZi52YWx1ZSksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZWxvYWRDaGFydHMoKSl9KTsKdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfSxfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6cGQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6cGQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChiKXtyZXR1cm4gMDxifSxfbWFrZUNhdGVnb3JpZXMoYil7aWYoIWIuY2F0ZWdvcnkpcmV0dXJuW107bGV0IGQ9ITE7dGhpcy5fb3BlbmVkQ2F0ZWdvcmllc3x8KGQ9ITAsdGhpcy5fb3BlbmVkQ2F0ZWdvcmllcz17fSk7cmV0dXJuIGIuY2F0ZWdvcnkubWFwKGY9Pgp7ZCYmIWYuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tmLnRpdGxlXT0hMCk7cmV0dXJue25hbWU6Zi50aXRsZSxpdGVtczpmLmNoYXJ0LG1ldGFkYXRhOntvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2YudGl0bGVdfX19KX0sX2NhdGVnb3J5T3BlbmVkVG9nZ2xlZChiKXtiPWIudGFyZ2V0O2Iub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbYi5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tiLmNhdGVnb3J5Lm5hbWVdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltYWdlLWRhc2hib2FyZC90Zi1pbWFnZS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaW1hZ2UtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxhY3R1YWxTaXplOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxicmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6LjV9LGNvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9pbWFnZUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLApub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgoX3N0ZXBzKSJ9LF9zYW1wbGVUZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTYW1wbGVUZXh0KHNhbXBsZSkifSwKX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpIn0sX2lzSW1hZ2VMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIiwiX3VwZGF0ZUltYWdlVXJsKF9jdXJyZW50U3RlcCwgYnJpZ2h0bmVzc0FkanVzdG1lbnQsIGNvbnRyYXN0UGVyY2VudGFnZSkiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXAoYixkKXtyZXR1cm4gYltkXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWUoYil7cmV0dXJuIGI/Yi5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lKGIpe3JldHVybiBiPwpIaC5mb3JtYXREYXRlKGIud2FsbF90aW1lKToiIn0sX2NvbXB1dGVNYXhTdGVwSW5kZXgoYil7cmV0dXJuIGIubGVuZ3RoLTF9LF9jb21wdXRlU2FtcGxlVGV4dChiKXtyZXR1cm5gJHtiKzF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sX2dldEFyaWFFeHBhbmRlZCgpe3JldHVybiB0aGlzLmFjdHVhbFNpemU/InRydWUiOiJmYWxzZSJ9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL2ltYWdlcyIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksCnRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7bGV0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtkPXZjLmFkZFBhcmFtcyhkLHt0czpiLndhbGxfdGltZX0pO2QrPSJceDI2IitiLnF1ZXJ5O3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSxzdGVwOmIuc3RlcCx1cmw6ZH19LF91cGRhdGVJbWFnZVVybChiLGQsZil7aWYoYil7dmFyIGg9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2gub25sb2FkPWgub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZShrPT57ay5jYW5jZWxsZWR8fChrPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpLGsuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGgpLAp0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMSkpfSkuYmluZCh0aGlzKTtoLnN0eWxlLmZpbHRlcj1gY29udHJhc3QoJHtmfSUpIGA7aC5zdHlsZS5maWx0ZXIrPWBicmlnaHRuZXNzKCR7ZH0pYDt0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMCk7aC5zcmM9Yi51cmx9fSxfaGFuZGxlVGFwKCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfSxfdG9Mb2NhbGVTdHJpbmcoYil7cmV0dXJuIGIudG9Mb2NhbGVTdHJpbmcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2FjdHVhbFNpemU6Qm9vbGVhbixfZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxLHJlYWRPbmx5OiEwfSxfZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLHJlYWRPbmx5OiEwfSxfYnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9jb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMH0sX3RhZ0ZpbHRlcjpTdHJpbmcsX2JyaWdodG5lc3NJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVCcmlnaHRuZXNzSXNEZWZhdWx0KF9icmlnaHRuZXNzQWRqdXN0bWVudCkifSxfY29udHJhc3RJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChfY29udHJhc3RQZXJjZW50YWdlKSJ9LApfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEltYWdlcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLGg9Pk9iamVjdC5rZXlzKGgpKTtmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLAowPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkSW1hZ2VzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWltYWdlLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9yZXNldEJyaWdodG5lc3MoKXt0aGlzLl9icmlnaHRuZXNzQWRqdXN0bWVudD10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9yZXNldENvbnRyYXN0KCl7dGhpcy5fY29udHJhc3RQZXJjZW50YWdlPXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LF9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH0sX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LApfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcix0b3RhbFNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21ldGFkYXRhQ2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3N0ZXBJbmRleDpOdW1iZXIsX2hhc0F0TGVhc3RPbmVTdGVwOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKSJ9LF9oYXNNdWx0aXBsZVN0ZXBzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpIn0sX2N1cnJlbnREYXR1bTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudERhdHVtKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KF9zdGVwcykifSxfc2FtcGxlVGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU2FtcGxlVGV4dChzYW1wbGUpIn0sX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyh0b3RhbFNhbXBsZXMpIn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlTWF4U3RlcEluZGV4KGIpe3JldHVybiBiLmxlbmd0aC0xfSxfY29tcHV0ZUN1cnJlbnREYXR1bShiLGQpe3JldHVybiBiW2RdfSxfY29tcHV0ZVNhbXBsZVRleHQoYil7cmV0dXJuYCR7YisKMX1gfSxfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhiKXtyZXR1cm4gMTxifSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvYXVkaW8iLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOnRoaXMuc2FtcGxlfSkpLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksdGhpcy5zZXQoIl9zdGVwcyIsZiksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLGYubGVuZ3RoLTEpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2NyZWF0ZVN0ZXBEYXR1bShiKXt2YXIgZD0KbmV3IFVSTFNlYXJjaFBhcmFtcyhiLnF1ZXJ5KTtkLmFwcGVuZCgidHMiLGIud2FsbF90aW1lKTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi9pbmRpdmlkdWFsQXVkaW8iLGQpO3JldHVybnt3YWxsX3RpbWU6SGguZm9ybWF0RGF0ZShuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKSxzdGVwOmIuc3RlcCxsYWJlbDpiLmxhYmVsLGNvbnRlbnRUeXBlOmIuY29udGVudFR5cGUsdXJsOmR9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyKSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEF1ZGlvKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsCnRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCl9fSl9LF9yZWxvYWRBdWRpbygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1hdWRpby1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCx0b3RhbFNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSwKdCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHQuaXRlbXMubWFwKGgpKX0pKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWF1dG9ncm93LXRleHRhcmVhL2lyb24tYXV0b2dyb3ctdGV4dGFyZWEuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7dmFsdWU6e29ic2VydmVyOiJfdmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LGJpbmRWYWx1ZTp7b2JzZXJ2ZXI6Il9iaW5kVmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjEsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30scmVhZG9ubHk6e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufSwKbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbGFiZWw6e3R5cGU6U3RyaW5nfX0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQifSxnZXQgdGV4dGFyZWEoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhfSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LHNldCBzZWxlY3Rpb25TdGFydChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQ9Yn0sc2V0IHNlbGVjdGlvbkVuZChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPWJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKS8pJiYodGhpcy4kLnRleHRhcmVhLnN0eWxlLm1hcmdpbkxlZnQ9Ii0zcHgiKX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQudGV4dGFyZWEudmFsaWRpdHkudmFsaWQ7CmImJih0aGlzLnJlcXVpcmVkJiYiIj09PXRoaXMudmFsdWU/Yj0hMTp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLnZhbHVlKSkpO3RoaXMuaW52YWxpZD0hYjt0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKTtyZXR1cm4gYn0sX2JpbmRWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy52YWx1ZT1ifSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMudGV4dGFyZWE7ZCYmKGQudmFsdWUhPT1iJiYoZC52YWx1ZT1ifHwwPT09Yj9iOiIiKSx0aGlzLmJpbmRWYWx1ZT1iLHRoaXMuJC5taXJyb3IuaW5uZXJIVE1MPXRoaXMuX3ZhbHVlRm9yTWlycm9yKCksdGhpcy5maXJlKCJiaW5kLXZhbHVlLWNoYW5nZWQiLHt2YWx1ZTp0aGlzLmJpbmRWYWx1ZX0pKX0sX29uSW5wdXQ6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDt0aGlzLnZhbHVlPWQ/ZFswXS52YWx1ZToKYi50YXJnZXQudmFsdWV9LF9jb25zdHJhaW46ZnVuY3Rpb24oYil7Yj1ifHxbIiJdO2ZvcihiPTA8dGhpcy5tYXhSb3dzJiZiLmxlbmd0aD50aGlzLm1heFJvd3M/Yi5zbGljZSgwLHRoaXMubWF4Um93cyk6Yi5zbGljZSgwKTswPHRoaXMucm93cyYmYi5sZW5ndGg8dGhpcy5yb3dzOyliLnB1c2goIiIpO3JldHVybiBiLmpvaW4oIlx4M2Nici9ceDNlIikrIlx4MjYjMTYwOyJ9LF92YWx1ZUZvck1pcnJvcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudGV4dGFyZWE7aWYoYilyZXR1cm4gdGhpcy50b2tlbnM9YiYmYi52YWx1ZT9iLnZhbHVlLnJlcGxhY2UoLyYvZ20sIlx4MjZhbXA7IikucmVwbGFjZSgvIi9nbSwiXHgyNnF1b3Q7IikucmVwbGFjZSgvJy9nbSwiXHgyNiMzOTsiKS5yZXBsYWNlKC88L2dtLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nbSwiXHgyNmd0OyIpLnNwbGl0KCJcbiIpOlsiIl0sdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX0sX3VwZGF0ZUNhY2hlZDpmdW5jdGlvbigpe3RoaXMuJC5taXJyb3IuaW5uZXJIVE1MPQp0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRleHRhcmVhIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e19hcmlhTGFiZWxsZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhTGFiZWxsZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSxfYXJpYURlc2NyaWJlZEJ5OntvYnNlcnZlcjoiX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmd9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxzZXQgc2VsZWN0aW9uU3RhcnQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWJ9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sCnNldCBzZWxlY3Rpb25FbmQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZD1ifSxfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpfSxfYXJpYURlc2NyaWJlZEJ5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYil9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC50ZXh0YXJlYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b2FzdC9wYXBlci10b2FzdC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPW51bGw7UG9seW1lcih7aXM6InBhcGVyLXRvYXN0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcl0scHJvcGVydGllczp7Zml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93LG9ic2VydmVyOiJfb25GaXRJbnRvQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjNFM30sdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX19vblRyYW5zaXRpb25FbmQifSxnZXQgdmlzaWJsZSgpe1BvbHltZXIuQmFzZS5fd2FybigiYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkIik7CnJldHVybiB0aGlzLm9wZW5lZH0sZ2V0IF9jYW5BdXRvQ2xvc2UoKXtyZXR1cm4gMDx0aGlzLmR1cmF0aW9uJiZJbmZpbml0eSE9PXRoaXMuZHVyYXRpb259LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdXRvQ2xvc2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0sc2hvdzpmdW5jdGlvbihkKXsic3RyaW5nIj09dHlwZW9mIGQmJihkPXt0ZXh0OmR9KTtmb3IodmFyIGYgaW4gZCkwPT09Zi5pbmRleE9mKCJfIik/UG9seW1lci5CYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZisnIiBpcyBwcml2YXRlIGFuZCB3YXMgbm90IHNldC4nKTpmIGluIHRoaXM/dGhpc1tmXT1kW2ZdOlBvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2YrJyIgaXMgbm90IHZhbGlkLicpO3RoaXMub3BlbigpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpfSxfX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihkKXtkJiZkLnRhcmdldD09PQp0aGlzJiYib3BhY2l0eSI9PT1kLnByb3BlcnR5TmFtZSYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYXV0b0Nsb3NlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9hdXRvQ2xvc2UpLHRoaXMuX2F1dG9DbG9zZT1udWxsKTt0aGlzLm9wZW5lZD8oYiYmYiE9PXRoaXMmJmIuY2xvc2UoKSxiPXRoaXMsdGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0aGlzLnRleHR9KSx0aGlzLl9jYW5BdXRvQ2xvc2UmJih0aGlzLl9hdXRvQ2xvc2U9dGhpcy5hc3luYyh0aGlzLmNsb3NlLHRoaXMuZHVyYXRpb24pKSk6Yj09PXRoaXMmJihiPW51bGwpO1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJwYXBlci10b2FzdC1vcGVuIil9LApfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QucmVtb3ZlKCJwYXBlci10b2FzdC1vcGVuIil9LF9vbkZpdEludG9DaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMucG9zaXRpb25UYXJnZXQ9ZH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdG9nZ2xlLWJ1dHRvbi9wYXBlci10b2dnbGUtYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRvZ2dsZS1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJidXR0b24iLCJhcmlhLXByZXNzZWQiOiJmYWxzZSIsdGFiaW5kZXg6MH0scHJvcGVydGllczp7fSxsaXN0ZW5lcnM6e3RyYWNrOiJfb250cmFjayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsZnVuY3Rpb24oKXtQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMsInBhbi15Iil9KX0sX29udHJhY2s6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbDsic3RhcnQiPT09Yi5zdGF0ZT90aGlzLl90cmFja1N0YXJ0KGIpOiJ0cmFjayI9PT1iLnN0YXRlP3RoaXMuX3RyYWNrTW92ZShiKToiZW5kIj09PWIuc3RhdGUmJnRoaXMuX3RyYWNrRW5kKGIpfSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3dpZHRoPXRoaXMuJC50b2dnbGVCYXIub2Zmc2V0V2lkdGgvCjI7dGhpcy5fdHJhY2tDaGVja2VkPXRoaXMuY2hlY2tlZDt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIil9LF90cmFja01vdmU6ZnVuY3Rpb24oYil7Yj1iLmR4O3RoaXMuX3g9TWF0aC5taW4odGhpcy5fd2lkdGgsTWF0aC5tYXgoMCx0aGlzLl90cmFja0NoZWNrZWQ/dGhpcy5fd2lkdGgrYjpiKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl94KyJweCIsMCwwLHRoaXMuJC50b2dnbGVCdXR0b24pO3RoaXMuX3VzZXJBY3RpdmF0ZSh0aGlzLl94PnRoaXMuX3dpZHRoLzIpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7dGhpcy50cmFuc2Zvcm0oIiIsdGhpcy4kLnRvZ2dsZUJ1dHRvbil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnRvZ2dsZUJ1dHRvbjt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpOwpiLmlkPSJpbmsiO2Iuc2V0QXR0cmlidXRlKCJyZWNlbnRlcnMiLCIiKTtiLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIsInRvZ2dsZS1pbmsiKTtyZXR1cm4gYn19KTsKCihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5ncmFwaGxpYj1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApOwp2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbGliPXJlcXVpcmUoIi4vbGliIik7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOmxpYi5HcmFwaCxqc29uOnJlcXVpcmUoIi4vbGliL2pzb24iKSxhbGc6cmVxdWlyZSgiLi9saWIvYWxnIiksdmVyc2lvbjpsaWIudmVyc2lvbn19LHsiLi9saWIiOjE3LCIuL2xpYi9hbGciOjgsIi4vbGliL2pzb24iOjE4fV0sCjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNvbXBvbmVudHM7ZnVuY3Rpb24gY29tcG9uZW50cyhnKXt2YXIgdmlzaXRlZD17fSxjbXB0cz1bXSxjbXB0O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7Y21wdC5wdXNoKHYpO18uZWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKTtfLmVhY2goZy5wcmVkZWNlc3NvcnModiksZGZzKX1fLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2NtcHQ9W107ZGZzKHYpO2lmKGNtcHQubGVuZ3RoKWNtcHRzLnB1c2goY21wdCl9KTtyZXR1cm4gY21wdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kZnM7ZnVuY3Rpb24gZGZzKGcsdnMsb3JkZXIpe2lmKCFfLmlzQXJyYXkodnMpKXZzPQpbdnNdO3ZhciBuYXZpZ2F0aW9uPShnLmlzRGlyZWN0ZWQoKT9nLnN1Y2Nlc3NvcnM6Zy5uZWlnaGJvcnMpLmJpbmQoZyk7dmFyIGFjYz1bXSx2aXNpdGVkPXt9O18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZighZy5oYXNOb2RlKHYpKXRocm93IG5ldyBFcnJvcigiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiAiK3YpO2RvRGZzKGcsdixvcmRlcj09PSJwb3N0Iix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO3JldHVybiBhY2N9ZnVuY3Rpb24gZG9EZnMoZyx2LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKXtpZighXy5oYXModmlzaXRlZCx2KSl7dmlzaXRlZFt2XT10cnVlO2lmKCFwb3N0b3JkZXIpYWNjLnB1c2godik7Xy5lYWNoKG5hdmlnYXRpb24odiksZnVuY3Rpb24odyl7ZG9EZnMoZyx3LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO2lmKHBvc3RvcmRlcilhY2MucHVzaCh2KX19fSx7Ii4uL2xvZGFzaCI6MTl9XSw0OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIGRpamtzdHJhPXJlcXVpcmUoIi4vZGlqa3N0cmEiKSxfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhQWxsO2Z1bmN0aW9uIGRpamtzdHJhQWxsKGcsd2VpZ2h0RnVuYyxlZGdlRnVuYyl7cmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSxmdW5jdGlvbihhY2Msdil7YWNjW3ZdPWRpamtzdHJhKGcsdix3ZWlnaHRGdW5jLGVkZ2VGdW5jKX0se30pfX0seyIuLi9sb2Rhc2giOjE5LCIuL2RpamtzdHJhIjo1fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmE7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBkaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5EaWprc3RyYShnLApTdHJpbmcoc291cmNlKSx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2LHZFbnRyeTt2YXIgdXBkYXRlTmVpZ2hib3JzPWZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2UudiE9PXY/ZWRnZS52OmVkZ2Uudyx3RW50cnk9cmVzdWx0c1t3XSx3ZWlnaHQ9d2VpZ2h0Rm4oZWRnZSksZGlzdGFuY2U9dkVudHJ5LmRpc3RhbmNlK3dlaWdodDtpZih3ZWlnaHQ8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gIisiQmFkIGVkZ2U6ICIrZWRnZSsiIFdlaWdodDogIit3ZWlnaHQpO2lmKGRpc3RhbmNlPHdFbnRyeS5kaXN0YW5jZSl7d0VudHJ5LmRpc3RhbmNlPWRpc3RhbmNlO3dFbnRyeS5wcmVkZWNlc3Nvcj0KdjtwcS5kZWNyZWFzZSh3LGRpc3RhbmNlKX19O2cubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3ZhciBkaXN0YW5jZT12PT09c291cmNlPzA6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3Jlc3VsdHNbdl09e2Rpc3RhbmNlOmRpc3RhbmNlfTtwcS5hZGQodixkaXN0YW5jZSl9KTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTt2RW50cnk9cmVzdWx0c1t2XTtpZih2RW50cnkuZGlzdGFuY2U9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpYnJlYWs7ZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0c319LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsIi4uL2xvZGFzaCI6MTl9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx0YXJqYW49cmVxdWlyZSgiLi90YXJqYW4iKTttb2R1bGUuZXhwb3J0cz1maW5kQ3ljbGVzO2Z1bmN0aW9uIGZpbmRDeWNsZXMoZyl7cmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwKZnVuY3Rpb24oY21wdCl7cmV0dXJuIGNtcHQubGVuZ3RoPjF8fGNtcHQubGVuZ3RoPT09MSYmZy5oYXNFZGdlKGNtcHRbMF0sY21wdFswXSl9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi90YXJqYW4iOjEzfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZmxveWRXYXJzaGFsbDt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LG5vZGVzPWcubm9kZXMoKTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Jlc3VsdHNbdl09Cnt9O3Jlc3VsdHNbdl1bdl09e2Rpc3RhbmNlOjB9O25vZGVzLmZvckVhY2goZnVuY3Rpb24odyl7aWYodiE9PXcpcmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX0pO2VkZ2VGbih2KS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2UudixkPXdlaWdodEZuKGVkZ2UpO3Jlc3VsdHNbdl1bd109e2Rpc3RhbmNlOmQscHJlZGVjZXNzb3I6dn19KX0pO25vZGVzLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHJvd0s9cmVzdWx0c1trXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByb3dJPXJlc3VsdHNbaV07bm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKXt2YXIgaWs9cm93SVtrXTt2YXIga2o9cm93S1tqXTt2YXIgaWo9cm93SVtqXTt2YXIgYWx0RGlzdGFuY2U9aWsuZGlzdGFuY2Ura2ouZGlzdGFuY2U7aWYoYWx0RGlzdGFuY2U8aWouZGlzdGFuY2Upe2lqLmRpc3RhbmNlPWFsdERpc3RhbmNlO2lqLnByZWRlY2Vzc29yPQprai5wcmVkZWNlc3Nvcn19KX0pfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Y29tcG9uZW50czpyZXF1aXJlKCIuL2NvbXBvbmVudHMiKSxkaWprc3RyYTpyZXF1aXJlKCIuL2RpamtzdHJhIiksZGlqa3N0cmFBbGw6cmVxdWlyZSgiLi9kaWprc3RyYS1hbGwiKSxmaW5kQ3ljbGVzOnJlcXVpcmUoIi4vZmluZC1jeWNsZXMiKSxmbG95ZFdhcnNoYWxsOnJlcXVpcmUoIi4vZmxveWQtd2Fyc2hhbGwiKSxpc0FjeWNsaWM6cmVxdWlyZSgiLi9pcy1hY3ljbGljIikscG9zdG9yZGVyOnJlcXVpcmUoIi4vcG9zdG9yZGVyIikscHJlb3JkZXI6cmVxdWlyZSgiLi9wcmVvcmRlciIpLHByaW06cmVxdWlyZSgiLi9wcmltIiksdGFyamFuOnJlcXVpcmUoIi4vdGFyamFuIiksdG9wc29ydDpyZXF1aXJlKCIuL3RvcHNvcnQiKX19LHsiLi9jb21wb25lbnRzIjoyLCIuL2RpamtzdHJhIjo1LAoiLi9kaWprc3RyYS1hbGwiOjQsIi4vZmluZC1jeWNsZXMiOjYsIi4vZmxveWQtd2Fyc2hhbGwiOjcsIi4vaXMtYWN5Y2xpYyI6OSwiLi9wb3N0b3JkZXIiOjEwLCIuL3ByZW9yZGVyIjoxMSwiLi9wcmltIjoxMiwiLi90YXJqYW4iOjEzLCIuL3RvcHNvcnQiOjE0fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHRvcHNvcnQ9cmVxdWlyZSgiLi90b3Bzb3J0Iik7bW9kdWxlLmV4cG9ydHM9aXNBY3ljbGljO2Z1bmN0aW9uIGlzQWN5Y2xpYyhnKXt0cnl7dG9wc29ydChnKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbilyZXR1cm4gZmFsc2U7dGhyb3cgZTt9cmV0dXJuIHRydWV9fSx7Ii4vdG9wc29ydCI6MTR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXBvc3RvcmRlcjtmdW5jdGlvbiBwb3N0b3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLAp2cywicG9zdCIpfX0seyIuL2RmcyI6M31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cHJlb3JkZXI7ZnVuY3Rpb24gcHJlb3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLHZzLCJwcmUiKX19LHsiLi9kZnMiOjN9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGgiKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1wcmltO2Z1bmN0aW9uIHByaW0oZyx3ZWlnaHRGdW5jKXt2YXIgcmVzdWx0PW5ldyBHcmFwaCxwYXJlbnRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHY7ZnVuY3Rpb24gdXBkYXRlTmVpZ2hib3JzKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2Uudixwcmk9cHEucHJpb3JpdHkodyk7aWYocHJpIT09CnVuZGVmaW5lZCl7dmFyIGVkZ2VXZWlnaHQ9d2VpZ2h0RnVuYyhlZGdlKTtpZihlZGdlV2VpZ2h0PHByaSl7cGFyZW50c1t3XT12O3BxLmRlY3JlYXNlKHcsZWRnZVdlaWdodCl9fX1pZihnLm5vZGVDb3VudCgpPT09MClyZXR1cm4gcmVzdWx0O18uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cHEuYWRkKHYsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtyZXN1bHQuc2V0Tm9kZSh2KX0pO3BxLmRlY3JlYXNlKGcubm9kZXMoKVswXSwwKTt2YXIgaW5pdD1mYWxzZTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTtpZihfLmhhcyhwYXJlbnRzLHYpKXJlc3VsdC5zZXRFZGdlKHYscGFyZW50c1t2XSk7ZWxzZSBpZihpbml0KXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIitnKTtlbHNlIGluaXQ9dHJ1ZTtnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdH19LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsCiIuLi9ncmFwaCI6MTYsIi4uL2xvZGFzaCI6MTl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dGFyamFuO2Z1bmN0aW9uIHRhcmphbihnKXt2YXIgaW5kZXg9MCxzdGFjaz1bXSx2aXNpdGVkPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gZGZzKHYpe3ZhciBlbnRyeT12aXNpdGVkW3ZdPXtvblN0YWNrOnRydWUsbG93bGluazppbmRleCxpbmRleDppbmRleCsrfTtzdGFjay5wdXNoKHYpO2cuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKXtkZnModyk7ZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10ubG93bGluayl9ZWxzZSBpZih2aXNpdGVkW3ddLm9uU3RhY2spZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10uaW5kZXgpfSk7aWYoZW50cnkubG93bGluaz09PWVudHJ5LmluZGV4KXt2YXIgY21wdD0KW10sdztkb3t3PXN0YWNrLnBvcCgpO3Zpc2l0ZWRbd10ub25TdGFjaz1mYWxzZTtjbXB0LnB1c2godyl9d2hpbGUodiE9PXcpO3Jlc3VsdHMucHVzaChjbXB0KX19Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7aWYoIV8uaGFzKHZpc2l0ZWQsdikpZGZzKHYpfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dG9wc29ydDt0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uPUN5Y2xlRXhjZXB0aW9uO2Z1bmN0aW9uIHRvcHNvcnQoZyl7dmFyIHZpc2l0ZWQ9e30sc3RhY2s9e30scmVzdWx0cz1bXTtmdW5jdGlvbiB2aXNpdChub2RlKXtpZihfLmhhcyhzdGFjayxub2RlKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247aWYoIV8uaGFzKHZpc2l0ZWQsbm9kZSkpe3N0YWNrW25vZGVdPXRydWU7dmlzaXRlZFtub2RlXT10cnVlO18uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwKdmlzaXQpO2RlbGV0ZSBzdGFja1tub2RlXTtyZXN1bHRzLnB1c2gobm9kZSl9fV8uZWFjaChnLnNpbmtzKCksdmlzaXQpO2lmKF8uc2l6ZSh2aXNpdGVkKSE9PWcubm9kZUNvdW50KCkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCl7fX0seyIuLi9sb2Rhc2giOjE5fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPVByaW9yaXR5UXVldWU7ZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpe3RoaXMuX2Fycj1bXTt0aGlzLl9rZXlJbmRpY2VzPXt9fVByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLmxlbmd0aH07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB4LmtleX0pfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXM9CmZ1bmN0aW9uKGtleSl7cmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsa2V5KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24oa2V5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKGluZGV4IT09dW5kZWZpbmVkKXJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZih0aGlzLnNpemUoKT09PTApdGhyb3cgbmV3IEVycm9yKCJRdWV1ZSB1bmRlcmZsb3ciKTtyZXR1cm4gdGhpcy5fYXJyWzBdLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlcztrZXk9U3RyaW5nKGtleSk7aWYoIV8uaGFzKGtleUluZGljZXMsa2V5KSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGluZGV4PWFyci5sZW5ndGg7a2V5SW5kaWNlc1trZXldPWluZGV4O2Fyci5wdXNoKHtrZXk6a2V5LApwcmlvcml0eTpwcmlvcml0eX0pO3RoaXMuX2RlY3JlYXNlKGluZGV4KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciBtaW49dGhpcy5fYXJyLnBvcCgpO2RlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO3RoaXMuX2hlYXBpZnkoMCk7cmV0dXJuIG1pbi5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihwcmlvcml0eT50aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiAiKyJLZXk6ICIra2V5KyIgT2xkOiAiK3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHkrIiBOZXc6ICIrcHJpb3JpdHkpO3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHk9CnByaW9yaXR5O3RoaXMuX2RlY3JlYXNlKGluZGV4KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24oaSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGw9MippLHI9bCsxLGxhcmdlc3Q9aTtpZihsPGFyci5sZW5ndGgpe2xhcmdlc3Q9YXJyW2xdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9sOmxhcmdlc3Q7aWYocjxhcnIubGVuZ3RoKWxhcmdlc3Q9YXJyW3JdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9yOmxhcmdlc3Q7aWYobGFyZ2VzdCE9PWkpe3RoaXMuX3N3YXAoaSxsYXJnZXN0KTt0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpfX19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZT1mdW5jdGlvbihpbmRleCl7dmFyIGFycj10aGlzLl9hcnI7dmFyIHByaW9yaXR5PWFycltpbmRleF0ucHJpb3JpdHk7dmFyIHBhcmVudDt3aGlsZShpbmRleCE9PTApe3BhcmVudD1pbmRleD4+MTtpZihhcnJbcGFyZW50XS5wcmlvcml0eTxwcmlvcml0eSlicmVhazsKdGhpcy5fc3dhcChpbmRleCxwYXJlbnQpO2luZGV4PXBhcmVudH19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKGksail7dmFyIGFycj10aGlzLl9hcnI7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlczt2YXIgb3JpZ0Fyckk9YXJyW2ldO3ZhciBvcmlnQXJySj1hcnJbal07YXJyW2ldPW9yaWdBcnJKO2FycltqXT1vcmlnQXJySTtrZXlJbmRpY2VzW29yaWdBcnJKLmtleV09aTtrZXlJbmRpY2VzW29yaWdBcnJJLmtleV09an19LHsiLi4vbG9kYXNoIjoxOX1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPUdyYXBoO3ZhciBERUZBVUxUX0VER0VfTkFNRT0iXHgwMCIsR1JBUEhfTk9ERT0iXHgwMCIsRURHRV9LRVlfREVMSU09Ilx1MDAwMSI7ZnVuY3Rpb24gR3JhcGgob3B0cyl7dGhpcy5faXNEaXJlY3RlZD1fLmhhcyhvcHRzLCJkaXJlY3RlZCIpP29wdHMuZGlyZWN0ZWQ6CnRydWU7dGhpcy5faXNNdWx0aWdyYXBoPV8uaGFzKG9wdHMsIm11bHRpZ3JhcGgiKT9vcHRzLm11bHRpZ3JhcGg6ZmFsc2U7dGhpcy5faXNDb21wb3VuZD1fLmhhcyhvcHRzLCJjb21wb3VuZCIpP29wdHMuY29tcG91bmQ6ZmFsc2U7dGhpcy5fbGFiZWw9dW5kZWZpbmVkO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9ub2Rlcz17fTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnQ9e307dGhpcy5fY2hpbGRyZW49e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV09e319dGhpcy5faW49e307dGhpcy5fcHJlZHM9e307dGhpcy5fb3V0PXt9O3RoaXMuX3N1Y3M9e307dGhpcy5fZWRnZU9ianM9e307dGhpcy5fZWRnZUxhYmVscz17fX1HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9O0dyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBofTtHcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvbXBvdW5kfTtHcmFwaC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24obGFiZWwpe3RoaXMuX2xhYmVsPWxhYmVsO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH07CkdyYXBoLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3JldHVybiBfLmtleXModGhpcy5fbm9kZXMpfTtHcmFwaC5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2lua3M9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIGFyZ3M9YXJndW1lbnRzO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXROb2RlKHYsdmFsdWUpO2Vsc2Ugc2VsZi5zZXROb2RlKHYpfSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXROb2RlPQpmdW5jdGlvbih2LHZhbHVlKXtpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXRoaXMuX25vZGVzW3ZdPXZhbHVlO3JldHVybiB0aGlzfXRoaXMuX25vZGVzW3ZdPWFyZ3VtZW50cy5sZW5ndGg+MT92YWx1ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50W3ZdPUdSQVBIX05PREU7dGhpcy5fY2hpbGRyZW5bdl09e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl09dHJ1ZX10aGlzLl9pblt2XT17fTt0aGlzLl9wcmVkc1t2XT17fTt0aGlzLl9vdXRbdl09e307dGhpcy5fc3Vjc1t2XT17fTsrK3RoaXMuX25vZGVDb3VudDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuX25vZGVzW3ZdfTtHcmFwaC5wcm90b3R5cGUuaGFzTm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsdil9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlPQpmdW5jdGlvbih2KXt2YXIgc2VsZj10aGlzO2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXt2YXIgcmVtb3ZlRWRnZT1mdW5jdGlvbihlKXtzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdl07aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7ZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtfLmVhY2godGhpcy5jaGlsZHJlbih2KSxmdW5jdGlvbihjaGlsZCl7c2VsZi5zZXRQYXJlbnQoY2hpbGQpfSk7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdfV8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9pblt2XTtkZWxldGUgdGhpcy5fcHJlZHNbdl07Xy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9vdXRbdl07ZGVsZXRlIHRoaXMuX3N1Y3Nbdl07LS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQ9CmZ1bmN0aW9uKHYscGFyZW50KXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoIik7aWYoXy5pc1VuZGVmaW5lZChwYXJlbnQpKXBhcmVudD1HUkFQSF9OT0RFO2Vsc2V7cGFyZW50Kz0iIjtmb3IodmFyIGFuY2VzdG9yPXBhcmVudDshXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7YW5jZXN0b3I9dGhpcy5wYXJlbnQoYW5jZXN0b3IpKWlmKGFuY2VzdG9yPT09dil0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgIitwYXJlbnQrIiBhcyBwYXJlbnQgb2YgIit2KyIgd291bGQgY3JlYXRlIGEgY3ljbGUiKTt0aGlzLnNldE5vZGUocGFyZW50KX10aGlzLnNldE5vZGUodik7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7dGhpcy5fcGFyZW50W3ZdPXBhcmVudDt0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdPXRydWU7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Q9CmZ1bmN0aW9uKHYpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdfTtHcmFwaC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHYpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBwYXJlbnQ9dGhpcy5fcGFyZW50W3ZdO2lmKHBhcmVudCE9PUdSQVBIX05PREUpcmV0dXJuIHBhcmVudH19O0dyYXBoLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih2KXtpZihfLmlzVW5kZWZpbmVkKHYpKXY9R1JBUEhfTk9ERTtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgY2hpbGRyZW49dGhpcy5fY2hpbGRyZW5bdl07aWYoY2hpbGRyZW4pcmV0dXJuIF8ua2V5cyhjaGlsZHJlbil9ZWxzZSBpZih2PT09R1JBUEhfTk9ERSlyZXR1cm4gdGhpcy5ub2RlcygpO2Vsc2UgaWYodGhpcy5oYXNOb2RlKHYpKXJldHVybltdfTtHcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkc1Y9dGhpcy5fcHJlZHNbdl07aWYocHJlZHNWKXJldHVybiBfLmtleXMocHJlZHNWKX07CkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBzdWNzVj10aGlzLl9zdWNzW3ZdO2lmKHN1Y3NWKXJldHVybiBfLmtleXMoc3Vjc1YpfTtHcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkcz10aGlzLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkcylyZXR1cm4gXy51bmlvbihwcmVkcyx0aGlzLnN1Y2Nlc3NvcnModikpfTtHcmFwaC5wcm90b3R5cGUuaXNMZWFmPWZ1bmN0aW9uKHYpe3ZhciBuZWlnaGJvcnM7aWYodGhpcy5pc0RpcmVjdGVkKCkpbmVpZ2hib3JzPXRoaXMuc3VjY2Vzc29ycyh2KTtlbHNlIG5laWdoYm9ycz10aGlzLm5laWdoYm9ycyh2KTtyZXR1cm4gbmVpZ2hib3JzLmxlbmd0aD09PTB9O0dyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2Rlcz1mdW5jdGlvbihmaWx0ZXIpe3ZhciBjb3B5PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtkaXJlY3RlZDp0aGlzLl9pc0RpcmVjdGVkLG11bHRpZ3JhcGg6dGhpcy5faXNNdWx0aWdyYXBoLApjb21wb3VuZDp0aGlzLl9pc0NvbXBvdW5kfSk7Y29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHZhbHVlLHYpe2lmKGZpbHRlcih2KSljb3B5LnNldE5vZGUodix2YWx1ZSl9KTtfLmVhY2godGhpcy5fZWRnZU9ianMsZnVuY3Rpb24oZSl7aWYoY29weS5oYXNOb2RlKGUudikmJmNvcHkuaGFzTm9kZShlLncpKWNvcHkuc2V0RWRnZShlLHNlbGYuZWRnZShlKSl9KTt2YXIgcGFyZW50cz17fTtmdW5jdGlvbiBmaW5kUGFyZW50KHYpe3ZhciBwYXJlbnQ9c2VsZi5wYXJlbnQodik7aWYocGFyZW50PT09dW5kZWZpbmVkfHxjb3B5Lmhhc05vZGUocGFyZW50KSl7cGFyZW50c1t2XT1wYXJlbnQ7cmV0dXJuIHBhcmVudH1lbHNlIGlmKHBhcmVudCBpbiBwYXJlbnRzKXJldHVybiBwYXJlbnRzW3BhcmVudF07ZWxzZSByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpfWlmKHRoaXMuX2lzQ29tcG91bmQpXy5lYWNoKGNvcHkubm9kZXMoKSwKZnVuY3Rpb24odil7Y29weS5zZXRQYXJlbnQodixmaW5kUGFyZW50KHYpKX0pO3JldHVybiBjb3B5fTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlQ291bnR9O0dyYXBoLnByb3RvdHlwZS5lZGdlcz1mdW5jdGlvbigpe3JldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyl9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXRoPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgc2VsZj10aGlzLGFyZ3M9YXJndW1lbnRzO18ucmVkdWNlKHZzLGZ1bmN0aW9uKHYsdyl7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldEVkZ2Uodix3LHZhbHVlKTtlbHNlIHNlbGYuc2V0RWRnZSh2LAp3KTtyZXR1cm4gd30pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB2LHcsbmFtZSx2YWx1ZSx2YWx1ZVNwZWNpZmllZD1mYWxzZSxhcmcwPWFyZ3VtZW50c1swXTtpZih0eXBlb2YgYXJnMD09PSJvYmplY3QiJiZhcmcwIT09bnVsbCYmInYiaW4gYXJnMCl7dj1hcmcwLnY7dz1hcmcwLnc7bmFtZT1hcmcwLm5hbWU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpe3ZhbHVlPWFyZ3VtZW50c1sxXTt2YWx1ZVNwZWNpZmllZD10cnVlfX1lbHNle3Y9YXJnMDt3PWFyZ3VtZW50c1sxXTtuYW1lPWFyZ3VtZW50c1szXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpe3ZhbHVlPWFyZ3VtZW50c1syXTt2YWx1ZVNwZWNpZmllZD10cnVlfX12PSIiK3Y7dz0iIit3O2lmKCFfLmlzVW5kZWZpbmVkKG5hbWUpKW5hbWU9IiIrbmFtZTt2YXIgZT1lZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7aWYoXy5oYXModGhpcy5fZWRnZUxhYmVscywKZSkpe2lmKHZhbHVlU3BlY2lmaWVkKXRoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWU7cmV0dXJuIHRoaXN9aWYoIV8uaXNVbmRlZmluZWQobmFtZSkmJiF0aGlzLl9pc011bHRpZ3JhcGgpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCBceDNkIGZhbHNlIik7dGhpcy5zZXROb2RlKHYpO3RoaXMuc2V0Tm9kZSh3KTt0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlU3BlY2lmaWVkP3ZhbHVlOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LHcsbmFtZSk7dmFyIGVkZ2VPYmo9ZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTt2PWVkZ2VPYmoudjt3PWVkZ2VPYmoudztPYmplY3QuZnJlZXplKGVkZ2VPYmopO3RoaXMuX2VkZ2VPYmpzW2VdPWVkZ2VPYmo7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sdik7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSx3KTt0aGlzLl9pblt3XVtlXT0KZWRnZU9iajt0aGlzLl9vdXRbdl1bZV09ZWRnZU9iajt0aGlzLl9lZGdlQ291bnQrKztyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV19O0dyYXBoLnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLGUpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/CmVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSksZWRnZT10aGlzLl9lZGdlT2Jqc1tlXTtpZihlZGdlKXt2PWVkZ2Uudjt3PWVkZ2UudztkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7ZGVsZXRlIHRoaXMuX2luW3ddW2VdO2RlbGV0ZSB0aGlzLl9vdXRbdl1bZV07dGhpcy5fZWRnZUNvdW50LS19cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5pbkVkZ2VzPWZ1bmN0aW9uKHYsdSl7dmFyIGluVj10aGlzLl9pblt2XTtpZihpblYpe3ZhciBlZGdlcz1fLnZhbHVlcyhpblYpO2lmKCF1KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudj09PQp1fSl9fTtHcmFwaC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgb3V0Vj10aGlzLl9vdXRbdl07aWYob3V0Vil7dmFyIGVkZ2VzPV8udmFsdWVzKG91dFYpO2lmKCF3KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudz09PXd9KX19O0dyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgaW5FZGdlcz10aGlzLmluRWRnZXModix3KTtpZihpbkVkZ2VzKXJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsdykpfTtmdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsayl7aWYobWFwW2tdKW1hcFtrXSsrO2Vsc2UgbWFwW2tdPTF9ZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsayl7aWYoIS0tbWFwW2tdKWRlbGV0ZSBtYXBba119ZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9CiIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIHYrRURHRV9LRVlfREVMSU0rdytFREdFX0tFWV9ERUxJTSsoXy5pc1VuZGVmaW5lZChuYW1lKT9ERUZBVUxUX0VER0VfTkFNRTpuYW1lKX1mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9IiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgZWRnZU9iaj17djp2LHc6d307aWYobmFtZSllZGdlT2JqLm5hbWU9bmFtZTtyZXR1cm4gZWRnZU9ian1mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmope3JldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCxlZGdlT2JqLnYsZWRnZU9iai53LGVkZ2VPYmoubmFtZSl9fSx7Ii4vbG9kYXNoIjoxOX1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17R3JhcGg6cmVxdWlyZSgiLi9ncmFwaCIpLAp2ZXJzaW9uOnJlcXVpcmUoIi4vdmVyc2lvbiIpfX0seyIuL2dyYXBoIjoxNiwiLi92ZXJzaW9uIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGgiKTttb2R1bGUuZXhwb3J0cz17d3JpdGU6d3JpdGUscmVhZDpyZWFkfTtmdW5jdGlvbiB3cml0ZShnKXt2YXIganNvbj17b3B0aW9uczp7ZGlyZWN0ZWQ6Zy5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOmcuaXNDb21wb3VuZCgpfSxub2Rlczp3cml0ZU5vZGVzKGcpLGVkZ2VzOndyaXRlRWRnZXMoZyl9O2lmKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpanNvbi52YWx1ZT1fLmNsb25lKGcuZ3JhcGgoKSk7cmV0dXJuIGpzb259ZnVuY3Rpb24gd3JpdGVOb2RlcyhnKXtyZXR1cm4gXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlVmFsdWU9Zy5ub2RlKHYpLHBhcmVudD0KZy5wYXJlbnQodiksbm9kZT17djp2fTtpZighXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKW5vZGUudmFsdWU9bm9kZVZhbHVlO2lmKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpbm9kZS5wYXJlbnQ9cGFyZW50O3JldHVybiBub2RlfSl9ZnVuY3Rpb24gd3JpdGVFZGdlcyhnKXtyZXR1cm4gXy5tYXAoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVmFsdWU9Zy5lZGdlKGUpLGVkZ2U9e3Y6ZS52LHc6ZS53fTtpZighXy5pc1VuZGVmaW5lZChlLm5hbWUpKWVkZ2UubmFtZT1lLm5hbWU7aWYoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSllZGdlLnZhbHVlPWVkZ2VWYWx1ZTtyZXR1cm4gZWRnZX0pfWZ1bmN0aW9uIHJlYWQoanNvbil7dmFyIGc9KG5ldyBHcmFwaChqc29uLm9wdGlvbnMpKS5zZXRHcmFwaChqc29uLnZhbHVlKTtfLmVhY2goanNvbi5ub2RlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXROb2RlKGVudHJ5LnYsZW50cnkudmFsdWUpO2lmKGVudHJ5LnBhcmVudClnLnNldFBhcmVudChlbnRyeS52LAplbnRyeS5wYXJlbnQpfSk7Xy5lYWNoKGpzb24uZWRnZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0RWRnZSh7djplbnRyeS52LHc6ZW50cnkudyxuYW1lOmVudHJ5Lm5hbWV9LGVudHJ5LnZhbHVlKX0pO3JldHVybiBnfX0seyIuL2dyYXBoIjoxNiwiLi9sb2Rhc2giOjE5fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPXdpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMi4xLjUifSx7fV19LHt9LFsxXSkoMSl9KTsKKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCImJnR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIiltb2R1bGUuZXhwb3J0cz1mKCk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZClkZWZpbmUoW10sZik7ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpZz13aW5kb3c7ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCIpZz1nbG9iYWw7ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiKWc9c2VsZjtlbHNlIGc9dGhpcztnLmRhZ3JlPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9Cm5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGY7fXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtncmFwaGxpYjpyZXF1aXJlKCIuL2xpYi9ncmFwaGxpYiIpLGxheW91dDpyZXF1aXJlKCIuL2xpYi9sYXlvdXQiKSxkZWJ1ZzpyZXF1aXJlKCIuL2xpYi9kZWJ1ZyIpLHV0aWw6e3RpbWU6cmVxdWlyZSgiLi9saWIvdXRpbCIpLnRpbWUsbm90aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS5ub3RpbWV9LAp2ZXJzaW9uOnJlcXVpcmUoIi4vbGliL3ZlcnNpb24iKX19LHsiLi9saWIvZGVidWciOjYsIi4vbGliL2dyYXBobGliIjo3LCIuL2xpYi9sYXlvdXQiOjksIi4vbGliL3V0aWwiOjI5LCIuL2xpYi92ZXJzaW9uIjozMH1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksZ3JlZWR5RkFTPXJlcXVpcmUoIi4vZ3JlZWR5LWZhcyIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe3ZhciBmYXM9Zy5ncmFwaCgpLmFjeWNsaWNlcj09PSJncmVlZHkiP2dyZWVkeUZBUyhnLHdlaWdodEZuKGcpKTpkZnNGQVMoZyk7Xy5mb3JFYWNoKGZhcyxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2cucmVtb3ZlRWRnZShlKTtsYWJlbC5mb3J3YXJkTmFtZT1lLm5hbWU7bGFiZWwucmV2ZXJzZWQ9dHJ1ZTtnLnNldEVkZ2UoZS53LGUudixsYWJlbCxfLnVuaXF1ZUlkKCJyZXYiKSl9KTtmdW5jdGlvbiB3ZWlnaHRGbihnKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGcuZWRnZShlKS53ZWlnaHR9fQp9ZnVuY3Rpb24gZGZzRkFTKGcpe3ZhciBmYXM9W10sc3RhY2s9e30sdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3N0YWNrW3ZdPXRydWU7Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7aWYoXy5oYXMoc3RhY2ssZS53KSlmYXMucHVzaChlKTtlbHNlIGRmcyhlLncpfSk7ZGVsZXRlIHN0YWNrW3ZdfV8uZm9yRWFjaChnLm5vZGVzKCksZGZzKTtyZXR1cm4gZmFzfWZ1bmN0aW9uIHVuZG8oZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2lmKGxhYmVsLnJldmVyc2VkKXtnLnJlbW92ZUVkZ2UoZSk7dmFyIGZvcndhcmROYW1lPWxhYmVsLmZvcndhcmROYW1lO2RlbGV0ZSBsYWJlbC5yZXZlcnNlZDtkZWxldGUgbGFiZWwuZm9yd2FyZE5hbWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsZm9yd2FyZE5hbWUpfX0pfX0seyIuL2dyZWVkeS1mYXMiOjgsCiIuL2xvZGFzaCI6MTB9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9YWRkQm9yZGVyU2VnbWVudHM7ZnVuY3Rpb24gYWRkQm9yZGVyU2VnbWVudHMoZyl7ZnVuY3Rpb24gZGZzKHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpLG5vZGU9Zy5ub2RlKHYpO2lmKGNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZGZzKTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpe25vZGUuYm9yZGVyTGVmdD1bXTtub2RlLmJvcmRlclJpZ2h0PVtdO2Zvcih2YXIgcmFuaz1ub2RlLm1pblJhbmssbWF4UmFuaz1ub2RlLm1heFJhbmsrMTtyYW5rPG1heFJhbms7KytyYW5rKXthZGRCb3JkZXJOb2RlKGcsImJvcmRlckxlZnQiLCJfYmwiLHYsbm9kZSxyYW5rKTthZGRCb3JkZXJOb2RlKGcsImJvcmRlclJpZ2h0IiwiX2JyIix2LG5vZGUscmFuayl9fX1fLmZvckVhY2goZy5jaGlsZHJlbigpLApkZnMpfWZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZyxwcm9wLHByZWZpeCxzZyxzZ05vZGUscmFuayl7dmFyIGxhYmVsPXt3aWR0aDowLGhlaWdodDowLHJhbms6cmFuayxib3JkZXJUeXBlOnByb3B9LHByZXY9c2dOb2RlW3Byb3BdW3JhbmstMV0sY3Vycj11dGlsLmFkZER1bW15Tm9kZShnLCJib3JkZXIiLGxhYmVsLHByZWZpeCk7c2dOb2RlW3Byb3BdW3JhbmtdPWN1cnI7Zy5zZXRQYXJlbnQoY3VycixzZyk7aWYocHJldilnLnNldEVkZ2UocHJldixjdXJyLHt3ZWlnaHQ6MX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXthZGp1c3Q6YWRqdXN0LHVuZG86dW5kb307ZnVuY3Rpb24gYWRqdXN0KGcpe3ZhciByYW5rRGlyPWcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXN3YXBXaWR0aEhlaWdodChnKX0KZnVuY3Rpb24gdW5kbyhnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0iYnQifHxyYW5rRGlyPT09InJsIilyZXZlcnNlWShnKTtpZihyYW5rRGlyPT09ImxyInx8cmFua0Rpcj09PSJybCIpe3N3YXBYWShnKTtzd2FwV2lkdGhIZWlnaHQoZyl9fWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodChnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKX0pfWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycyl7dmFyIHc9YXR0cnMud2lkdGg7YXR0cnMud2lkdGg9YXR0cnMuaGVpZ2h0O2F0dHJzLmhlaWdodD13fWZ1bmN0aW9uIHJldmVyc2VZKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV2ZXJzZVlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMscmV2ZXJzZVlPbmUpO2lmKF8uaGFzKGVkZ2UsInkiKSlyZXZlcnNlWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHJldmVyc2VZT25lKGF0dHJzKXthdHRycy55PS1hdHRycy55fWZ1bmN0aW9uIHN3YXBYWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBYWU9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHN3YXBYWU9uZSk7aWYoXy5oYXMoZWRnZSwieCIpKXN3YXBYWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycyl7dmFyIHg9YXR0cnMueDthdHRycy54PWF0dHJzLnk7YXR0cnMueT14fX0seyIuL2xvZGFzaCI6MTB9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1MaXN0O2Z1bmN0aW9uIExpc3QoKXt2YXIgc2VudGluZWw9Cnt9O3NlbnRpbmVsLl9uZXh0PXNlbnRpbmVsLl9wcmV2PXNlbnRpbmVsO3RoaXMuX3NlbnRpbmVsPXNlbnRpbmVsfUxpc3QucHJvdG90eXBlLmRlcXVldWU9ZnVuY3Rpb24oKXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWwsZW50cnk9c2VudGluZWwuX3ByZXY7aWYoZW50cnkhPT1zZW50aW5lbCl7dW5saW5rKGVudHJ5KTtyZXR1cm4gZW50cnl9fTtMaXN0LnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKGVudHJ5KXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWw7aWYoZW50cnkuX3ByZXYmJmVudHJ5Ll9uZXh0KXVubGluayhlbnRyeSk7ZW50cnkuX25leHQ9c2VudGluZWwuX25leHQ7c2VudGluZWwuX25leHQuX3ByZXY9ZW50cnk7c2VudGluZWwuX25leHQ9ZW50cnk7ZW50cnkuX3ByZXY9c2VudGluZWx9O0xpc3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHN0cnM9W10sc2VudGluZWw9dGhpcy5fc2VudGluZWwsY3Vycj1zZW50aW5lbC5fcHJldjt3aGlsZShjdXJyIT09CnNlbnRpbmVsKXtzdHJzLnB1c2goSlNPTi5zdHJpbmdpZnkoY3VycixmaWx0ZXJPdXRMaW5rcykpO2N1cnI9Y3Vyci5fcHJldn1yZXR1cm4iWyIrc3Rycy5qb2luKCIsICIpKyJdIn07ZnVuY3Rpb24gdW5saW5rKGVudHJ5KXtlbnRyeS5fcHJldi5fbmV4dD1lbnRyeS5fbmV4dDtlbnRyeS5fbmV4dC5fcHJldj1lbnRyeS5fcHJldjtkZWxldGUgZW50cnkuX25leHQ7ZGVsZXRlIGVudHJ5Ll9wcmV2fWZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssdil7aWYoayE9PSJfbmV4dCImJmshPT0iX3ByZXYiKXJldHVybiB2fX0se31dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9e2RlYnVnT3JkZXJpbmc6ZGVidWdPcmRlcmluZ307ZnVuY3Rpb24gZGVidWdPcmRlcmluZyhnKXt2YXIgbGF5ZXJNYXRyaXg9CnV0aWwuYnVpbGRMYXllck1hdHJpeChnKTt2YXIgaD0obmV3IEdyYXBoKHtjb21wb3VuZDp0cnVlLG11bHRpZ3JhcGg6dHJ1ZX0pKS5zZXRHcmFwaCh7fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtoLnNldE5vZGUodix7bGFiZWw6dn0pO2guc2V0UGFyZW50KHYsImxheWVyIitnLm5vZGUodikucmFuayl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2guc2V0RWRnZShlLnYsZS53LHt9LGUubmFtZSl9KTtfLmZvckVhY2gobGF5ZXJNYXRyaXgsZnVuY3Rpb24obGF5ZXIsaSl7dmFyIGxheWVyVj0ibGF5ZXIiK2k7aC5zZXROb2RlKGxheWVyVix7cmFuazoic2FtZSJ9KTtfLnJlZHVjZShsYXllcixmdW5jdGlvbih1LHYpe2guc2V0RWRnZSh1LHYse3N0eWxlOiJpbnZpcyJ9KTtyZXR1cm4gdn0pfSk7cmV0dXJuIGh9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBncmFwaGxpYjsKaWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtncmFwaGxpYj1yZXF1aXJlKCJncmFwaGxpYiIpfWNhdGNoKGUpe31pZighZ3JhcGhsaWIpZ3JhcGhsaWI9d2luZG93LmdyYXBobGliO21vZHVsZS5leHBvcnRzPWdyYXBobGlifSx7ImdyYXBobGliIjp1bmRlZmluZWR9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaCxMaXN0PXJlcXVpcmUoIi4vZGF0YS9saXN0Iik7bW9kdWxlLmV4cG9ydHM9Z3JlZWR5RkFTO3ZhciBERUZBVUxUX1dFSUdIVF9GTj1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGdyZWVkeUZBUyhnLHdlaWdodEZuKXtpZihnLm5vZGVDb3VudCgpPD0xKXJldHVybltdO3ZhciBzdGF0ZT1idWlsZFN0YXRlKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZOKTt2YXIgcmVzdWx0cz1kb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCxzdGF0ZS5idWNrZXRzLApzdGF0ZS56ZXJvSWR4KTtyZXR1cm4gXy5mbGF0dGVuKF8ubWFwKHJlc3VsdHMsZnVuY3Rpb24oZSl7cmV0dXJuIGcub3V0RWRnZXMoZS52LGUudyl9KSx0cnVlKX1mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLGJ1Y2tldHMsemVyb0lkeCl7dmFyIHJlc3VsdHM9W10sc291cmNlcz1idWNrZXRzW2J1Y2tldHMubGVuZ3RoLTFdLHNpbmtzPWJ1Y2tldHNbMF07dmFyIGVudHJ5O3doaWxlKGcubm9kZUNvdW50KCkpe3doaWxlKGVudHJ5PXNpbmtzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTt3aGlsZShlbnRyeT1zb3VyY2VzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTtpZihnLm5vZGVDb3VudCgpKWZvcih2YXIgaT1idWNrZXRzLmxlbmd0aC0yO2k+MDstLWkpe2VudHJ5PWJ1Y2tldHNbaV0uZGVxdWV1ZSgpO2lmKGVudHJ5KXtyZXN1bHRzPXJlc3VsdHMuY29uY2F0KHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsCmVudHJ5LHRydWUpKTticmVha319fXJldHVybiByZXN1bHRzfWZ1bmN0aW9uIHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnksY29sbGVjdFByZWRlY2Vzc29ycyl7dmFyIHJlc3VsdHM9Y29sbGVjdFByZWRlY2Vzc29ycz9bXTp1bmRlZmluZWQ7Xy5mb3JFYWNoKGcuaW5FZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx1RW50cnk9Zy5ub2RlKGVkZ2Uudik7aWYoY29sbGVjdFByZWRlY2Vzc29ycylyZXN1bHRzLnB1c2goe3Y6ZWRnZS52LHc6ZWRnZS53fSk7dUVudHJ5Lm91dC09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsdUVudHJ5KX0pO18uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLGZ1bmN0aW9uKGVkZ2Upe3ZhciB3ZWlnaHQ9Zy5lZGdlKGVkZ2UpLHc9ZWRnZS53LHdFbnRyeT1nLm5vZGUodyk7d0VudHJ5WyJpbiJdLT13ZWlnaHQ7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCx3RW50cnkpfSk7CmcucmVtb3ZlTm9kZShlbnRyeS52KTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBidWlsZFN0YXRlKGcsd2VpZ2h0Rm4pe3ZhciBmYXNHcmFwaD1uZXcgR3JhcGgsbWF4SW49MCxtYXhPdXQ9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2Zhc0dyYXBoLnNldE5vZGUodix7djp2LCJpbiI6MCxvdXQ6MH0pfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgcHJldldlaWdodD1mYXNHcmFwaC5lZGdlKGUudixlLncpfHwwLHdlaWdodD13ZWlnaHRGbihlKSxlZGdlV2VpZ2h0PXByZXZXZWlnaHQrd2VpZ2h0O2Zhc0dyYXBoLnNldEVkZ2UoZS52LGUudyxlZGdlV2VpZ2h0KTttYXhPdXQ9TWF0aC5tYXgobWF4T3V0LGZhc0dyYXBoLm5vZGUoZS52KS5vdXQrPXdlaWdodCk7bWF4SW49TWF0aC5tYXgobWF4SW4sZmFzR3JhcGgubm9kZShlLncpWyJpbiJdKz13ZWlnaHQpfSk7dmFyIGJ1Y2tldHM9Xy5yYW5nZShtYXhPdXQrbWF4SW4rMykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMaXN0fSk7CnZhciB6ZXJvSWR4PW1heEluKzE7Xy5mb3JFYWNoKGZhc0dyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxmYXNHcmFwaC5ub2RlKHYpKX0pO3JldHVybntncmFwaDpmYXNHcmFwaCxidWNrZXRzOmJ1Y2tldHMsemVyb0lkeDp6ZXJvSWR4fX1mdW5jdGlvbiBhc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LGVudHJ5KXtpZighZW50cnkub3V0KWJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBpZighZW50cnlbImluIl0pYnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXS5lbnF1ZXVlKGVudHJ5KTtlbHNlIGJ1Y2tldHNbZW50cnkub3V0LWVudHJ5WyJpbiJdK3plcm9JZHhdLmVucXVldWUoZW50cnkpfX0seyIuL2RhdGEvbGlzdCI6NSwiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxhY3ljbGljPXJlcXVpcmUoIi4vYWN5Y2xpYyIpLApub3JtYWxpemU9cmVxdWlyZSgiLi9ub3JtYWxpemUiKSxyYW5rPXJlcXVpcmUoIi4vcmFuayIpLG5vcm1hbGl6ZVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLm5vcm1hbGl6ZVJhbmtzLHBhcmVudER1bW15Q2hhaW5zPXJlcXVpcmUoIi4vcGFyZW50LWR1bW15LWNoYWlucyIpLHJlbW92ZUVtcHR5UmFua3M9cmVxdWlyZSgiLi91dGlsIikucmVtb3ZlRW1wdHlSYW5rcyxuZXN0aW5nR3JhcGg9cmVxdWlyZSgiLi9uZXN0aW5nLWdyYXBoIiksYWRkQm9yZGVyU2VnbWVudHM9cmVxdWlyZSgiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIiksY29vcmRpbmF0ZVN5c3RlbT1yZXF1aXJlKCIuL2Nvb3JkaW5hdGUtc3lzdGVtIiksb3JkZXI9cmVxdWlyZSgiLi9vcmRlciIpLHBvc2l0aW9uPXJlcXVpcmUoIi4vcG9zaXRpb24iKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz1sYXlvdXQ7ZnVuY3Rpb24gbGF5b3V0KGcsb3B0cyl7dmFyIHRpbWU9Cm9wdHMmJm9wdHMuZGVidWdUaW1pbmc/dXRpbC50aW1lOnV0aWwubm90aW1lO3RpbWUoImxheW91dCIsZnVuY3Rpb24oKXt2YXIgbGF5b3V0R3JhcGg9dGltZSgiICBidWlsZExheW91dEdyYXBoIixmdW5jdGlvbigpe3JldHVybiBidWlsZExheW91dEdyYXBoKGcpfSk7dGltZSgiICBydW5MYXlvdXQiLGZ1bmN0aW9uKCl7cnVuTGF5b3V0KGxheW91dEdyYXBoLHRpbWUpfSk7dGltZSgiICB1cGRhdGVJbnB1dEdyYXBoIixmdW5jdGlvbigpe3VwZGF0ZUlucHV0R3JhcGgoZyxsYXlvdXRHcmFwaCl9KX0pfWZ1bmN0aW9uIHJ1bkxheW91dChnLHRpbWUpe3RpbWUoIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzIixmdW5jdGlvbigpe21ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlU2VsZkVkZ2VzIixmdW5jdGlvbigpe3JlbW92ZVNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljIixmdW5jdGlvbigpe2FjeWNsaWMucnVuKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5ydW4iLApmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5ydW4oZyl9KTt0aW1lKCIgICAgcmFuayIsZnVuY3Rpb24oKXtyYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKX0pO3RpbWUoIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe2luamVjdEVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRW1wdHlSYW5rcyIsZnVuY3Rpb24oKXtyZW1vdmVFbXB0eVJhbmtzKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwIixmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5jbGVhbnVwKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZVJhbmtzIixmdW5jdGlvbigpe25vcm1hbGl6ZVJhbmtzKGcpfSk7dGltZSgiICAgIGFzc2lnblJhbmtNaW5NYXgiLGZ1bmN0aW9uKCl7YXNzaWduUmFua01pbk1heChnKX0pO3RpbWUoIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe3JlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnJ1biIsCmZ1bmN0aW9uKCl7bm9ybWFsaXplLnJ1bihnKX0pO3RpbWUoIiAgICBwYXJlbnREdW1teUNoYWlucyIsZnVuY3Rpb24oKXtwYXJlbnREdW1teUNoYWlucyhnKX0pO3RpbWUoIiAgICBhZGRCb3JkZXJTZWdtZW50cyIsZnVuY3Rpb24oKXthZGRCb3JkZXJTZWdtZW50cyhnKX0pO3RpbWUoIiAgICBvcmRlciIsZnVuY3Rpb24oKXtvcmRlcihnKX0pO3RpbWUoIiAgICBpbnNlcnRTZWxmRWRnZXMiLGZ1bmN0aW9uKCl7aW5zZXJ0U2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW0iLGZ1bmN0aW9uKCl7Y29vcmRpbmF0ZVN5c3RlbS5hZGp1c3QoZyl9KTt0aW1lKCIgICAgcG9zaXRpb24iLGZ1bmN0aW9uKCl7cG9zaXRpb24oZyl9KTt0aW1lKCIgICAgcG9zaXRpb25TZWxmRWRnZXMiLGZ1bmN0aW9uKCl7cG9zaXRpb25TZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlQm9yZGVyTm9kZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlQm9yZGVyTm9kZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnVuZG8iLApmdW5jdGlvbigpe25vcm1hbGl6ZS51bmRvKGcpfSk7dGltZSgiICAgIGZpeHVwRWRnZUxhYmVsQ29vcmRzIixmdW5jdGlvbigpe2ZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpfSk7dGltZSgiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKX0pO3RpbWUoIiAgICB0cmFuc2xhdGVHcmFwaCIsZnVuY3Rpb24oKXt0cmFuc2xhdGVHcmFwaChnKX0pO3RpbWUoIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0cyIsZnVuY3Rpb24oKXthc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKX0pO3RpbWUoIiAgICByZXZlcnNlUG9pbnRzIixmdW5jdGlvbigpe3JldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpfSk7dGltZSgiICAgIGFjeWNsaWMudW5kbyIsZnVuY3Rpb24oKXthY3ljbGljLnVuZG8oZyl9KX1mdW5jdGlvbiB1cGRhdGVJbnB1dEdyYXBoKGlucHV0R3JhcGgsbGF5b3V0R3JhcGgpe18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIGlucHV0TGFiZWw9CmlucHV0R3JhcGgubm9kZSh2KSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5ub2RlKHYpO2lmKGlucHV0TGFiZWwpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55O2lmKGxheW91dEdyYXBoLmNoaWxkcmVuKHYpLmxlbmd0aCl7aW5wdXRMYWJlbC53aWR0aD1sYXlvdXRMYWJlbC53aWR0aDtpbnB1dExhYmVsLmhlaWdodD1sYXlvdXRMYWJlbC5oZWlnaHR9fX0pO18uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGlucHV0TGFiZWw9aW5wdXRHcmFwaC5lZGdlKGUpLGxheW91dExhYmVsPWxheW91dEdyYXBoLmVkZ2UoZSk7aW5wdXRMYWJlbC5wb2ludHM9bGF5b3V0TGFiZWwucG9pbnRzO2lmKF8uaGFzKGxheW91dExhYmVsLCJ4Iikpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55fX0pO2lucHV0R3JhcGguZ3JhcGgoKS53aWR0aD1sYXlvdXRHcmFwaC5ncmFwaCgpLndpZHRoOwppbnB1dEdyYXBoLmdyYXBoKCkuaGVpZ2h0PWxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0fXZhciBncmFwaE51bUF0dHJzPVsibm9kZXNlcCIsImVkZ2VzZXAiLCJyYW5rc2VwIiwibWFyZ2lueCIsIm1hcmdpbnkiXSxncmFwaERlZmF1bHRzPXtyYW5rc2VwOjUwLGVkZ2VzZXA6MjAsbm9kZXNlcDo1MCxyYW5rZGlyOiJ0YiJ9LGdyYXBoQXR0cnM9WyJhY3ljbGljZXIiLCJyYW5rZXIiLCJyYW5rZGlyIiwiYWxpZ24iXSxub2RlTnVtQXR0cnM9WyJ3aWR0aCIsImhlaWdodCJdLG5vZGVEZWZhdWx0cz17d2lkdGg6MCxoZWlnaHQ6MH0sZWRnZU51bUF0dHJzPVsibWlubGVuIiwid2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJsYWJlbG9mZnNldCJdLGVkZ2VEZWZhdWx0cz17bWlubGVuOjEsd2VpZ2h0OjEsd2lkdGg6MCxoZWlnaHQ6MCxsYWJlbG9mZnNldDoxMCxsYWJlbHBvczoiciJ9LGVkZ2VBdHRycz1bImxhYmVscG9zIl07ZnVuY3Rpb24gYnVpbGRMYXlvdXRHcmFwaChpbnB1dEdyYXBoKXt2YXIgZz0KbmV3IEdyYXBoKHttdWx0aWdyYXBoOnRydWUsY29tcG91bmQ6dHJ1ZX0pLGdyYXBoPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmdyYXBoKCkpO2cuc2V0R3JhcGgoXy5tZXJnZSh7fSxncmFwaERlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGdyYXBoLGdyYXBoTnVtQXR0cnMpLF8ucGljayhncmFwaCxncmFwaEF0dHJzKSkpO18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Y2Fub25pY2FsaXplKGlucHV0R3JhcGgubm9kZSh2KSk7Zy5zZXROb2RlKHYsXy5kZWZhdWx0cyhzZWxlY3ROdW1iZXJBdHRycyhub2RlLG5vZGVOdW1BdHRycyksbm9kZURlZmF1bHRzKSk7Zy5zZXRQYXJlbnQodixpbnB1dEdyYXBoLnBhcmVudCh2KSl9KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmVkZ2UoZSkpO2cuc2V0RWRnZShlLF8ubWVyZ2Uoe30sZWRnZURlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGVkZ2UsCmVkZ2VOdW1BdHRycyksXy5waWNrKGVkZ2UsZWRnZUF0dHJzKSkpfSk7cmV0dXJuIGd9ZnVuY3Rpb24gbWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKXt2YXIgZ3JhcGg9Zy5ncmFwaCgpO2dyYXBoLnJhbmtzZXAvPTI7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7ZWRnZS5taW5sZW4qPTI7aWYoZWRnZS5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpIT09ImMiKWlmKGdyYXBoLnJhbmtkaXI9PT0iVEIifHxncmFwaC5yYW5rZGlyPT09IkJUIillZGdlLndpZHRoKz1lZGdlLmxhYmVsb2Zmc2V0O2Vsc2UgZWRnZS5oZWlnaHQrPWVkZ2UubGFiZWxvZmZzZXR9KX1mdW5jdGlvbiBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2Uud2lkdGgmJmVkZ2UuaGVpZ2h0KXt2YXIgdj1nLm5vZGUoZS52KSx3PWcubm9kZShlLncpLGxhYmVsPXtyYW5rOih3LnJhbmstCnYucmFuaykvMit2LnJhbmssZTplfTt1dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlLXByb3h5IixsYWJlbCwiX2VwIil9fSl9ZnVuY3Rpb24gYXNzaWduUmFua01pbk1heChnKXt2YXIgbWF4UmFuaz0wO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuYm9yZGVyVG9wKXtub2RlLm1pblJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKS5yYW5rO25vZGUubWF4UmFuaz1nLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7bWF4UmFuaz1fLm1heChtYXhSYW5rLG5vZGUubWF4UmFuayl9fSk7Zy5ncmFwaCgpLm1heFJhbms9bWF4UmFua31mdW5jdGlvbiByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuZHVtbXk9PT0iZWRnZS1wcm94eSIpe2cuZWRnZShub2RlLmUpLmxhYmVsUmFuaz1ub2RlLnJhbms7Zy5yZW1vdmVOb2RlKHYpfX0pfQpmdW5jdGlvbiB0cmFuc2xhdGVHcmFwaChnKXt2YXIgbWluWD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWF4WD0wLG1pblk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFk9MCxncmFwaExhYmVsPWcuZ3JhcGgoKSxtYXJnaW5YPWdyYXBoTGFiZWwubWFyZ2lueHx8MCxtYXJnaW5ZPWdyYXBoTGFiZWwubWFyZ2lueXx8MDtmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycyl7dmFyIHg9YXR0cnMueCx5PWF0dHJzLnksdz1hdHRycy53aWR0aCxoPWF0dHJzLmhlaWdodDttaW5YPU1hdGgubWluKG1pblgseC13LzIpO21heFg9TWF0aC5tYXgobWF4WCx4K3cvMik7bWluWT1NYXRoLm1pbihtaW5ZLHktaC8yKTttYXhZPU1hdGgubWF4KG1heFkseStoLzIpfV8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7Z2V0RXh0cmVtZXMoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKF8uaGFzKGVkZ2UsIngiKSlnZXRFeHRyZW1lcyhlZGdlKX0pOwptaW5YLT1tYXJnaW5YO21pblktPW1hcmdpblk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS54LT1taW5YO25vZGUueS09bWluWX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxmdW5jdGlvbihwKXtwLngtPW1pblg7cC55LT1taW5ZfSk7aWYoXy5oYXMoZWRnZSwieCIpKWVkZ2UueC09bWluWDtpZihfLmhhcyhlZGdlLCJ5IikpZWRnZS55LT1taW5ZfSk7Z3JhcGhMYWJlbC53aWR0aD1tYXhYLW1pblgrbWFyZ2luWDtncmFwaExhYmVsLmhlaWdodD1tYXhZLW1pblkrbWFyZ2luWX1mdW5jdGlvbiBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKSxub2RlVj1nLm5vZGUoZS52KSxub2RlVz1nLm5vZGUoZS53KSxwMSxwMjtpZighZWRnZS5wb2ludHMpe2VkZ2UucG9pbnRzPQpbXTtwMT1ub2RlVztwMj1ub2RlVn1lbHNle3AxPWVkZ2UucG9pbnRzWzBdO3AyPWVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aC0xXX1lZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVixwMSkpO2VkZ2UucG9pbnRzLnB1c2godXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVXLHAyKSl9KX1mdW5jdGlvbiBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4Iikpe2lmKGVkZ2UubGFiZWxwb3M9PT0ibCJ8fGVkZ2UubGFiZWxwb3M9PT0iciIpZWRnZS53aWR0aC09ZWRnZS5sYWJlbG9mZnNldDtzd2l0Y2goZWRnZS5sYWJlbHBvcyl7Y2FzZSAibCI6ZWRnZS54LT1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVhaztjYXNlICJyIjplZGdlLngrPWVkZ2Uud2lkdGgvMitlZGdlLmxhYmVsb2Zmc2V0O2JyZWFrfX19KX1mdW5jdGlvbiByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS5yZXZlcnNlZCllZGdlLnBvaW50cy5yZXZlcnNlKCl9KX1mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcuY2hpbGRyZW4odikubGVuZ3RoKXt2YXIgbm9kZT1nLm5vZGUodiksdD1nLm5vZGUobm9kZS5ib3JkZXJUb3ApLGI9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKSxsPWcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJMZWZ0KSkscj1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtub2RlLndpZHRoPU1hdGguYWJzKHIueC1sLngpO25vZGUuaGVpZ2h0PU1hdGguYWJzKGIueS10LnkpO25vZGUueD1sLngrbm9kZS53aWR0aC8yO25vZGUueT10Lnkrbm9kZS5oZWlnaHQvMn19KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcubm9kZSh2KS5kdW1teT09PSJib3JkZXIiKWcucmVtb3ZlTm9kZSh2KX0pfWZ1bmN0aW9uIHJlbW92ZVNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXtpZihlLnY9PT1lLncpe3ZhciBub2RlPWcubm9kZShlLnYpO2lmKCFub2RlLnNlbGZFZGdlcylub2RlLnNlbGZFZGdlcz1bXTtub2RlLnNlbGZFZGdlcy5wdXNoKHtlOmUsbGFiZWw6Zy5lZGdlKGUpfSk7Zy5yZW1vdmVFZGdlKGUpfX0pfWZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKXt2YXIgbGF5ZXJzPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKGxheWVyKXt2YXIgb3JkZXJTaGlmdD0wO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe3ZhciBub2RlPWcubm9kZSh2KTtub2RlLm9yZGVyPWkrb3JkZXJTaGlmdDtfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsZnVuY3Rpb24oc2VsZkVkZ2Upe3V0aWwuYWRkRHVtbXlOb2RlKGcsInNlbGZlZGdlIix7d2lkdGg6c2VsZkVkZ2UubGFiZWwud2lkdGgsaGVpZ2h0OnNlbGZFZGdlLmxhYmVsLmhlaWdodCxyYW5rOm5vZGUucmFuayxvcmRlcjppKyArK29yZGVyU2hpZnQsCmU6c2VsZkVkZ2UuZSxsYWJlbDpzZWxmRWRnZS5sYWJlbH0sIl9zZSIpfSk7ZGVsZXRlIG5vZGUuc2VsZkVkZ2VzfSl9KX1mdW5jdGlvbiBwb3NpdGlvblNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09InNlbGZlZGdlIil7dmFyIHNlbGZOb2RlPWcubm9kZShub2RlLmUudikseD1zZWxmTm9kZS54K3NlbGZOb2RlLndpZHRoLzIseT1zZWxmTm9kZS55LGR4PW5vZGUueC14LGR5PXNlbGZOb2RlLmhlaWdodC8yO2cuc2V0RWRnZShub2RlLmUsbm9kZS5sYWJlbCk7Zy5yZW1vdmVOb2RlKHYpO25vZGUubGFiZWwucG9pbnRzPVt7eDp4KzIqZHgvMyx5OnktZHl9LHt4OngrNSpkeC82LHk6eS1keX0se3g6eCtkeCx5Onl9LHt4OngrNSpkeC82LHk6eStkeX0se3g6eCsyKmR4LzMseTp5K2R5fV07bm9kZS5sYWJlbC54PW5vZGUueDtub2RlLmxhYmVsLnk9bm9kZS55fX0pfWZ1bmN0aW9uIHNlbGVjdE51bWJlckF0dHJzKG9iaiwKYXR0cnMpe3JldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLGF0dHJzKSxOdW1iZXIpfWZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycyl7dmFyIG5ld0F0dHJzPXt9O18uZm9yRWFjaChhdHRycyxmdW5jdGlvbih2LGspe25ld0F0dHJzW2sudG9Mb3dlckNhc2UoKV09dn0pO3JldHVybiBuZXdBdHRyc319LHsiLi9hY3ljbGljIjoyLCIuL2FkZC1ib3JkZXItc2VnbWVudHMiOjMsIi4vY29vcmRpbmF0ZS1zeXN0ZW0iOjQsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi9uZXN0aW5nLWdyYXBoIjoxMSwiLi9ub3JtYWxpemUiOjEyLCIuL29yZGVyIjoxNywiLi9wYXJlbnQtZHVtbXktY2hhaW5zIjoyMiwiLi9wb3NpdGlvbiI6MjQsIi4vcmFuayI6MjYsIi4vdXRpbCI6Mjl9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxvZGFzaDtpZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2xvZGFzaD1yZXF1aXJlKCJsb2Rhc2giKX1jYXRjaChlKXt9aWYoIWxvZGFzaClsb2Rhc2g9CndpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sY2xlYW51cDpjbGVhbnVwfTtmdW5jdGlvbiBydW4oZyl7dmFyIHJvb3Q9dXRpbC5hZGREdW1teU5vZGUoZywicm9vdCIse30sIl9yb290Iik7dmFyIGRlcHRocz10cmVlRGVwdGhzKGcpO3ZhciBoZWlnaHQ9Xy5tYXgoXy52YWx1ZXMoZGVwdGhzKSktMTt2YXIgbm9kZVNlcD0yKmhlaWdodCsxO2cuZ3JhcGgoKS5uZXN0aW5nUm9vdD1yb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7Zy5lZGdlKGUpLm1pbmxlbio9bm9kZVNlcH0pO3ZhciB3ZWlnaHQ9c3VtV2VpZ2h0cyhnKSsxO18uZm9yRWFjaChnLmNoaWxkcmVuKCksZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCwKd2VpZ2h0LGhlaWdodCxkZXB0aHMsY2hpbGQpfSk7Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yPW5vZGVTZXB9ZnVuY3Rpb24gZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpO2lmKCFjaGlsZHJlbi5sZW5ndGgpe2lmKHYhPT1yb290KWcuc2V0RWRnZShyb290LHYse3dlaWdodDowLG1pbmxlbjpub2RlU2VwfSk7cmV0dXJufXZhciB0b3A9dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9idCIpLGJvdHRvbT11dGlsLmFkZEJvcmRlck5vZGUoZywiX2JiIiksbGFiZWw9Zy5ub2RlKHYpO2cuc2V0UGFyZW50KHRvcCx2KTtsYWJlbC5ib3JkZXJUb3A9dG9wO2cuc2V0UGFyZW50KGJvdHRvbSx2KTtsYWJlbC5ib3JkZXJCb3R0b209Ym90dG9tO18uZm9yRWFjaChjaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7ZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKTt2YXIgY2hpbGROb2RlPWcubm9kZShjaGlsZCksCmNoaWxkVG9wPWNoaWxkTm9kZS5ib3JkZXJUb3A/Y2hpbGROb2RlLmJvcmRlclRvcDpjaGlsZCxjaGlsZEJvdHRvbT1jaGlsZE5vZGUuYm9yZGVyQm90dG9tP2NoaWxkTm9kZS5ib3JkZXJCb3R0b206Y2hpbGQsdGhpc1dlaWdodD1jaGlsZE5vZGUuYm9yZGVyVG9wP3dlaWdodDoyKndlaWdodCxtaW5sZW49Y2hpbGRUb3AhPT1jaGlsZEJvdHRvbT8xOmhlaWdodC1kZXB0aHNbdl0rMTtnLnNldEVkZ2UodG9wLGNoaWxkVG9wLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KTtnLnNldEVkZ2UoY2hpbGRCb3R0b20sYm90dG9tLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KX0pO2lmKCFnLnBhcmVudCh2KSlnLnNldEVkZ2Uocm9vdCx0b3Ase3dlaWdodDowLG1pbmxlbjpoZWlnaHQrZGVwdGhzW3ZdfSl9ZnVuY3Rpb24gdHJlZURlcHRocyhnKXt2YXIgZGVwdGhzPXt9O2Z1bmN0aW9uIGRmcyh2LGRlcHRoKXt2YXIgY2hpbGRyZW49CmcuY2hpbGRyZW4odik7aWYoY2hpbGRyZW4mJmNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhjaGlsZCxkZXB0aCsxKX0pO2RlcHRoc1t2XT1kZXB0aH1fLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKHYpe2Rmcyh2LDEpfSk7cmV0dXJuIGRlcHRoc31mdW5jdGlvbiBzdW1XZWlnaHRzKGcpe3JldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksZnVuY3Rpb24oYWNjLGUpe3JldHVybiBhY2MrZy5lZGdlKGUpLndlaWdodH0sMCl9ZnVuY3Rpb24gY2xlYW51cChnKXt2YXIgZ3JhcGhMYWJlbD1nLmdyYXBoKCk7Zy5yZW1vdmVOb2RlKGdyYXBoTGFiZWwubmVzdGluZ1Jvb3QpO2RlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UubmVzdGluZ0VkZ2UpZy5yZW1vdmVFZGdlKGUpfSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLAoxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe2cuZ3JhcGgoKS5kdW1teUNoYWlucz1bXTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe25vcm1hbGl6ZUVkZ2UoZyxlZGdlKX0pfWZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZyxlKXt2YXIgdj1lLnYsdlJhbms9Zy5ub2RlKHYpLnJhbmssdz1lLncsd1Jhbms9Zy5ub2RlKHcpLnJhbmssbmFtZT1lLm5hbWUsZWRnZUxhYmVsPWcuZWRnZShlKSxsYWJlbFJhbms9ZWRnZUxhYmVsLmxhYmVsUmFuaztpZih3UmFuaz09PXZSYW5rKzEpcmV0dXJuO2cucmVtb3ZlRWRnZShlKTt2YXIgZHVtbXksYXR0cnMsaTtmb3IoaT0wLCsrdlJhbms7dlJhbms8d1Jhbms7KytpLCsrdlJhbmspe2VkZ2VMYWJlbC5wb2ludHM9W107YXR0cnM9e3dpZHRoOjAsCmhlaWdodDowLGVkZ2VMYWJlbDplZGdlTGFiZWwsZWRnZU9iajplLHJhbms6dlJhbmt9O2R1bW15PXV0aWwuYWRkRHVtbXlOb2RlKGcsImVkZ2UiLGF0dHJzLCJfZCIpO2lmKHZSYW5rPT09bGFiZWxSYW5rKXthdHRycy53aWR0aD1lZGdlTGFiZWwud2lkdGg7YXR0cnMuaGVpZ2h0PWVkZ2VMYWJlbC5oZWlnaHQ7YXR0cnMuZHVtbXk9ImVkZ2UtbGFiZWwiO2F0dHJzLmxhYmVscG9zPWVkZ2VMYWJlbC5sYWJlbHBvc31nLnNldEVkZ2UodixkdW1teSx7d2VpZ2h0OmVkZ2VMYWJlbC53ZWlnaHR9LG5hbWUpO2lmKGk9PT0wKWcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTt2PWR1bW15fWcuc2V0RWRnZSh2LHcse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKX1mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLG9yaWdMYWJlbD1ub2RlLmVkZ2VMYWJlbCx3O2cuc2V0RWRnZShub2RlLmVkZ2VPYmosCm9yaWdMYWJlbCk7d2hpbGUobm9kZS5kdW1teSl7dz1nLnN1Y2Nlc3NvcnModilbMF07Zy5yZW1vdmVOb2RlKHYpO29yaWdMYWJlbC5wb2ludHMucHVzaCh7eDpub2RlLngseTpub2RlLnl9KTtpZihub2RlLmR1bW15PT09ImVkZ2UtbGFiZWwiKXtvcmlnTGFiZWwueD1ub2RlLng7b3JpZ0xhYmVsLnk9bm9kZS55O29yaWdMYWJlbC53aWR0aD1ub2RlLndpZHRoO29yaWdMYWJlbC5oZWlnaHQ9bm9kZS5oZWlnaHR9dj13O25vZGU9Zy5ub2RlKHYpfX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YWRkU3ViZ3JhcGhDb25zdHJhaW50cztmdW5jdGlvbiBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGcsY2csdnMpe3ZhciBwcmV2PXt9LHJvb3RQcmV2O18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgY2hpbGQ9Zy5wYXJlbnQodikscGFyZW50LApwcmV2Q2hpbGQ7d2hpbGUoY2hpbGQpe3BhcmVudD1nLnBhcmVudChjaGlsZCk7aWYocGFyZW50KXtwcmV2Q2hpbGQ9cHJldltwYXJlbnRdO3ByZXZbcGFyZW50XT1jaGlsZH1lbHNle3ByZXZDaGlsZD1yb290UHJldjtyb290UHJldj1jaGlsZH1pZihwcmV2Q2hpbGQmJnByZXZDaGlsZCE9PWNoaWxkKXtjZy5zZXRFZGdlKHByZXZDaGlsZCxjaGlsZCk7cmV0dXJufWNoaWxkPXBhcmVudH19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1iYXJ5Y2VudGVyO2Z1bmN0aW9uIGJhcnljZW50ZXIoZyxtb3ZhYmxlKXtyZXR1cm4gXy5tYXAobW92YWJsZSxmdW5jdGlvbih2KXt2YXIgaW5WPWcuaW5FZGdlcyh2KTtpZighaW5WLmxlbmd0aClyZXR1cm57djp2fTtlbHNle3ZhciByZXN1bHQ9Xy5yZWR1Y2UoaW5WLGZ1bmN0aW9uKGFjYyxlKXt2YXIgZWRnZT1nLmVkZ2UoZSksCm5vZGVVPWcubm9kZShlLnYpO3JldHVybntzdW06YWNjLnN1bStlZGdlLndlaWdodCpub2RlVS5vcmRlcix3ZWlnaHQ6YWNjLndlaWdodCtlZGdlLndlaWdodH19LHtzdW06MCx3ZWlnaHQ6MH0pO3JldHVybnt2OnYsYmFyeWNlbnRlcjpyZXN1bHQuc3VtL3Jlc3VsdC53ZWlnaHQsd2VpZ2h0OnJlc3VsdC53ZWlnaHR9fX0pfX0seyIuLi9sb2Rhc2giOjEwfV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9YnVpbGRMYXllckdyYXBoO2Z1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKXt2YXIgcm9vdD1jcmVhdGVSb290Tm9kZShnKSxyZXN1bHQ9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZX0pKS5zZXRHcmFwaCh7cm9vdDpyb290fSkuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpfSk7Cl8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHBhcmVudD1nLnBhcmVudCh2KTtpZihub2RlLnJhbms9PT1yYW5rfHxub2RlLm1pblJhbms8PXJhbmsmJnJhbms8PW5vZGUubWF4UmFuayl7cmVzdWx0LnNldE5vZGUodik7cmVzdWx0LnNldFBhcmVudCh2LHBhcmVudHx8cm9vdCk7Xy5mb3JFYWNoKGdbcmVsYXRpb25zaGlwXSh2KSxmdW5jdGlvbihlKXt2YXIgdT1lLnY9PT12P2UudzplLnYsZWRnZT1yZXN1bHQuZWRnZSh1LHYpLHdlaWdodD0hXy5pc1VuZGVmaW5lZChlZGdlKT9lZGdlLndlaWdodDowO3Jlc3VsdC5zZXRFZGdlKHUsdix7d2VpZ2h0OmcuZWRnZShlKS53ZWlnaHQrd2VpZ2h0fSl9KTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpcmVzdWx0LnNldE5vZGUodix7Ym9yZGVyTGVmdDpub2RlLmJvcmRlckxlZnRbcmFua10sYm9yZGVyUmlnaHQ6bm9kZS5ib3JkZXJSaWdodFtyYW5rXX0pfX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY3JlYXRlUm9vdE5vZGUoZyl7dmFyIHY7CndoaWxlKGcuaGFzTm9kZSh2PV8udW5pcXVlSWQoIl9yb290IikpKTtyZXR1cm4gdn19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTB9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9Y3Jvc3NDb3VudDtmdW5jdGlvbiBjcm9zc0NvdW50KGcsbGF5ZXJpbmcpe3ZhciBjYz0wO2Zvcih2YXIgaT0xO2k8bGF5ZXJpbmcubGVuZ3RoOysraSljYys9dHdvTGF5ZXJDcm9zc0NvdW50KGcsbGF5ZXJpbmdbaS0xXSxsYXllcmluZ1tpXSk7cmV0dXJuIGNjfWZ1bmN0aW9uIHR3b0xheWVyQ3Jvc3NDb3VudChnLG5vcnRoTGF5ZXIsc291dGhMYXllcil7dmFyIHNvdXRoUG9zPV8uemlwT2JqZWN0KHNvdXRoTGF5ZXIsXy5tYXAoc291dGhMYXllcixmdW5jdGlvbih2LGkpe3JldHVybiBpfSkpO3ZhciBzb3V0aEVudHJpZXM9Xy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIF8uY2hhaW4oZy5vdXRFZGdlcyh2KSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntwb3M6c291dGhQb3NbZS53XSwKd2VpZ2h0OmcuZWRnZShlKS53ZWlnaHR9fSkuc29ydEJ5KCJwb3MiKS52YWx1ZSgpfSksdHJ1ZSk7dmFyIGZpcnN0SW5kZXg9MTt3aGlsZShmaXJzdEluZGV4PHNvdXRoTGF5ZXIubGVuZ3RoKWZpcnN0SW5kZXg8PD0xO3ZhciB0cmVlU2l6ZT0yKmZpcnN0SW5kZXgtMTtmaXJzdEluZGV4LT0xO3ZhciB0cmVlPV8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksZnVuY3Rpb24oKXtyZXR1cm4gMH0pO3ZhciBjYz0wO18uZm9yRWFjaChzb3V0aEVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSl7dmFyIGluZGV4PWVudHJ5LnBvcytmaXJzdEluZGV4O3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHQ7dmFyIHdlaWdodFN1bT0wO3doaWxlKGluZGV4PjApe2lmKGluZGV4JTIpd2VpZ2h0U3VtKz10cmVlW2luZGV4KzFdO2luZGV4PWluZGV4LTE+PjE7dHJlZVtpbmRleF0rPWVudHJ5LndlaWdodH1jYys9ZW50cnkud2VpZ2h0KndlaWdodFN1bX0pKTtyZXR1cm4gY2N9fSx7Ii4uL2xvZGFzaCI6MTB9XSwKMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGluaXRPcmRlcj1yZXF1aXJlKCIuL2luaXQtb3JkZXIiKSxjcm9zc0NvdW50PXJlcXVpcmUoIi4vY3Jvc3MtY291bnQiKSxzb3J0U3ViZ3JhcGg9cmVxdWlyZSgiLi9zb3J0LXN1YmdyYXBoIiksYnVpbGRMYXllckdyYXBoPXJlcXVpcmUoIi4vYnVpbGQtbGF5ZXItZ3JhcGgiKSxhZGRTdWJncmFwaENvbnN0cmFpbnRzPXJlcXVpcmUoIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1vcmRlcjtmdW5jdGlvbiBvcmRlcihnKXt2YXIgbWF4UmFuaz11dGlsLm1heFJhbmsoZyksZG93bkxheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZyxfLnJhbmdlKDEsbWF4UmFuaysxKSwiaW5FZGdlcyIpLHVwTGF5ZXJHcmFwaHM9YnVpbGRMYXllckdyYXBocyhnLApfLnJhbmdlKG1heFJhbmstMSwtMSwtMSksIm91dEVkZ2VzIik7dmFyIGxheWVyaW5nPWluaXRPcmRlcihnKTthc3NpZ25PcmRlcihnLGxheWVyaW5nKTt2YXIgYmVzdENDPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxiZXN0O2Zvcih2YXIgaT0wLGxhc3RCZXN0PTA7bGFzdEJlc3Q8NDsrK2ksKytsYXN0QmVzdCl7c3dlZXBMYXllckdyYXBocyhpJTI/ZG93bkxheWVyR3JhcGhzOnVwTGF5ZXJHcmFwaHMsaSU0Pj0yKTtsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGNjPWNyb3NzQ291bnQoZyxsYXllcmluZyk7aWYoY2M8YmVzdENDKXtsYXN0QmVzdD0wO2Jlc3Q9Xy5jbG9uZURlZXAobGF5ZXJpbmcpO2Jlc3RDQz1jY319YXNzaWduT3JkZXIoZyxiZXN0KX1mdW5jdGlvbiBidWlsZExheWVyR3JhcGhzKGcscmFua3MscmVsYXRpb25zaGlwKXtyZXR1cm4gXy5tYXAocmFua3MsZnVuY3Rpb24ocmFuayl7cmV0dXJuIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKX0pfQpmdW5jdGlvbiBzd2VlcExheWVyR3JhcGhzKGxheWVyR3JhcGhzLGJpYXNSaWdodCl7dmFyIGNnPW5ldyBHcmFwaDtfLmZvckVhY2gobGF5ZXJHcmFwaHMsZnVuY3Rpb24obGcpe3ZhciByb290PWxnLmdyYXBoKCkucm9vdDt2YXIgc29ydGVkPXNvcnRTdWJncmFwaChsZyxyb290LGNnLGJpYXNSaWdodCk7Xy5mb3JFYWNoKHNvcnRlZC52cyxmdW5jdGlvbih2LGkpe2xnLm5vZGUodikub3JkZXI9aX0pO2FkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsY2csc29ydGVkLnZzKX0pfWZ1bmN0aW9uIGFzc2lnbk9yZGVyKGcsbGF5ZXJpbmcpe18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7Zy5ub2RlKHYpLm9yZGVyPWl9KX0pfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIjoxMywiLi9idWlsZC1sYXllci1ncmFwaCI6MTUsIi4vY3Jvc3MtY291bnQiOjE2LAoiLi9pbml0LW9yZGVyIjoxOCwiLi9zb3J0LXN1YmdyYXBoIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1pbml0T3JkZXI7ZnVuY3Rpb24gaW5pdE9yZGVyKGcpe3ZhciB2aXNpdGVkPXt9LHNpbXBsZU5vZGVzPV8uZmlsdGVyKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5jaGlsZHJlbih2KS5sZW5ndGh9KSxtYXhSYW5rPV8ubWF4KF8ubWFwKHNpbXBsZU5vZGVzLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKSxsYXllcnM9Xy5tYXAoXy5yYW5nZShtYXhSYW5rKzEpLGZ1bmN0aW9uKCl7cmV0dXJuW119KTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3ZhciBub2RlPWcubm9kZSh2KTtsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO18uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKX12YXIgb3JkZXJlZFZzPQpfLnNvcnRCeShzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KTtfLmZvckVhY2gob3JkZXJlZFZzLGRmcyk7cmV0dXJuIGxheWVyc319LHsiLi4vbG9kYXNoIjoxMH1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1yZXNvbHZlQ29uZmxpY3RzO2Z1bmN0aW9uIHJlc29sdmVDb25mbGljdHMoZW50cmllcyxjZyl7dmFyIG1hcHBlZEVudHJpZXM9e307Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnksaSl7dmFyIHRtcD1tYXBwZWRFbnRyaWVzW2VudHJ5LnZdPXtpbmRlZ3JlZTowLCJpbiI6W10sb3V0OltdLHZzOltlbnRyeS52XSxpOml9O2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5LmJhcnljZW50ZXIpKXt0bXAuYmFyeWNlbnRlcj1lbnRyeS5iYXJ5Y2VudGVyO3RtcC53ZWlnaHQ9ZW50cnkud2VpZ2h0fX0pO18uZm9yRWFjaChjZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlbnRyeVY9Cm1hcHBlZEVudHJpZXNbZS52XSxlbnRyeVc9bWFwcGVkRW50cmllc1tlLnddO2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5VikmJiFfLmlzVW5kZWZpbmVkKGVudHJ5Vykpe2VudHJ5Vy5pbmRlZ3JlZSsrO2VudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pfX0pO3ZhciBzb3VyY2VTZXQ9Xy5maWx0ZXIobWFwcGVkRW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5LmluZGVncmVlfSk7cmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpfWZ1bmN0aW9uIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpe3ZhciBlbnRyaWVzPVtdO2Z1bmN0aW9uIGhhbmRsZUluKHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSl7aWYodUVudHJ5Lm1lcmdlZClyZXR1cm47aWYoXy5pc1VuZGVmaW5lZCh1RW50cnkuYmFyeWNlbnRlcil8fF8uaXNVbmRlZmluZWQodkVudHJ5LmJhcnljZW50ZXIpfHx1RW50cnkuYmFyeWNlbnRlcj49dkVudHJ5LmJhcnljZW50ZXIpbWVyZ2VFbnRyaWVzKHZFbnRyeSwKdUVudHJ5KX19ZnVuY3Rpb24gaGFuZGxlT3V0KHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSl7d0VudHJ5WyJpbiJdLnB1c2godkVudHJ5KTtpZigtLXdFbnRyeS5pbmRlZ3JlZT09PTApc291cmNlU2V0LnB1c2god0VudHJ5KX19d2hpbGUoc291cmNlU2V0Lmxlbmd0aCl7dmFyIGVudHJ5PXNvdXJjZVNldC5wb3AoKTtlbnRyaWVzLnB1c2goZW50cnkpO18uZm9yRWFjaChlbnRyeVsiaW4iXS5yZXZlcnNlKCksaGFuZGxlSW4oZW50cnkpKTtfLmZvckVhY2goZW50cnkub3V0LGhhbmRsZU91dChlbnRyeSkpfXJldHVybiBfLmNoYWluKGVudHJpZXMpLmZpbHRlcihmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5Lm1lcmdlZH0pLm1hcChmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8ucGljayhlbnRyeSxbInZzIiwiaSIsImJhcnljZW50ZXIiLCJ3ZWlnaHQiXSl9KS52YWx1ZSgpfWZ1bmN0aW9uIG1lcmdlRW50cmllcyh0YXJnZXQsc291cmNlKXt2YXIgc3VtPTAsd2VpZ2h0PTA7CmlmKHRhcmdldC53ZWlnaHQpe3N1bSs9dGFyZ2V0LmJhcnljZW50ZXIqdGFyZ2V0LndlaWdodDt3ZWlnaHQrPXRhcmdldC53ZWlnaHR9aWYoc291cmNlLndlaWdodCl7c3VtKz1zb3VyY2UuYmFyeWNlbnRlcipzb3VyY2Uud2VpZ2h0O3dlaWdodCs9c291cmNlLndlaWdodH10YXJnZXQudnM9c291cmNlLnZzLmNvbmNhdCh0YXJnZXQudnMpO3RhcmdldC5iYXJ5Y2VudGVyPXN1bS93ZWlnaHQ7dGFyZ2V0LndlaWdodD13ZWlnaHQ7dGFyZ2V0Lmk9TWF0aC5taW4oc291cmNlLmksdGFyZ2V0LmkpO3NvdXJjZS5tZXJnZWQ9dHJ1ZX19LHsiLi4vbG9kYXNoIjoxMH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxiYXJ5Y2VudGVyPXJlcXVpcmUoIi4vYmFyeWNlbnRlciIpLHJlc29sdmVDb25mbGljdHM9cmVxdWlyZSgiLi9yZXNvbHZlLWNvbmZsaWN0cyIpLHNvcnQ9cmVxdWlyZSgiLi9zb3J0Iik7bW9kdWxlLmV4cG9ydHM9CnNvcnRTdWJncmFwaDtmdW5jdGlvbiBzb3J0U3ViZ3JhcGgoZyx2LGNnLGJpYXNSaWdodCl7dmFyIG1vdmFibGU9Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KSxibD1ub2RlP25vZGUuYm9yZGVyTGVmdDp1bmRlZmluZWQsYnI9bm9kZT9ub2RlLmJvcmRlclJpZ2h0OnVuZGVmaW5lZCxzdWJncmFwaHM9e307aWYoYmwpbW92YWJsZT1fLmZpbHRlcihtb3ZhYmxlLGZ1bmN0aW9uKHcpe3JldHVybiB3IT09YmwmJnchPT1icn0pO3ZhciBiYXJ5Y2VudGVycz1iYXJ5Y2VudGVyKGcsbW92YWJsZSk7Xy5mb3JFYWNoKGJhcnljZW50ZXJzLGZ1bmN0aW9uKGVudHJ5KXtpZihnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCl7dmFyIHN1YmdyYXBoUmVzdWx0PXNvcnRTdWJncmFwaChnLGVudHJ5LnYsY2csYmlhc1JpZ2h0KTtzdWJncmFwaHNbZW50cnkudl09c3ViZ3JhcGhSZXN1bHQ7aWYoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsImJhcnljZW50ZXIiKSltZXJnZUJhcnljZW50ZXJzKGVudHJ5LApzdWJncmFwaFJlc3VsdCl9fSk7dmFyIGVudHJpZXM9cmVzb2x2ZUNvbmZsaWN0cyhiYXJ5Y2VudGVycyxjZyk7ZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsc3ViZ3JhcGhzKTt2YXIgcmVzdWx0PXNvcnQoZW50cmllcyxiaWFzUmlnaHQpO2lmKGJsKXtyZXN1bHQudnM9Xy5mbGF0dGVuKFtibCxyZXN1bHQudnMsYnJdLHRydWUpO2lmKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpe3ZhciBibFByZWQ9Zy5ub2RlKGcucHJlZGVjZXNzb3JzKGJsKVswXSksYnJQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhicilbMF0pO2lmKCFfLmhhcyhyZXN1bHQsImJhcnljZW50ZXIiKSl7cmVzdWx0LmJhcnljZW50ZXI9MDtyZXN1bHQud2VpZ2h0PTB9cmVzdWx0LmJhcnljZW50ZXI9KHJlc3VsdC5iYXJ5Y2VudGVyKnJlc3VsdC53ZWlnaHQrYmxQcmVkLm9yZGVyK2JyUHJlZC5vcmRlcikvKHJlc3VsdC53ZWlnaHQrMik7cmVzdWx0LndlaWdodCs9Mn19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBleHBhbmRTdWJncmFwaHMoZW50cmllcywKc3ViZ3JhcGhzKXtfLmZvckVhY2goZW50cmllcyxmdW5jdGlvbihlbnRyeSl7ZW50cnkudnM9Xy5mbGF0dGVuKGVudHJ5LnZzLm1hcChmdW5jdGlvbih2KXtpZihzdWJncmFwaHNbdl0pcmV0dXJuIHN1YmdyYXBoc1t2XS52cztyZXR1cm4gdn0pLHRydWUpfSl9ZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsb3RoZXIpe2lmKCFfLmlzVW5kZWZpbmVkKHRhcmdldC5iYXJ5Y2VudGVyKSl7dGFyZ2V0LmJhcnljZW50ZXI9KHRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQrb3RoZXIuYmFyeWNlbnRlcipvdGhlci53ZWlnaHQpLyh0YXJnZXQud2VpZ2h0K290aGVyLndlaWdodCk7dGFyZ2V0LndlaWdodCs9b3RoZXIud2VpZ2h0fWVsc2V7dGFyZ2V0LmJhcnljZW50ZXI9b3RoZXIuYmFyeWNlbnRlcjt0YXJnZXQud2VpZ2h0PW90aGVyLndlaWdodH19fSx7Ii4uL2xvZGFzaCI6MTAsIi4vYmFyeWNlbnRlciI6MTQsIi4vcmVzb2x2ZS1jb25mbGljdHMiOjE5LCIuL3NvcnQiOjIxfV0sCjIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1zb3J0O2Z1bmN0aW9uIHNvcnQoZW50cmllcyxiaWFzUmlnaHQpe3ZhciBwYXJ0cz11dGlsLnBhcnRpdGlvbihlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4gXy5oYXMoZW50cnksImJhcnljZW50ZXIiKX0pO3ZhciBzb3J0YWJsZT1wYXJ0cy5saHMsdW5zb3J0YWJsZT1fLnNvcnRCeShwYXJ0cy5yaHMsZnVuY3Rpb24oZW50cnkpe3JldHVybi1lbnRyeS5pfSksdnM9W10sc3VtPTAsd2VpZ2h0PTAsdnNJbmRleD0wO3NvcnRhYmxlLnNvcnQoY29tcGFyZVdpdGhCaWFzKCEhYmlhc1JpZ2h0KSk7dnNJbmRleD1jb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLHZzSW5kZXgpO18uZm9yRWFjaChzb3J0YWJsZSxmdW5jdGlvbihlbnRyeSl7dnNJbmRleCs9ZW50cnkudnMubGVuZ3RoO3ZzLnB1c2goZW50cnkudnMpOwpzdW0rPWVudHJ5LmJhcnljZW50ZXIqZW50cnkud2VpZ2h0O3dlaWdodCs9ZW50cnkud2VpZ2h0O3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KX0pO3ZhciByZXN1bHQ9e3ZzOl8uZmxhdHRlbih2cyx0cnVlKX07aWYod2VpZ2h0KXtyZXN1bHQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3Jlc3VsdC53ZWlnaHQ9d2VpZ2h0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSxpbmRleCl7dmFyIGxhc3Q7d2hpbGUodW5zb3J0YWJsZS5sZW5ndGgmJihsYXN0PV8ubGFzdCh1bnNvcnRhYmxlKSkuaTw9aW5kZXgpe3Vuc29ydGFibGUucG9wKCk7dnMucHVzaChsYXN0LnZzKTtpbmRleCsrfXJldHVybiBpbmRleH1mdW5jdGlvbiBjb21wYXJlV2l0aEJpYXMoYmlhcyl7cmV0dXJuIGZ1bmN0aW9uKGVudHJ5VixlbnRyeVcpe2lmKGVudHJ5Vi5iYXJ5Y2VudGVyPGVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybi0xO2Vsc2UgaWYoZW50cnlWLmJhcnljZW50ZXI+CmVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybiAxO3JldHVybiFiaWFzP2VudHJ5Vi5pLWVudHJ5Vy5pOmVudHJ5Vy5pLWVudHJ5Vi5pfX19LHsiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6Mjl9XSwyMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1wYXJlbnREdW1teUNoYWlucztmdW5jdGlvbiBwYXJlbnREdW1teUNoYWlucyhnKXt2YXIgcG9zdG9yZGVyTnVtcz1wb3N0b3JkZXIoZyk7Xy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucyxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodiksZWRnZU9iaj1ub2RlLmVkZ2VPYmoscGF0aERhdGE9ZmluZFBhdGgoZyxwb3N0b3JkZXJOdW1zLGVkZ2VPYmoudixlZGdlT2JqLncpLHBhdGg9cGF0aERhdGEucGF0aCxsY2E9cGF0aERhdGEubGNhLHBhdGhJZHg9MCxwYXRoVj1wYXRoW3BhdGhJZHhdLGFzY2VuZGluZz10cnVlO3doaWxlKHYhPT1lZGdlT2JqLncpe25vZGU9Cmcubm9kZSh2KTtpZihhc2NlbmRpbmcpe3doaWxlKChwYXRoVj1wYXRoW3BhdGhJZHhdKSE9PWxjYSYmZy5ub2RlKHBhdGhWKS5tYXhSYW5rPG5vZGUucmFuaylwYXRoSWR4Kys7aWYocGF0aFY9PT1sY2EpYXNjZW5kaW5nPWZhbHNlfWlmKCFhc2NlbmRpbmcpe3doaWxlKHBhdGhJZHg8cGF0aC5sZW5ndGgtMSYmZy5ub2RlKHBhdGhWPXBhdGhbcGF0aElkeCsxXSkubWluUmFuazw9bm9kZS5yYW5rKXBhdGhJZHgrKztwYXRoVj1wYXRoW3BhdGhJZHhdfWcuc2V0UGFyZW50KHYscGF0aFYpO3Y9Zy5zdWNjZXNzb3JzKHYpWzBdfX0pfWZ1bmN0aW9uIGZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyx2LHcpe3ZhciB2UGF0aD1bXSx3UGF0aD1bXSxsb3c9TWF0aC5taW4ocG9zdG9yZGVyTnVtc1t2XS5sb3cscG9zdG9yZGVyTnVtc1t3XS5sb3cpLGxpbT1NYXRoLm1heChwb3N0b3JkZXJOdW1zW3ZdLmxpbSxwb3N0b3JkZXJOdW1zW3ddLmxpbSkscGFyZW50LGxjYTtwYXJlbnQ9djtkb3twYXJlbnQ9CmcucGFyZW50KHBhcmVudCk7dlBhdGgucHVzaChwYXJlbnQpfXdoaWxlKHBhcmVudCYmKHBvc3RvcmRlck51bXNbcGFyZW50XS5sb3c+bG93fHxsaW0+cG9zdG9yZGVyTnVtc1twYXJlbnRdLmxpbSkpO2xjYT1wYXJlbnQ7cGFyZW50PXc7d2hpbGUoKHBhcmVudD1nLnBhcmVudChwYXJlbnQpKSE9PWxjYSl3UGF0aC5wdXNoKHBhcmVudCk7cmV0dXJue3BhdGg6dlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksbGNhOmxjYX19ZnVuY3Rpb24gcG9zdG9yZGVyKGcpe3ZhciByZXN1bHQ9e30sbGltPTA7ZnVuY3Rpb24gZGZzKHYpe3ZhciBsb3c9bGltO18uZm9yRWFjaChnLmNoaWxkcmVuKHYpLGRmcyk7cmVzdWx0W3ZdPXtsb3c6bG93LGxpbTpsaW0rK319Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxkZnMpO3JldHVybiByZXN1bHR9fSx7Ii4vbG9kYXNoIjoxMH1dLDIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD0KcmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cG9zaXRpb25YOnBvc2l0aW9uWCxmaW5kVHlwZTFDb25mbGljdHM6ZmluZFR5cGUxQ29uZmxpY3RzLGZpbmRUeXBlMkNvbmZsaWN0czpmaW5kVHlwZTJDb25mbGljdHMsYWRkQ29uZmxpY3Q6YWRkQ29uZmxpY3QsaGFzQ29uZmxpY3Q6aGFzQ29uZmxpY3QsdmVydGljYWxBbGlnbm1lbnQ6dmVydGljYWxBbGlnbm1lbnQsaG9yaXpvbnRhbENvbXBhY3Rpb246aG9yaXpvbnRhbENvbXBhY3Rpb24sYWxpZ25Db29yZGluYXRlczphbGlnbkNvb3JkaW5hdGVzLGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50OmZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LGJhbGFuY2U6YmFsYW5jZX07ZnVuY3Rpb24gZmluZFR5cGUxQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsbGF5ZXIpe3ZhciBrMD0wLHNjYW5Qb3M9CjAscHJldkxheWVyTGVuZ3RoPXByZXZMYXllci5sZW5ndGgsbGFzdE5vZGU9Xy5sYXN0KGxheWVyKTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgdz1maW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsdiksazE9dz9nLm5vZGUodykub3JkZXI6cHJldkxheWVyTGVuZ3RoO2lmKHd8fHY9PT1sYXN0Tm9kZSl7Xy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsaSsxKSxmdW5jdGlvbihzY2FuTm9kZSl7Xy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHNjYW5Ob2RlKSxmdW5jdGlvbih1KXt2YXIgdUxhYmVsPWcubm9kZSh1KSx1UG9zPXVMYWJlbC5vcmRlcjtpZigodVBvczxrMHx8azE8dVBvcykmJiEodUxhYmVsLmR1bW15JiZnLm5vZGUoc2Nhbk5vZGUpLmR1bW15KSlhZGRDb25mbGljdChjb25mbGljdHMsdSxzY2FuTm9kZSl9KX0pO3NjYW5Qb3M9aSsxO2swPWsxfX0pO3JldHVybiBsYXllcn1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfQpmdW5jdGlvbiBmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZyl7dmFyIGNvbmZsaWN0cz17fTtmdW5jdGlvbiBzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoRW5kLHByZXZOb3J0aEJvcmRlcixuZXh0Tm9ydGhCb3JkZXIpe3ZhciB2O18uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLHNvdXRoRW5kKSxmdW5jdGlvbihpKXt2PXNvdXRoW2ldO2lmKGcubm9kZSh2KS5kdW1teSlfLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksZnVuY3Rpb24odSl7dmFyIHVOb2RlPWcubm9kZSh1KTtpZih1Tm9kZS5kdW1teSYmKHVOb2RlLm9yZGVyPHByZXZOb3J0aEJvcmRlcnx8dU5vZGUub3JkZXI+bmV4dE5vcnRoQm9yZGVyKSlhZGRDb25mbGljdChjb25mbGljdHMsdSx2KX0pfSl9ZnVuY3Rpb24gdmlzaXRMYXllcihub3J0aCxzb3V0aCl7dmFyIHByZXZOb3J0aFBvcz0tMSxuZXh0Tm9ydGhQb3Msc291dGhQb3M9MDtfLmZvckVhY2goc291dGgsZnVuY3Rpb24odixzb3V0aExvb2thaGVhZCl7aWYoZy5ub2RlKHYpLmR1bW15PT09CiJib3JkZXIiKXt2YXIgcHJlZGVjZXNzb3JzPWcucHJlZGVjZXNzb3JzKHYpO2lmKHByZWRlY2Vzc29ycy5sZW5ndGgpe25leHROb3J0aFBvcz1nLm5vZGUocHJlZGVjZXNzb3JzWzBdKS5vcmRlcjtzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoTG9va2FoZWFkLHByZXZOb3J0aFBvcyxuZXh0Tm9ydGhQb3MpO3NvdXRoUG9zPXNvdXRoTG9va2FoZWFkO3ByZXZOb3J0aFBvcz1uZXh0Tm9ydGhQb3N9fXNjYW4oc291dGgsc291dGhQb3Msc291dGgubGVuZ3RoLG5leHROb3J0aFBvcyxub3J0aC5sZW5ndGgpfSk7cmV0dXJuIHNvdXRofV8ucmVkdWNlKGxheWVyaW5nLHZpc2l0TGF5ZXIpO3JldHVybiBjb25mbGljdHN9ZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpe2lmKGcubm9kZSh2KS5kdW1teSlyZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3JldHVybiBnLm5vZGUodSkuZHVtbXl9KX1mdW5jdGlvbiBhZGRDb25mbGljdChjb25mbGljdHMsCnYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXZhciBjb25mbGljdHNWPWNvbmZsaWN0c1t2XTtpZighY29uZmxpY3RzViljb25mbGljdHNbdl09Y29uZmxpY3RzVj17fTtjb25mbGljdHNWW3ddPXRydWV9ZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXJldHVybiBfLmhhcyhjb25mbGljdHNbdl0sdyl9ZnVuY3Rpb24gdmVydGljYWxBbGlnbm1lbnQoZyxsYXllcmluZyxjb25mbGljdHMsbmVpZ2hib3JGbil7dmFyIHJvb3Q9e30sYWxpZ249e30scG9zPXt9O18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsb3JkZXIpe3Jvb3Rbdl09djthbGlnblt2XT12O3Bvc1t2XT1vcmRlcn0pfSk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgcHJldklkeD0tMTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHdzPW5laWdoYm9yRm4odik7CmlmKHdzLmxlbmd0aCl7d3M9Xy5zb3J0Qnkod3MsZnVuY3Rpb24odyl7cmV0dXJuIHBvc1t3XX0pO3ZhciBtcD0od3MubGVuZ3RoLTEpLzI7Zm9yKHZhciBpPU1hdGguZmxvb3IobXApLGlsPU1hdGguY2VpbChtcCk7aTw9aWw7KytpKXt2YXIgdz13c1tpXTtpZihhbGlnblt2XT09PXYmJnByZXZJZHg8cG9zW3ddJiYhaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdykpe2FsaWduW3ddPXY7YWxpZ25bdl09cm9vdFt2XT1yb290W3ddO3ByZXZJZHg9cG9zW3ddfX19fSl9KTtyZXR1cm57cm9vdDpyb290LGFsaWduOmFsaWdufX1mdW5jdGlvbiBob3Jpem9udGFsQ29tcGFjdGlvbihnLGxheWVyaW5nLHJvb3QsYWxpZ24scmV2ZXJzZVNlcCl7dmFyIHhzPXt9LGJsb2NrRz1idWlsZEJsb2NrR3JhcGgoZyxsYXllcmluZyxyb290LHJldmVyc2VTZXApLGJvcmRlclR5cGU9cmV2ZXJzZVNlcD8iYm9yZGVyTGVmdCI6ImJvcmRlclJpZ2h0IjtmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYyxuZXh0Tm9kZXNGdW5jKXt2YXIgc3RhY2s9CmJsb2NrRy5ub2RlcygpO3ZhciBlbGVtPXN0YWNrLnBvcCgpO3ZhciB2aXNpdGVkPXt9O3doaWxlKGVsZW0pe2lmKHZpc2l0ZWRbZWxlbV0pc2V0WHNGdW5jKGVsZW0pO2Vsc2V7dmlzaXRlZFtlbGVtXT10cnVlO3N0YWNrLnB1c2goZWxlbSk7c3RhY2s9c3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpfWVsZW09c3RhY2sucG9wKCl9fWZ1bmN0aW9uIHBhc3MxKGVsZW0pe3hzW2VsZW1dPWJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWF4KGFjYyx4c1tlLnZdK2Jsb2NrRy5lZGdlKGUpKX0sMCl9ZnVuY3Rpb24gcGFzczIoZWxlbSl7dmFyIG1pbj1ibG9ja0cub3V0RWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gTWF0aC5taW4oYWNjLHhzW2Uud10tYmxvY2tHLmVkZ2UoZSkpfSxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO3ZhciBub2RlPWcubm9kZShlbGVtKTtpZihtaW4hPT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkmJgpub2RlLmJvcmRlclR5cGUhPT1ib3JkZXJUeXBlKXhzW2VsZW1dPU1hdGgubWF4KHhzW2VsZW1dLG1pbil9aXRlcmF0ZShwYXNzMSxfLmJpbmQoYmxvY2tHLnByZWRlY2Vzc29ycyxibG9ja0cpKTtpdGVyYXRlKHBhc3MyLF8uYmluZChibG9ja0cuc3VjY2Vzc29ycyxibG9ja0cpKTtfLmZvckVhY2goYWxpZ24sZnVuY3Rpb24odil7eHNbdl09eHNbcm9vdFt2XV19KTtyZXR1cm4geHN9ZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKXt2YXIgYmxvY2tHcmFwaD1uZXcgR3JhcGgsZ3JhcGhMYWJlbD1nLmdyYXBoKCksc2VwRm49c2VwKGdyYXBoTGFiZWwubm9kZXNlcCxncmFwaExhYmVsLmVkZ2VzZXAscmV2ZXJzZVNlcCk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgdTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHZSb290PXJvb3Rbdl07YmxvY2tHcmFwaC5zZXROb2RlKHZSb290KTtpZih1KXt2YXIgdVJvb3Q9CnJvb3RbdV0scHJldk1heD1ibG9ja0dyYXBoLmVkZ2UodVJvb3QsdlJvb3QpO2Jsb2NrR3JhcGguc2V0RWRnZSh1Um9vdCx2Um9vdCxNYXRoLm1heChzZXBGbihnLHYsdSkscHJldk1heHx8MCkpfXU9dn0pfSk7cmV0dXJuIGJsb2NrR3JhcGh9ZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZyx4c3Mpe3JldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksZnVuY3Rpb24oeHMpe3ZhciBtYXg9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO3ZhciBtaW49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO18uZm9ySW4oeHMsZnVuY3Rpb24oeCx2KXt2YXIgaGFsZldpZHRoPXdpZHRoKGcsdikvMjttYXg9TWF0aC5tYXgoeCtoYWxmV2lkdGgsbWF4KTttaW49TWF0aC5taW4oeC1oYWxmV2lkdGgsbWluKX0pO3JldHVybiBtYXgtbWlufSl9ZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsYWxpZ25Ubyl7dmFyIGFsaWduVG9WYWxzPV8udmFsdWVzKGFsaWduVG8pLGFsaWduVG9NaW49Cl8ubWluKGFsaWduVG9WYWxzKSxhbGlnblRvTWF4PV8ubWF4KGFsaWduVG9WYWxzKTtfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope3ZhciBhbGlnbm1lbnQ9dmVydCtob3Jpeix4cz14c3NbYWxpZ25tZW50XSxkZWx0YTtpZih4cz09PWFsaWduVG8pcmV0dXJuO3ZhciB4c1ZhbHM9Xy52YWx1ZXMoeHMpO2RlbHRhPWhvcml6PT09ImwiP2FsaWduVG9NaW4tXy5taW4oeHNWYWxzKTphbGlnblRvTWF4LV8ubWF4KHhzVmFscyk7aWYoZGVsdGEpeHNzW2FsaWdubWVudF09Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuIHgrZGVsdGF9KX0pfSl9ZnVuY3Rpb24gYmFsYW5jZSh4c3MsYWxpZ24pe3JldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsZnVuY3Rpb24oaWdub3JlLHYpe2lmKGFsaWduKXJldHVybiB4c3NbYWxpZ24udG9Mb3dlckNhc2UoKV1bdl07ZWxzZXt2YXIgeHM9Xy5zb3J0QnkoXy5tYXAoeHNzLAp2KSk7cmV0dXJuKHhzWzFdK3hzWzJdKS8yfX0pfWZ1bmN0aW9uIHBvc2l0aW9uWChnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLGNvbmZsaWN0cz1fLm1lcmdlKGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKSxmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZykpO3ZhciB4c3M9e30sYWRqdXN0ZWRMYXllcmluZztfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe2FkanVzdGVkTGF5ZXJpbmc9dmVydD09PSJ1Ij9sYXllcmluZzpfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope2lmKGhvcml6PT09InIiKWFkanVzdGVkTGF5ZXJpbmc9Xy5tYXAoYWRqdXN0ZWRMYXllcmluZyxmdW5jdGlvbihpbm5lcil7cmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCl9KTt2YXIgbmVpZ2hib3JGbj1fLmJpbmQodmVydD09PSJ1Ij9nLnByZWRlY2Vzc29yczpnLnN1Y2Nlc3NvcnMsCmcpO3ZhciBhbGlnbj12ZXJ0aWNhbEFsaWdubWVudChnLGFkanVzdGVkTGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pO3ZhciB4cz1ob3Jpem9udGFsQ29tcGFjdGlvbihnLGFkanVzdGVkTGF5ZXJpbmcsYWxpZ24ucm9vdCxhbGlnbi5hbGlnbixob3Jpej09PSJyIik7aWYoaG9yaXo9PT0iciIpeHM9Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuLXh9KTt4c3NbdmVydCtob3Jpel09eHN9KX0pO3ZhciBzbWFsbGVzdFdpZHRoPWZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKTthbGlnbkNvb3JkaW5hdGVzKHhzcyxzbWFsbGVzdFdpZHRoKTtyZXR1cm4gYmFsYW5jZSh4c3MsZy5ncmFwaCgpLmFsaWduKX1mdW5jdGlvbiBzZXAobm9kZVNlcCxlZGdlU2VwLHJldmVyc2VTZXApe3JldHVybiBmdW5jdGlvbihnLHYsdyl7dmFyIHZMYWJlbD1nLm5vZGUodiksd0xhYmVsPWcubm9kZSh3KSxzdW09MCxkZWx0YTtzdW0rPXZMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHZMYWJlbCwKImxhYmVscG9zIikpc3dpdGNoKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT0tdkxhYmVsLndpZHRoLzI7YnJlYWs7Y2FzZSAiciI6ZGVsdGE9dkxhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3N1bSs9KHZMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz0od0xhYmVsLmR1bW15P2VkZ2VTZXA6bm9kZVNlcCkvMjtzdW0rPXdMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHdMYWJlbCwibGFiZWxwb3MiKSlzd2l0Y2god0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpe2Nhc2UgImwiOmRlbHRhPXdMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPS13TGFiZWwud2lkdGgvMjticmVha31pZihkZWx0YSlzdW0rPXJldmVyc2VTZXA/ZGVsdGE6LWRlbHRhO2RlbHRhPTA7cmV0dXJuIHN1bX19ZnVuY3Rpb24gd2lkdGgoZyx2KXtyZXR1cm4gZy5ub2RlKHYpLndpZHRofQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpLHBvc2l0aW9uWD1yZXF1aXJlKCIuL2JrIikucG9zaXRpb25YO21vZHVsZS5leHBvcnRzPXBvc2l0aW9uO2Z1bmN0aW9uIHBvc2l0aW9uKGcpe2c9dXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZyk7cG9zaXRpb25ZKGcpO18uZm9yRWFjaChwb3NpdGlvblgoZyksZnVuY3Rpb24oeCx2KXtnLm5vZGUodikueD14fSl9ZnVuY3Rpb24gcG9zaXRpb25ZKGcpe3ZhciBsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZykscmFua1NlcD1nLmdyYXBoKCkucmFua3NlcCxwcmV2WT0wO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIG1heEhlaWdodD1fLm1heChfLm1hcChsYXllcixmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLmhlaWdodH0pKTsKXy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS55PXByZXZZK21heEhlaWdodC8yfSk7cHJldlkrPW1heEhlaWdodCtyYW5rU2VwfSl9fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2JrIjoyM31dLDI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrO21vZHVsZS5leHBvcnRzPWZlYXNpYmxlVHJlZTtmdW5jdGlvbiBmZWFzaWJsZVRyZWUoZyl7dmFyIHQ9bmV3IEdyYXBoKHtkaXJlY3RlZDpmYWxzZX0pO3ZhciBzdGFydD1nLm5vZGVzKClbMF0sc2l6ZT1nLm5vZGVDb3VudCgpO3Quc2V0Tm9kZShzdGFydCx7fSk7dmFyIGVkZ2UsZGVsdGE7d2hpbGUodGlnaHRUcmVlKHQsZyk8c2l6ZSl7ZWRnZT1maW5kTWluU2xhY2tFZGdlKHQsZyk7ZGVsdGE9dC5oYXNOb2RlKGVkZ2Uudik/CnNsYWNrKGcsZWRnZSk6LXNsYWNrKGcsZWRnZSk7c2hpZnRSYW5rcyh0LGcsZGVsdGEpfXJldHVybiB0fWZ1bmN0aW9uIHRpZ2h0VHJlZSh0LGcpe2Z1bmN0aW9uIGRmcyh2KXtfLmZvckVhY2goZy5ub2RlRWRnZXModiksZnVuY3Rpb24oZSl7dmFyIGVkZ2VWPWUudix3PXY9PT1lZGdlVj9lLnc6ZWRnZVY7aWYoIXQuaGFzTm9kZSh3KSYmIXNsYWNrKGcsZSkpe3Quc2V0Tm9kZSh3LHt9KTt0LnNldEVkZ2Uodix3LHt9KTtkZnModyl9fSl9Xy5mb3JFYWNoKHQubm9kZXMoKSxkZnMpO3JldHVybiB0Lm5vZGVDb3VudCgpfWZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCxnKXtyZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksZnVuY3Rpb24oZSl7aWYodC5oYXNOb2RlKGUudikhPT10Lmhhc05vZGUoZS53KSlyZXR1cm4gc2xhY2soZyxlKX0pfWZ1bmN0aW9uIHNoaWZ0UmFua3ModCxnLGRlbHRhKXtfLmZvckVhY2godC5ub2RlcygpLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjh9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHJhbmtVdGlsPXJlcXVpcmUoIi4vdXRpbCIpLGxvbmdlc3RQYXRoPXJhbmtVdGlsLmxvbmdlc3RQYXRoLGZlYXNpYmxlVHJlZT1yZXF1aXJlKCIuL2ZlYXNpYmxlLXRyZWUiKSxuZXR3b3JrU2ltcGxleD1yZXF1aXJlKCIuL25ldHdvcmstc2ltcGxleCIpO21vZHVsZS5leHBvcnRzPXJhbms7ZnVuY3Rpb24gcmFuayhnKXtzd2l0Y2goZy5ncmFwaCgpLnJhbmtlcil7Y2FzZSAibmV0d29yay1zaW1wbGV4IjpuZXR3b3JrU2ltcGxleFJhbmtlcihnKTticmVhaztjYXNlICJ0aWdodC10cmVlIjp0aWdodFRyZWVSYW5rZXIoZyk7YnJlYWs7Y2FzZSAibG9uZ2VzdC1wYXRoIjpsb25nZXN0UGF0aFJhbmtlcihnKTticmVhaztkZWZhdWx0Om5ldHdvcmtTaW1wbGV4UmFua2VyKGcpfX12YXIgbG9uZ2VzdFBhdGhSYW5rZXI9bG9uZ2VzdFBhdGg7CmZ1bmN0aW9uIHRpZ2h0VHJlZVJhbmtlcihnKXtsb25nZXN0UGF0aChnKTtmZWFzaWJsZVRyZWUoZyl9ZnVuY3Rpb24gbmV0d29ya1NpbXBsZXhSYW5rZXIoZyl7bmV0d29ya1NpbXBsZXgoZyl9fSx7Ii4vZmVhc2libGUtdHJlZSI6MjUsIi4vbmV0d29yay1zaW1wbGV4IjoyNywiLi91dGlsIjoyOH1dLDI3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksc2xhY2s9cmVxdWlyZSgiLi91dGlsIikuc2xhY2ssaW5pdFJhbms9cmVxdWlyZSgiLi91dGlsIikubG9uZ2VzdFBhdGgscHJlb3JkZXI9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5hbGcucHJlb3JkZXIscG9zdG9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnBvc3RvcmRlcixzaW1wbGlmeT1yZXF1aXJlKCIuLi91dGlsIikuc2ltcGxpZnk7bW9kdWxlLmV4cG9ydHM9bmV0d29ya1NpbXBsZXg7Cm5ldHdvcmtTaW1wbGV4LmluaXRMb3dMaW1WYWx1ZXM9aW5pdExvd0xpbVZhbHVlcztuZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzPWluaXRDdXRWYWx1ZXM7bmV0d29ya1NpbXBsZXguY2FsY0N1dFZhbHVlPWNhbGNDdXRWYWx1ZTtuZXR3b3JrU2ltcGxleC5sZWF2ZUVkZ2U9bGVhdmVFZGdlO25ldHdvcmtTaW1wbGV4LmVudGVyRWRnZT1lbnRlckVkZ2U7bmV0d29ya1NpbXBsZXguZXhjaGFuZ2VFZGdlcz1leGNoYW5nZUVkZ2VzO2Z1bmN0aW9uIG5ldHdvcmtTaW1wbGV4KGcpe2c9c2ltcGxpZnkoZyk7aW5pdFJhbmsoZyk7dmFyIHQ9ZmVhc2libGVUcmVlKGcpO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3ZhciBlLGY7d2hpbGUoZT1sZWF2ZUVkZ2UodCkpe2Y9ZW50ZXJFZGdlKHQsZyxlKTtleGNoYW5nZUVkZ2VzKHQsZyxlLGYpfX1mdW5jdGlvbiBpbml0Q3V0VmFsdWVzKHQsZyl7dmFyIHZzPXBvc3RvcmRlcih0LHQubm9kZXMoKSk7dnM9dnMuc2xpY2UoMCwKdnMubGVuZ3RoLTEpO18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXthc3NpZ25DdXRWYWx1ZSh0LGcsdil9KX1mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQ7dC5lZGdlKGNoaWxkLHBhcmVudCkuY3V0dmFsdWU9Y2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl9ZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl7dmFyIGNoaWxkTGFiPXQubm9kZShjaGlsZCkscGFyZW50PWNoaWxkTGFiLnBhcmVudCxjaGlsZElzVGFpbD10cnVlLGdyYXBoRWRnZT1nLmVkZ2UoY2hpbGQscGFyZW50KSxjdXRWYWx1ZT0wO2lmKCFncmFwaEVkZ2Upe2NoaWxkSXNUYWlsPWZhbHNlO2dyYXBoRWRnZT1nLmVkZ2UocGFyZW50LGNoaWxkKX1jdXRWYWx1ZT1ncmFwaEVkZ2Uud2VpZ2h0O18uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksZnVuY3Rpb24oZSl7dmFyIGlzT3V0RWRnZT1lLnY9PT1jaGlsZCxvdGhlcj0KaXNPdXRFZGdlP2UudzplLnY7aWYob3RoZXIhPT1wYXJlbnQpe3ZhciBwb2ludHNUb0hlYWQ9aXNPdXRFZGdlPT09Y2hpbGRJc1RhaWwsb3RoZXJXZWlnaHQ9Zy5lZGdlKGUpLndlaWdodDtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkP290aGVyV2VpZ2h0Oi1vdGhlcldlaWdodDtpZihpc1RyZWVFZGdlKHQsY2hpbGQsb3RoZXIpKXt2YXIgb3RoZXJDdXRWYWx1ZT10LmVkZ2UoY2hpbGQsb3RoZXIpLmN1dHZhbHVlO2N1dFZhbHVlKz1wb2ludHNUb0hlYWQ/LW90aGVyQ3V0VmFsdWU6b3RoZXJDdXRWYWx1ZX19fSk7cmV0dXJuIGN1dFZhbHVlfWZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSxyb290KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpcm9vdD10cmVlLm5vZGVzKClbMF07ZGZzQXNzaWduTG93TGltKHRyZWUse30sMSxyb290KX1mdW5jdGlvbiBkZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdixwYXJlbnQpe3ZhciBsb3c9bmV4dExpbSxsYWJlbD10cmVlLm5vZGUodik7CnZpc2l0ZWRbdl09dHJ1ZTtfLmZvckVhY2godHJlZS5uZWlnaGJvcnModiksZnVuY3Rpb24odyl7aWYoIV8uaGFzKHZpc2l0ZWQsdykpbmV4dExpbT1kZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdyx2KX0pO2xhYmVsLmxvdz1sb3c7bGFiZWwubGltPW5leHRMaW0rKztpZihwYXJlbnQpbGFiZWwucGFyZW50PXBhcmVudDtlbHNlIGRlbGV0ZSBsYWJlbC5wYXJlbnQ7cmV0dXJuIG5leHRMaW19ZnVuY3Rpb24gbGVhdmVFZGdlKHRyZWUpe3JldHVybiBfLmZpbmQodHJlZS5lZGdlcygpLGZ1bmN0aW9uKGUpe3JldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWU8MH0pfWZ1bmN0aW9uIGVudGVyRWRnZSh0LGcsZWRnZSl7dmFyIHY9ZWRnZS52LHc9ZWRnZS53O2lmKCFnLmhhc0VkZ2Uodix3KSl7dj1lZGdlLnc7dz1lZGdlLnZ9dmFyIHZMYWJlbD10Lm5vZGUodiksd0xhYmVsPXQubm9kZSh3KSx0YWlsTGFiZWw9dkxhYmVsLGZsaXA9ZmFsc2U7aWYodkxhYmVsLmxpbT53TGFiZWwubGltKXt0YWlsTGFiZWw9CndMYWJlbDtmbGlwPXRydWV9dmFyIGNhbmRpZGF0ZXM9Xy5maWx0ZXIoZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBmbGlwPT09aXNEZXNjZW5kYW50KHQsdC5ub2RlKGVkZ2UudiksdGFpbExhYmVsKSYmZmxpcCE9PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLncpLHRhaWxMYWJlbCl9KTtyZXR1cm4gXy5taW5CeShjYW5kaWRhdGVzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBzbGFjayhnLGVkZ2UpfSl9ZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKXt2YXIgdj1lLnYsdz1lLnc7dC5yZW1vdmVFZGdlKHYsdyk7dC5zZXRFZGdlKGYudixmLncse30pO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3VwZGF0ZVJhbmtzKHQsZyl9ZnVuY3Rpb24gdXBkYXRlUmFua3ModCxnKXt2YXIgcm9vdD1fLmZpbmQodC5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiFnLm5vZGUodikucGFyZW50fSksdnM9cHJlb3JkZXIodCxyb290KTt2cz12cy5zbGljZSgxKTsKXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe3ZhciBwYXJlbnQ9dC5ub2RlKHYpLnBhcmVudCxlZGdlPWcuZWRnZSh2LHBhcmVudCksZmxpcHBlZD1mYWxzZTtpZighZWRnZSl7ZWRnZT1nLmVkZ2UocGFyZW50LHYpO2ZsaXBwZWQ9dHJ1ZX1nLm5vZGUodikucmFuaz1nLm5vZGUocGFyZW50KS5yYW5rKyhmbGlwcGVkP2VkZ2UubWlubGVuOi1lZGdlLm1pbmxlbil9KX1mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsdSx2KXtyZXR1cm4gdHJlZS5oYXNFZGdlKHUsdil9ZnVuY3Rpb24gaXNEZXNjZW5kYW50KHRyZWUsdkxhYmVsLHJvb3RMYWJlbCl7cmV0dXJuIHJvb3RMYWJlbC5sb3c8PXZMYWJlbC5saW0mJnZMYWJlbC5saW08PXJvb3RMYWJlbC5saW19fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9mZWFzaWJsZS10cmVlIjoyNSwiLi91dGlsIjoyOH1dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTsKbW9kdWxlLmV4cG9ydHM9e2xvbmdlc3RQYXRoOmxvbmdlc3RQYXRoLHNsYWNrOnNsYWNrfTtmdW5jdGlvbiBsb25nZXN0UGF0aChnKXt2YXIgdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7dmFyIGxhYmVsPWcubm9kZSh2KTtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybiBsYWJlbC5yYW5rO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgcmFuaz1fLm1pbkJ5KF8ubWFwKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7cmV0dXJuIGRmcyhlLncpLWcuZWRnZShlKS5taW5sZW59KSk7aWYocmFuaz09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWXx8cmFuaz09PXVuZGVmaW5lZHx8cmFuaz09PW51bGwpcmFuaz0wO3JldHVybiBsYWJlbC5yYW5rPXJhbmt9Xy5mb3JFYWNoKGcuc291cmNlcygpLGRmcyl9ZnVuY3Rpb24gc2xhY2soZyxlKXtyZXR1cm4gZy5ub2RlKGUudykucmFuay1nLm5vZGUoZS52KS5yYW5rLWcuZWRnZShlKS5taW5sZW59fSx7Ii4uL2xvZGFzaCI6MTB9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXthZGREdW1teU5vZGU6YWRkRHVtbXlOb2RlLHNpbXBsaWZ5OnNpbXBsaWZ5LGFzTm9uQ29tcG91bmRHcmFwaDphc05vbkNvbXBvdW5kR3JhcGgsc3VjY2Vzc29yV2VpZ2h0czpzdWNjZXNzb3JXZWlnaHRzLHByZWRlY2Vzc29yV2VpZ2h0czpwcmVkZWNlc3NvcldlaWdodHMsaW50ZXJzZWN0UmVjdDppbnRlcnNlY3RSZWN0LGJ1aWxkTGF5ZXJNYXRyaXg6YnVpbGRMYXllck1hdHJpeCxub3JtYWxpemVSYW5rczpub3JtYWxpemVSYW5rcyxyZW1vdmVFbXB0eVJhbmtzOnJlbW92ZUVtcHR5UmFua3MsYWRkQm9yZGVyTm9kZTphZGRCb3JkZXJOb2RlLG1heFJhbms6bWF4UmFuayxwYXJ0aXRpb246cGFydGl0aW9uLHRpbWU6dGltZSxub3RpbWU6bm90aW1lfTtmdW5jdGlvbiBhZGREdW1teU5vZGUoZyx0eXBlLGF0dHJzLG5hbWUpe3ZhciB2OwpkbyB2PV8udW5pcXVlSWQobmFtZSk7d2hpbGUoZy5oYXNOb2RlKHYpKTthdHRycy5kdW1teT10eXBlO2cuc2V0Tm9kZSh2LGF0dHJzKTtyZXR1cm4gdn1mdW5jdGlvbiBzaW1wbGlmeShnKXt2YXIgc2ltcGxpZmllZD0obmV3IEdyYXBoKS5zZXRHcmFwaChnLmdyYXBoKCkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHNpbXBsZUxhYmVsPXNpbXBsaWZpZWQuZWRnZShlLnYsZS53KXx8e3dlaWdodDowLG1pbmxlbjoxfSxsYWJlbD1nLmVkZ2UoZSk7c2ltcGxpZmllZC5zZXRFZGdlKGUudixlLncse3dlaWdodDpzaW1wbGVMYWJlbC53ZWlnaHQrbGFiZWwud2VpZ2h0LG1pbmxlbjpNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sbGFiZWwubWlubGVuKX0pfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gYXNOb25Db21wb3VuZEdyYXBoKGcpe3ZhciBzaW1wbGlmaWVkPQoobmV3IEdyYXBoKHttdWx0aWdyYXBoOmcuaXNNdWx0aWdyYXBoKCl9KSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKCFnLmNoaWxkcmVuKHYpLmxlbmd0aClzaW1wbGlmaWVkLnNldE5vZGUodixnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzaW1wbGlmaWVkLnNldEVkZ2UoZSxnLmVkZ2UoZSkpfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gc3VjY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgc3Vjcz17fTtfLmZvckVhY2goZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtzdWNzW2Uud109KHN1Y3NbZS53XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBzdWNzfSk7cmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSx3ZWlnaHRNYXApfWZ1bmN0aW9uIHByZWRlY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSwKZnVuY3Rpb24odil7dmFyIHByZWRzPXt9O18uZm9yRWFjaChnLmluRWRnZXModiksZnVuY3Rpb24oZSl7cHJlZHNbZS52XT0ocHJlZHNbZS52XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBwcmVkc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QscG9pbnQpe3ZhciB4PXJlY3QueDt2YXIgeT1yZWN0Lnk7dmFyIGR4PXBvaW50LngteDt2YXIgZHk9cG9pbnQueS15O3ZhciB3PXJlY3Qud2lkdGgvMjt2YXIgaD1yZWN0LmhlaWdodC8yO2lmKCFkeCYmIWR5KXRocm93IG5ldyBFcnJvcigiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIik7dmFyIHN4LHN5O2lmKE1hdGguYWJzKGR5KSp3Pk1hdGguYWJzKGR4KSpoKXtpZihkeTwwKWg9LWg7c3g9aCpkeC9keTtzeT1ofWVsc2V7aWYoZHg8MCl3PS13O3N4PXc7c3k9dypkeS9keH1yZXR1cm57eDp4KwpzeCx5Onkrc3l9fWZ1bmN0aW9uIGJ1aWxkTGF5ZXJNYXRyaXgoZyl7dmFyIGxheWVyaW5nPV8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSsxKSxmdW5jdGlvbigpe3JldHVybltdfSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodikscmFuaz1ub2RlLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl09dn0pO3JldHVybiBsYXllcmluZ31mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKXt2YXIgbWluPV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihfLmhhcyhub2RlLCJyYW5rIikpbm9kZS5yYW5rLT1taW59KX1mdW5jdGlvbiByZW1vdmVFbXB0eVJhbmtzKGcpe3ZhciBvZmZzZXQ9Xy5taW5CeShfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpOwp2YXIgbGF5ZXJzPVtdO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbmstb2Zmc2V0O2lmKCFsYXllcnNbcmFua10pbGF5ZXJzW3JhbmtdPVtdO2xheWVyc1tyYW5rXS5wdXNoKHYpfSk7dmFyIGRlbHRhPTAsbm9kZVJhbmtGYWN0b3I9Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO18uZm9yRWFjaChsYXllcnMsZnVuY3Rpb24odnMsaSl7aWYoXy5pc1VuZGVmaW5lZCh2cykmJmklbm9kZVJhbmtGYWN0b3IhPT0wKS0tZGVsdGE7ZWxzZSBpZihkZWx0YSlfLmZvckVhY2godnMsZnVuY3Rpb24odil7Zy5ub2RlKHYpLnJhbmsrPWRlbHRhfSl9KX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJlZml4LHJhbmssb3JkZXIpe3ZhciBub2RlPXt3aWR0aDowLGhlaWdodDowfTtpZihhcmd1bWVudHMubGVuZ3RoPj00KXtub2RlLnJhbms9cmFuaztub2RlLm9yZGVyPW9yZGVyfXJldHVybiBhZGREdW1teU5vZGUoZywiYm9yZGVyIixub2RlLHByZWZpeCl9CmZ1bmN0aW9uIG1heFJhbmsoZyl7cmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgcmFuaz1nLm5vZGUodikucmFuaztpZighXy5pc1VuZGVmaW5lZChyYW5rKSlyZXR1cm4gcmFua30pKX1mdW5jdGlvbiBwYXJ0aXRpb24oY29sbGVjdGlvbixmbil7dmFyIHJlc3VsdD17bGhzOltdLHJoczpbXX07Xy5mb3JFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUpe2lmKGZuKHZhbHVlKSlyZXN1bHQubGhzLnB1c2godmFsdWUpO2Vsc2UgcmVzdWx0LnJocy5wdXNoKHZhbHVlKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdGltZShuYW1lLGZuKXt2YXIgc3RhcnQ9Xy5ub3coKTt0cnl7cmV0dXJuIGZuKCl9ZmluYWxseXtjb25zb2xlLmxvZyhuYW1lKyIgdGltZTogIisoXy5ub3coKS1zdGFydCkrIm1zIil9fWZ1bmN0aW9uIG5vdGltZShuYW1lLGZuKXtyZXR1cm4gZm4oKX19LHsiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sMzA6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMC44LjIifSx7fV19LHt9LFsxXSkoMSl9KTsKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9hbm5vdGF0aW9uLmpzCnZhciB0ZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsocSl7cmV0dXJuKGQucmVuZGVyLkFubm90YXRpb25UeXBlW3FdfHwiIikudG9Mb3dlckNhc2UoKXx8bnVsbH1mdW5jdGlvbiB0KHEsdSl7dS5hbm5vdGF0aW9uVHlwZT09PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlk/Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInVzZSIpLmF0dHIoImNsYXNzIiwic3VtbWFyeSIpLmF0dHIoInhsaW5rOmhyZWYiLCIjc3VtbWFyeS1pY29uIikuYXR0cigiY3Vyc29yIiwicG9pbnRlciIpOihxPWYubm9kZS5idWlsZFNoYXBlKHEsdSxmLkNsYXNzLkFubm90YXRpb24uTk9ERSksZi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInRpdGxlIikudGV4dCh1Lm5vZGUubmFtZSkpfWZ1bmN0aW9uIGwocSx1KXtsZXQgeD11Lm5vZGUubmFtZS5zcGxpdCgiLyIpO3JldHVybiBwKHEseFt4Lmxlbmd0aC0xXSx1LG51bGwpfWZ1bmN0aW9uIHAocSx1LAp4LEEpe2xldCB5PWYuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTDtBJiYoeSs9IiAiK0EpO3E9cS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIseSkuYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIix4LmlzSW4/ImVuZCI6InN0YXJ0IikudGV4dCh1KTtyZXR1cm4gYi5ncmFwaC5zY2VuZS5ub2RlLmVuZm9yY2VMYWJlbFdpZHRoKHEsLTEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7cS5vbigibW91c2VvdmVyIix5PT57QS5maXJlKCJhbm5vdGF0aW9uLWhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIseT0+e0EuZmlyZSgiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJjbGljayIseT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0EuZmlyZSgiYW5ub3RhdGlvbi1zZWxlY3QiLHtuYW1lOnkubm9kZS5uYW1lLGhvc3ROYW1lOnUubm9kZS5uYW1lfSl9KTsKaWYoeC5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlkmJnguYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5DT05TVEFOVClxLm9uKCJjb250ZXh0bWVudSIsZi5jb250ZXh0bWVudS5nZXRNZW51KEEsZi5ub2RlLmdldENvbnRleHRNZW51KHgubm9kZSxBKSkpfWZ1bmN0aW9uIG4ocSx1LHgsQSl7bGV0IHk9ZC5sYXlvdXQuY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZSh1KTt4LnJlbmRlck5vZGVJbmZvJiZ4LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJmYubm9kZS5zdHlsaXplKHEseC5yZW5kZXJOb2RlSW5mbyxBLGYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKTt4LmFubm90YXRpb25UeXBlPT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWSYmKHgud2lkdGgrPTEwKTtxLnNlbGVjdCgidGV4dC4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTCkudHJhbnNpdGlvbigpLmF0dHIoIngiLAp5K3guZHgrKHguaXNJbj8tMToxKSooeC53aWR0aC8yK3gubGFiZWxPZmZzZXQpKS5hdHRyKCJ5Iix1LnkreC5keSk7cS5zZWxlY3QoInVzZS5zdW1tYXJ5IikudHJhbnNpdGlvbigpLmF0dHIoIngiLHkreC5keC0zKS5hdHRyKCJ5Iix1LnkreC5keS02KTtmLnBvc2l0aW9uRWxsaXBzZShxLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiBlbGxpcHNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO2YucG9zaXRpb25SZWN0KHEuc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIHJlY3QiKSx5K3guZHgsdS55K3guZHkseC53aWR0aCx4LmhlaWdodCk7Zi5wb3NpdGlvblJlY3QocS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgdXNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO3Euc2VsZWN0KCJwYXRoLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UpLnRyYW5zaXRpb24oKS5hdHRyKCJkIix3PT4Ke3c9dy5wb2ludHMubWFwKEM9Pih7eDpDLmR4K3kseTpDLmR5K3UueX0pKTtyZXR1cm4gZi5lZGdlLmludGVycG9sYXRlKHcpfSl9aC5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe3E9cS5zZWxlY3RBbGwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkuZGF0YSh1Lmxpc3QseT0+eS5ub2RlLm5hbWUpO3EuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJkYXRhLW5hbWUiLHk9Pnkubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLmFkZEFubm90YXRpb25Hcm91cCh5LHgsdyk7bGV0IEM9Zi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UsRz15LnJlbmRlck1ldGFlZGdlSW5mbyYmeS5yZW5kZXJNZXRhZWRnZUluZm8ubWV0YWVkZ2U7RyYmIUcubnVtUmVndWxhckVkZ2VzJiYoQys9IiAiK2YuQ2xhc3MuQW5ub3RhdGlvbi5DT05UUk9MX0VER0UpO0cmJkcubnVtUmVmRWRnZXMmJihDKz0iICIrZi5DbGFzcy5FZGdlLlJFRl9MSU5FKTsKZi5lZGdlLmFwcGVuZEVkZ2Uodyx5LEEsQyk7eS5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTPyhsKHcseSksdCh3LHkpKTpwKHcseS5ub2RlLm5hbWUseSxmLkNsYXNzLkFubm90YXRpb24uRUxMSVBTSVMpfSkubWVyZ2UocSkuYXR0cigiY2xhc3MiLHk9PmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCsiICIrayh5LmFubm90YXRpb25UeXBlKSsiICIrZi5ub2RlLm5vZGVDbGFzcyh5KSkuZWFjaChmdW5jdGlvbih5KXtsZXQgdz1kMy5zZWxlY3QodGhpcyk7bih3LHgseSxBKTt5LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJm0odyx4LHksQSl9KTtxLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLnJlbW92ZUFubm90YXRpb25Hcm91cCh5LHgsdyl9KS5yZW1vdmUoKTtyZXR1cm4gcX19KShmLmFubm90YXRpb258fChmLmFubm90YXRpb249e30pKX0pKGQuc2NlbmV8fAooZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29sb3JzLmpzCihmdW5jdGlvbihiKXtiLkNPTE9SUz1be25hbWU6Ikdvb2dsZSBCbHVlIixjb2xvcjoiIzQxODRmMyIsYWN0aXZlOiIjM2E1M2M1IixkaXNhYmxlZDoiI2NhZDhmYyJ9LHtuYW1lOiJHb29nbGUgUmVkIixjb2xvcjoiI2RiNDQzNyIsYWN0aXZlOiIjOGYyYTBjIixkaXNhYmxlZDoiI2U4YzZjMSJ9LHtuYW1lOiJHb29nbGUgWWVsbG93Iixjb2xvcjoiI2Y0YjQwMCIsYWN0aXZlOiIjZGI5MjAwIixkaXNhYmxlZDoiI2Y3ZThiMCJ9LHtuYW1lOiJHb29nbGUgR3JlZW4iLGNvbG9yOiIjMGY5ZDU4IixhY3RpdmU6IiM0ODgwNDYiLGRpc2FibGVkOiIjYzJlMWNjIn0se25hbWU6IlB1cnBsZSIsY29sb3I6IiNhYTQ2YmIiLGFjdGl2ZToiIzVjMTM5OCIsZGlzYWJsZWQ6IiNkN2JjZTYifSx7bmFtZToiVGVhbCIsY29sb3I6IiMwMGFiYzAiLGFjdGl2ZToiIzQ3ODI4ZSIsZGlzYWJsZWQ6IiNjMmVhZjIifSx7bmFtZToiRGVlcCBPcmFuZ2UiLGNvbG9yOiIjZmY2ZjQyIixhY3RpdmU6IiNjYTRhMDYiLApkaXNhYmxlZDoiI2YyY2JiYSJ9LHtuYW1lOiJMaW1lIixjb2xvcjoiIzlkOWMyMyIsYWN0aXZlOiIjN2Y3NzFkIixkaXNhYmxlZDoiI2YxZjRjMiJ9LHtuYW1lOiJJbmRpZ28iLGNvbG9yOiIjNWI2YWJmIixhY3RpdmU6IiMzZTQ3YTkiLGRpc2FibGVkOiIjYzVjOGU4In0se25hbWU6IlBpbmsiLGNvbG9yOiIjZWY2MTkxIixhY3RpdmU6IiNjYTFjNjAiLGRpc2FibGVkOiIjZTliOWNlIn0se25hbWU6IkRlZXAgVGVhbCIsY29sb3I6IiMwMDc4NmEiLGFjdGl2ZToiIzJiNGY0MyIsZGlzYWJsZWQ6IiNiZWRlZGEifSx7bmFtZToiRGVlcCBQaW5rIixjb2xvcjoiI2MxMTc1YSIsYWN0aXZlOiIjNzUwODRmIixkaXNhYmxlZDoiI2RlOGNhZSJ9LHtuYW1lOiJHcmF5Iixjb2xvcjoiIzlFOUU5RSIsYWN0aXZlOiIjNDI0MjQyIixkaXNhYmxlZDoiRjVGNUY1In1dLnJlZHVjZSgoZCxmKT0+e2RbZi5uYW1lXT1mO3JldHVybiBkfSx7fSk7Yi5PUF9HUk9VUF9DT0xPUlM9W3tjb2xvcjoiR29vZ2xlIFJlZCIsCmdyb3VwczoiZ2VuX2xlZ2FjeV9vcHMgbGVnYWN5X29wcyBsZWdhY3lfZmxvZ3NfaW5wdXQgbGVnYWN5X2ltYWdlX2lucHV0IGxlZ2FjeV9pbnB1dF9leGFtcGxlX2lucHV0IGxlZ2FjeV9zZXF1ZW5jZV9pbnB1dCBsZWdhY3lfc2V0aV9pbnB1dF9pbnB1dCIuc3BsaXQoIiAiKX0se2NvbG9yOiJEZWVwIE9yYW5nZSIsZ3JvdXBzOlsiY29uc3RhbnRfb3BzIl19LHtjb2xvcjoiSW5kaWdvIixncm91cHM6WyJzdGF0ZV9vcHMiXX0se2NvbG9yOiJQdXJwbGUiLGdyb3VwczpbIm5uX29wcyIsIm5uIl19LHtjb2xvcjoiR29vZ2xlIEdyZWVuIixncm91cHM6WyJtYXRoX29wcyJdfSx7Y29sb3I6IkxpbWUiLGdyb3VwczpbImFycmF5X29wcyJdfSx7Y29sb3I6IlRlYWwiLGdyb3VwczpbImNvbnRyb2xfZmxvd19vcHMiLCJkYXRhX2Zsb3dfb3BzIl19LHtjb2xvcjoiUGluayIsZ3JvdXBzOlsic3VtbWFyeV9vcHMiXX0se2NvbG9yOiJEZWVwIFBpbmsiLGdyb3VwczpbImlvX29wcyJdfV0ucmVkdWNlKChkLApmKT0+e2YuZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24oaCl7ZFtoXT1mLmNvbG9yfSk7cmV0dXJuIGR9LHt9KX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29tbW9uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuT1BfR1JBUEg9Im9wX2dyYXBoIjtmLkNPTkNFUFRVQUxfR1JBUEg9ImNvbmNlcHR1YWxfZ3JhcGgiO2YuUFJPRklMRT0icHJvZmlsZSJ9KShkLlNlbGVjdGlvblR5cGV8fChkLlNlbGVjdGlvblR5cGU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbnRleHRtZW51LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKHQpe2xldCBsPTAscD0wO2Zvcig7dCYmMDw9dC5vZmZzZXRMZWZ0JiYwPD10Lm9mZnNldFRvcDspbCs9dC5vZmZzZXRMZWZ0LXQuc2Nyb2xsTGVmdCxwKz10Lm9mZnNldFRvcC10LnNjcm9sbFRvcCx0PXQub2Zmc2V0UGFyZW50O3JldHVybntsZWZ0OmwsdG9wOnB9fWguZ2V0TWVudT1mdW5jdGlvbih0LGwpe2NvbnN0IHA9dC5nZXRDb250ZXh0TWVudSgpLG09ZDMuc2VsZWN0KHQuZ2V0Q29udGV4dE1lbnUoKSk7cmV0dXJuIGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh5KXt5JiZ5LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKHApfHwobS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSx7Y2FwdHVyZTohMH0pKX1sZXQgeD1kMy5ldmVudDtjb25zdCBBPWsodCk7bS5zdHlsZSgiZGlzcGxheSIsImJsb2NrIikuc3R5bGUoImxlZnQiLAp4LmNsaWVudFgtQS5sZWZ0KzErInB4Iikuc3R5bGUoInRvcCIseC5jbGllbnRZLUEudG9wKzErInB4Iik7eC5wcmV2ZW50RGVmYXVsdCgpO3guc3RvcFByb3BhZ2F0aW9uKCk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHUse2NhcHR1cmU6ITB9KTttLmh0bWwoIiIpO20uYXBwZW5kKCJ1bCIpLnNlbGVjdEFsbCgibGkiKS5kYXRhKGwpLmVudGVyKCkuYXBwZW5kKCJsaSIpLm9uKCJjbGljayIseT0+e3kuYWN0aW9uKHRoaXMsbixxKTt1KCl9KS5odG1sKGZ1bmN0aW9uKHkpe3JldHVybiB5LnRpdGxlKG4pfSl9fX0pKGYuY29udGV4dG1lbnV8fChmLmNvbnRleHRtZW51PXt9KSl9KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZWRnZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayh5KXtyZXR1cm4geS52K2QuRURHRV9LRVlfREVMSU0reS53fWZ1bmN0aW9uIHQoeSx3KXt3PXcuZ2V0Tm9kZUJ5TmFtZSh5LnYpO2lmKG51bGw9PXcub3V0cHV0U2hhcGVzfHxfLmlzRW1wdHkody5vdXRwdXRTaGFwZXMpKXJldHVybiBudWxsO3k9dy5vdXRwdXRTaGFwZXNbeS5vdXRwdXRUZW5zb3JLZXldO3JldHVybiBudWxsPT15P251bGw6MD09PXkubGVuZ3RoPyJzY2FsYXIiOnkubWFwKEM9Pi0xPT09Qz8iPyI6Qykuam9pbigiXHUwMGQ3Iil9ZnVuY3Rpb24gbCh5LHcpe3JldHVybiB3LmVkZ2VMYWJlbEZ1bmN0aW9uP3cuZWRnZUxhYmVsRnVuY3Rpb24oeSx3KToxPHkuYmFzZUVkZ2VMaXN0Lmxlbmd0aD95LmJhc2VFZGdlTGlzdC5sZW5ndGgrIiB0ZW5zb3JzIjp0KHkuYmFzZUVkZ2VMaXN0WzBdLHcpfWZ1bmN0aW9uIHAoeSx3LEMpe2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGIuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwKInBhdGgiKTtmb3IobGV0IEQ9MTtEPHkubGVuZ3RoO0QrKylpZihHLnNldEF0dHJpYnV0ZSgiZCIsQyh5LnNsaWNlKDAsRCkpKSxHLmdldFRvdGFsTGVuZ3RoKCk+dylyZXR1cm4gRC0xO3JldHVybiB5Lmxlbmd0aC0xfWZ1bmN0aW9uIG0oeSx3LEMpe3ZhciBHPWQzLmxpbmUoKS54KE49Pk4ueCkueShOPT5OLnkpLEQ9ZDMuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIikpLmF0dHIoImQiLEcoeSkpLEI9K3cuYXR0cigibWFya2VyV2lkdGgiKSxJPXcuYXR0cigidmlld0JveCIpLnNwbGl0KCIgIikubWFwKE51bWJlcik7ST1JWzJdLUlbMF07dz0rdy5hdHRyKCJyZWZYIik7RD1ELm5vZGUoKTtpZihDKXJldHVybiBCKj0xLXcvSSxDPUQuZ2V0UG9pbnRBdExlbmd0aChCKSxHPXAoeSxCLEcpLHlbRy0xXT17eDpDLngseTpDLnl9LHkuc2xpY2UoRy0xKTtDPTEtdy9JO0I9RC5nZXRUb3RhbExlbmd0aCgpLUIqQztDPQpELmdldFBvaW50QXRMZW5ndGgoQik7Rz1wKHksQixHKTt5W0ddPXt4OkMueCx5OkMueX07cmV0dXJuIHkuc2xpY2UoMCxHKzEpfWZ1bmN0aW9uIG4oeSx3LEMsRyl7Rz1HfHxmLkNsYXNzLkVkZ2UuTElORTt3LmxhYmVsJiZ3LmxhYmVsLnN0cnVjdHVyYWwmJihHKz0iICIrZi5DbGFzcy5FZGdlLlNUUlVDVFVSQUwpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJncubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXMmJihHKz0iICIrZi5DbGFzcy5FZGdlLlJFRkVSRU5DRV9FREdFKTtDLmhhbmRsZUVkZ2VTZWxlY3RlZCYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuU0VMRUNUQUJMRSk7bGV0IEQ9InBhdGhfIitrKHcpO2lmKEMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKXZhciBCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKHcsRyk7ZWxzZSBCPTEsbnVsbCE9dy5sYWJlbCYmbnVsbCE9dy5sYWJlbC5tZXRhZWRnZSYmKEI9dy5sYWJlbC5tZXRhZWRnZS50b3RhbFNpemUpLApCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZShCKTtHPXkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLEQpLmF0dHIoImNsYXNzIixHKS5zdHlsZSgic3Ryb2tlLXdpZHRoIixCKyJweCIpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJih3LmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzPyhCPWByZWZlcmVuY2UtYXJyb3doZWFkLSR7QShCKX1gLEcuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtCfSlgKSx3LmxhYmVsLnN0YXJ0TWFya2VySWQ9Qik6KEI9YGRhdGFmbG93LWFycm93aGVhZC0ke0EoQil9YCxHLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke0J9KWApLHcubGFiZWwuZW5kTWFya2VySWQ9QikpO251bGwhPXcubGFiZWwmJm51bGwhPXcubGFiZWwubWV0YWVkZ2UmJih3PWwody5sYWJlbC5tZXRhZWRnZSxDLnJlbmRlckhpZXJhcmNoeSksbnVsbCE9dyYmeS5hcHBlbmQoInRleHQiKS5hcHBlbmQoInRleHRQYXRoIikuYXR0cigieGxpbms6aHJlZiIsCiIjIitEKS5hdHRyKCJzdGFydE9mZnNldCIsIjUwJSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigiZG9taW5hbnQtYmFzZWxpbmUiLCJjZW50cmFsIikudGV4dCh3KSl9ZnVuY3Rpb24gcSh5LHcsQyxHLEQpe0c9Qy5sYWJlbDtsZXQgQj1HLmFkam9pbmluZ01ldGFlZGdlLEk9Ry5wb2ludHM7eT15LnNoYWRvd1Jvb3Q7Qy5sYWJlbC5zdGFydE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5zdGFydE1hcmtlcklkKSksITApKTtDLmxhYmVsLmVuZE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5lbmRNYXJrZXJJZCkpLCExKSk7aWYoIUIpcmV0dXJuIGQzLmludGVycG9sYXRlKEQsaC5pbnRlcnBvbGF0ZShJKSk7bGV0IE49Qi5lZGdlR3JvdXAubm9kZSgpLmZpcnN0Q2hpbGQsTz1HLm1ldGFlZGdlLmluYm91bmQ7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IEg9Ti5nZXRQb2ludEF0TGVuZ3RoKE8/Ck4uZ2V0VG90YWxMZW5ndGgoKTowKS5tYXRyaXhUcmFuc2Zvcm0oTi5nZXRDVE0oKSkubWF0cml4VHJhbnNmb3JtKHcuZ2V0Q1RNKCkuaW52ZXJzZSgpKSxLPU8/MDpJLmxlbmd0aC0xO0lbS10ueD1ILng7SVtLXS55PUgueTtyZXR1cm4gaC5pbnRlcnBvbGF0ZShJKX19ZnVuY3Rpb24gdSh5LHcpe2QzLnNlbGVjdCh3KS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkudHJhbnNpdGlvbigpLmF0dHJUd2VlbigiZCIsZnVuY3Rpb24oQyxHLEQpe3JldHVybiBxKHksdGhpcyxDLEcsRCl9KX1mdW5jdGlvbiB4KHksdyl7eS5jbGFzc2VkKCJmYWRlZCIsdy5sYWJlbC5pc0ZhZGVkT3V0KTt3PXcubGFiZWwubWV0YWVkZ2U7eS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkuY2xhc3NlZCgiY29udHJvbC1kZXAiLHcmJiF3Lm51bVJlZ3VsYXJFZGdlcyl9aC5NSU5fRURHRV9XSURUSD0uNzU7aC5NQVhfRURHRV9XSURUSD0xMjtoLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRT0KZDMuc2NhbGVQb3coKS5leHBvbmVudCguMykuZG9tYWluKFsxLDVFNl0pLnJhbmdlKFtoLk1JTl9FREdFX1dJRFRILGguTUFYX0VER0VfV0lEVEhdKS5jbGFtcCghMCk7bGV0IEE9ZDMuc2NhbGVRdWFudGl6ZSgpLmRvbWFpbihbaC5NSU5fRURHRV9XSURUSCxoLk1BWF9FREdFX1dJRFRIXSkucmFuZ2UoWyJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieGxhcmdlIl0pO2guZ2V0RWRnZUtleT1rO2guYnVpbGRHcm91cD1mdW5jdGlvbih5LHcsQyl7bGV0IEc9W107Rz1fLnJlZHVjZSh3LmVkZ2VzKCksKEQsQik9PntsZXQgST13LmVkZ2UoQik7RC5wdXNoKHt2OkIudix3OkIudyxsYWJlbDpJfSk7cmV0dXJuIER9LEcpO3k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHksImciLGYuQ2xhc3MuRWRnZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKEcsayk7eS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmLkNsYXNzLkVkZ2UuR1JPVVApLmF0dHIoImRhdGEtZWRnZSIsCmspLmVhY2goZnVuY3Rpb24oRCl7bGV0IEI9ZDMuc2VsZWN0KHRoaXMpO0QubGFiZWwuZWRnZUdyb3VwPUI7Qy5fZWRnZUdyb3VwSW5kZXhbayhEKV09QjtpZihDLmhhbmRsZUVkZ2VTZWxlY3RlZClCLm9uKCJjbGljayIsST0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0MuZmlyZSgiZWRnZS1zZWxlY3QiLHtlZGdlRGF0YTpJLGVkZ2VHcm91cDpCfSl9KTtuKEIsRCxDKX0pLm1lcmdlKHkpLmVhY2goZnVuY3Rpb24oKXt1KEMsdGhpcyl9KS5lYWNoKGZ1bmN0aW9uKEQpe3goZDMuc2VsZWN0KHRoaXMpLEQsQyl9KTt5LmV4aXQoKS5lYWNoKEQ9PntkZWxldGUgQy5fZWRnZUdyb3VwSW5kZXhbayhEKV19KS5yZW1vdmUoKTtyZXR1cm4geX07aC5nZXRMYWJlbEZvckJhc2VFZGdlPXQ7aC5nZXRMYWJlbEZvckVkZ2U9bDtoLmFwcGVuZEVkZ2U9bjtoLmludGVycG9sYXRlPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKS54KHk9PnkueCkueSh5PT55LnkpfSkoZi5lZGdlfHwoZi5lZGdlPQp7fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2V4dGVybnMuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZ3JhcGguanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKEgsSyxNLEwsUSl7cmV0dXJuKE0/TSsiLyI6IiIpKyhIKygidW5kZWZpbmVkIiE9PXR5cGVvZiBMJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBRPyJbIitMKyItIitRKyJdIjoiIyIpK0spfWZ1bmN0aW9uIGgoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspe2xldCB7a2V5Ok0sdmFsdWU6TH09SFtLXTtpZigiX291dHB1dF9zaGFwZXMiPT09TSl7aWYoIUwubGlzdC5zaGFwZSlicmVhaztsZXQgUT1MLmxpc3Quc2hhcGUubWFwKFQ9PlQudW5rbm93bl9yYW5rP251bGw6bnVsbD09VC5kaW18fDE9PT1ULmRpbS5sZW5ndGgmJm51bGw9PVQuZGltWzBdLnNpemU/W106VC5kaW0ubWFwKFg9Plguc2l6ZSkpO0guc3BsaWNlKEssMSk7cmV0dXJuIFF9fXJldHVybiBudWxsfWZ1bmN0aW9uIGsoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspaWYoIl9YbGFDbHVzdGVyIj09PQpIW0tdLmtleSlyZXR1cm4gSFtLXS52YWx1ZS5zfHxudWxsO3JldHVybiBudWxsfWZ1bmN0aW9uIHQoSCl7bGV0IEs9W107Xy5lYWNoKEgsTT0+e2xldCBMPSJeIj09PU1bMF07TCYmKE09TS5zdWJzdHJpbmcoMSkpO2xldCBRPU0sVD0iMCIsWD1NLm1hdGNoKC8oLiopOihcdys6XGQrKSQvKTtpZihYKVE9WFsxXSxUPVhbMl07ZWxzZSBpZihYPU0ubWF0Y2goLyguKik6KFxkKykkLykpUT1YWzFdLFQ9WFsyXTswIT09Sy5sZW5ndGgmJlE9PT1LW0subGVuZ3RoLTFdLm5hbWV8fEsucHVzaCh7bmFtZTpRLG91dHB1dFRlbnNvcktleTpULGlzQ29udHJvbERlcGVuZGVuY3k6TH0pfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChILEssTSxMLFEsVCl7SyE9PU0ubmFtZSYmSC5lZGdlcy5wdXNoKHt2OkssdzpNLm5hbWUsb3V0cHV0VGVuc29yS2V5Okwub3V0cHV0VGVuc29yS2V5LGlzQ29udHJvbERlcGVuZGVuY3k6TC5pc0NvbnRyb2xEZXBlbmRlbmN5LGlzUmVmZXJlbmNlRWRnZTohMD09PVEucmVmRWRnZXNbTS5vcCsKIiAiK1RdfSl9ZnVuY3Rpb24gcChILEssTSl7TT1NfHx7fTtsZXQgTD1uZXcgZ3JhcGhsaWIuR3JhcGgoTSk7TC5zZXRHcmFwaCh7bmFtZTpILHJhbmtkaXI6TS5yYW5rZGlyfHwiQlQiLHR5cGU6S30pO3JldHVybiBMfWZ1bmN0aW9uIG0oSCl7cmV0dXJuIGZ1bmN0aW9uKEspe2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKXtsZXQgTD1uZXcgUmVnRXhwKEhbTV0pO2lmKCJzdHJpbmciPT09dHlwZW9mIEsub3AmJksub3AubWF0Y2goTCkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIG4oSCl7bGV0IEs9SC5zcGxpdChkLk5BTUVTUEFDRV9ERUxJTSk7cmV0dXJuIEgrZC5OQU1FU1BBQ0VfREVMSU0rIigiK0tbSy5sZW5ndGgtMV0rIikifWZ1bmN0aW9uIHEoSCxLKXtsZXQgTT17fSxMPXt9O0guc29ydCgpO2ZvcihsZXQgUT0wO1E8SC5sZW5ndGgtMTsrK1Epe2xldCBUPUhbUV07Xy5lYWNoKHgoVCkuc2xpY2UoMCwtMSksWD0+e0xbWF09ITB9KTtmb3IobGV0IFg9USsxO1g8SC5sZW5ndGg7KytYKXtsZXQgYWE9CkhbWF07aWYoXy5zdGFydHNXaXRoKGFhLFQpKXtpZihhYS5sZW5ndGg+VC5sZW5ndGgmJmFhLmNoYXJBdChULmxlbmd0aCk9PT1kLk5BTUVTUEFDRV9ERUxJTSl7TVtUXT1uKFQpO2JyZWFrfX1lbHNlIGJyZWFrfX1fLmVhY2goSyxRPT57USBpbiBMJiYoTVtRXT1uKFEpKX0pO3JldHVybiBNfWZ1bmN0aW9uIHUoSCl7bGV0IEs9SC5ub2RlcygpLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5uZWlnaGJvcnMoTSkubGVuZ3RofSk7Sy5zb3J0KCk7cmV0dXJuIEt9ZnVuY3Rpb24geChILEspe2xldCBNPVtdLEw9SC5pbmRleE9mKGQuTkFNRVNQQUNFX0RFTElNKTtmb3IoOzA8PUw7KU0ucHVzaChILnN1YnN0cmluZygwLEwpKSxMPUguaW5kZXhPZihkLk5BTUVTUEFDRV9ERUxJTSxMKzEpO0smJihLPUtbSF0pJiZNLnB1c2goSyk7TS5wdXNoKEgpO3JldHVybiBNfWQuTkFNRVNQQUNFX0RFTElNPSIvIjtkLlJPT1RfTkFNRT0iX19yb290X18iO2QuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWD0KIl9fZnVuY3Rpb25fbGlicmFyeV9fIjtkLkxBUkdFX0FUVFJTX0tFWT0iX3Rvb19sYXJnZV9hdHRycyI7ZC5MSU1JVF9BVFRSX1NJWkU9MTAyNDtkLkVER0VfS0VZX0RFTElNPSItLSI7bGV0IEE7KGZ1bmN0aW9uKEgpe0hbSC5GVUxMPTBdPSJGVUxMIjtIW0guRU1CRURERUQ9MV09IkVNQkVEREVEIjtIW0guTUVUQT0yXT0iTUVUQSI7SFtILlNFUklFUz0zXT0iU0VSSUVTIjtIW0guQ09SRT00XT0iQ09SRSI7SFtILlNIQURPVz01XT0iU0hBRE9XIjtIW0guQlJJREdFPTZdPSJCUklER0UiO0hbSC5FREdFPTddPSJFREdFIn0pKEE9ZC5HcmFwaFR5cGV8fChkLkdyYXBoVHlwZT17fSkpO2xldCB5OyhmdW5jdGlvbihIKXtIW0guTUVUQT0wXT0iTUVUQSI7SFtILk9QPTFdPSJPUCI7SFtILlNFUklFUz0yXT0iU0VSSUVTIjtIW0guQlJJREdFPTNdPSJCUklER0UiO0hbSC5FTExJUFNJUz00XT0iRUxMSVBTSVMifSkoeT1kLk5vZGVUeXBlfHwoZC5Ob2RlVHlwZT17fSkpO2xldCB3OyhmdW5jdGlvbihIKXtIW0guSU5DTFVERT0KMF09IklOQ0xVREUiO0hbSC5FWENMVURFPTFdPSJFWENMVURFIjtIW0guVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKHc9ZC5JbmNsdXNpb25UeXBlfHwoZC5JbmNsdXNpb25UeXBlPXt9KSk7KGZ1bmN0aW9uKEgpe0hbSC5HUk9VUD0wXT0iR1JPVVAiO0hbSC5VTkdST1VQPTFdPSJVTkdST1VQIn0pKGQuU2VyaWVzR3JvdXBpbmdUeXBlfHwoZC5TZXJpZXNHcm91cGluZ1R5cGU9e30pKTtjbGFzcyBDe2NvbnN0cnVjdG9yKCl7dGhpcy5ub2Rlcz17fTt0aGlzLmVkZ2VzPVtdfX1kLlNsaW1HcmFwaD1DO2NsYXNzIEd7Y29uc3RydWN0b3IoSCl7dGhpcy50eXBlPXkuRUxMSVBTSVM7dGhpcy5pc0dyb3VwTm9kZT0hMTt0aGlzLmNhcmRpbmFsaXR5PTE7dGhpcy5zdGF0cz10aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLnNldE51bU1vcmVOb2RlcyhIKTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH1zZXROdW1Nb3JlTm9kZXMoSCl7dGhpcy5udW1Nb3JlTm9kZXM9SDt0aGlzLm5hbWU9CiIuLi4gIitIKyIgbW9yZSJ9fWQuRWxsaXBzaXNOb2RlSW1wbD1HO2NsYXNzIER7Y29uc3RydWN0b3IoSCl7dGhpcy5vcD1ILm9wO3RoaXMubmFtZT1ILm5hbWU7dGhpcy5kZXZpY2U9SC5kZXZpY2U7dGhpcy5hdHRyPUguYXR0cjt0aGlzLmlucHV0cz10KEguaW5wdXQpO3RoaXMub3V0cHV0U2hhcGVzPWgoSC5hdHRyKTt0aGlzLnhsYUNsdXN0ZXI9ayhILmF0dHIpO3RoaXMuY29tcGF0aWJsZT0hMTt0aGlzLnR5cGU9eS5PUDt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLmluRW1iZWRkaW5ncz1bXTt0aGlzLm91dEVtYmVkZGluZ3M9W107dGhpcy5wYXJlbnROb2RlPW51bGw7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5vd25pbmdTZXJpZXM9bnVsbH19ZC5PcE5vZGVJbXBsPUQ7ZC5jcmVhdGVNZXRhbm9kZT1mdW5jdGlvbihILEs9e30pe3JldHVybiBuZXcgSShILEspfTtkLmpvaW5TdGF0c0luZm9XaXRoR3JhcGg9ZnVuY3Rpb24oSCxLLApNKXtfLmVhY2goSC5ub2RlcyxMPT57TC5zdGF0cz1udWxsfSk7Xy5lYWNoKEsuZGV2X3N0YXRzLEw9PntNJiYhTVtMLmRldmljZV18fF8uZWFjaChMLm5vZGVfc3RhdHMsUT0+e2xldCBUPVEubm9kZV9uYW1lIGluIEgubm9kZXM/US5ub2RlX25hbWU6bihRLm5vZGVfbmFtZSk7aWYoVCBpbiBILm5vZGVzKXt2YXIgWD0wO1EubWVtb3J5JiZfLmVhY2goUS5tZW1vcnksbGE9PntsYS50b3RhbF9ieXRlcyYmKDA8bGEudG90YWxfYnl0ZXM/WCs9TnVtYmVyKGxhLnRvdGFsX2J5dGVzKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gZm9yICIrVCkpfSk7dmFyIGFhPW51bGw7US5vdXRwdXQmJihhYT1fLm1hcChRLm91dHB1dCxsYT0+Xy5tYXAobGEudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSxaPT5OdW1iZXIoWi5zaXplKSkpKTtILm5vZGVzW1RdLmRldmljZT1MLmRldmljZTtudWxsPT1ILm5vZGVzW1RdLnN0YXRzJiYoSC5ub2Rlc1tUXS5zdGF0cz0KbmV3IEIoYWEpKTtILm5vZGVzW1RdLnN0YXRzLmFkZEJ5dGVzQWxsb2NhdGlvbihYKTtRLmFsbF9lbmRfcmVsX21pY3JvcyYmKDA8US5hbGxfZW5kX3JlbF9taWNyb3M/SC5ub2Rlc1tUXS5zdGF0cy5hZGRFeGVjdXRpb25UaW1lKFEuYWxsX3N0YXJ0X21pY3JvcyxRLmFsbF9zdGFydF9taWNyb3MrUS5hbGxfZW5kX3JlbF9taWNyb3MpOmNvbnNvbGUubG9nKCJpZ25vcmluZyBuZWdhdGl2ZSBydW50aW1lIGZvciAiK1QpKX19KX0pfTtjbGFzcyBCe2NvbnN0cnVjdG9yKEgpe3RoaXMudG90YWxCeXRlcz0wO3RoaXMub3V0cHV0U2l6ZT1IfWFkZEV4ZWN1dGlvblRpbWUoSCxLKXt0aGlzLnN0YXJ0VGltZT1udWxsIT10aGlzLnN0YXJ0VGltZT9NYXRoLm1pbih0aGlzLnN0YXJ0VGltZSxIKTpIO3RoaXMuZW5kVGltZT1udWxsIT10aGlzLmVuZFRpbWU/TWF0aC5tYXgodGhpcy5lbmRUaW1lLEspOkt9YWRkQnl0ZXNBbGxvY2F0aW9uKEgpe3RoaXMudG90YWxCeXRlcz1udWxsIT10aGlzLnRvdGFsQnl0ZXM/Ck1hdGgubWF4KHRoaXMudG90YWxCeXRlcyxIKTpIfWNvbWJpbmUoSCl7bnVsbCE9SC50b3RhbEJ5dGVzJiYodGhpcy50b3RhbEJ5dGVzKz1ILnRvdGFsQnl0ZXMpO251bGwhPUguZ2V0VG90YWxNaWNyb3MoKSYmdGhpcy5hZGRFeGVjdXRpb25UaW1lKEguc3RhcnRUaW1lLEguZW5kVGltZSl9Z2V0VG90YWxNaWNyb3MoKXtyZXR1cm4gbnVsbD09dGhpcy5zdGFydFRpbWV8fG51bGw9PXRoaXMuZW5kVGltZT9udWxsOnRoaXMuZW5kVGltZS10aGlzLnN0YXJ0VGltZX19ZC5Ob2RlU3RhdHM9QjtjbGFzcyBJe2NvbnN0cnVjdG9yKEgsSz17fSl7dGhpcy5uYW1lPUg7dGhpcy50eXBlPXkuTUVUQTt0aGlzLmRlcHRoPTE7dGhpcy5pc0dyb3VwTm9kZT0hMDt0aGlzLmNhcmRpbmFsaXR5PTA7dGhpcy5tZXRhZ3JhcGg9cChILEEuTUVUQSxLKTt0aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5vcEhpc3RvZ3JhbT17fTt0aGlzLmRldmljZUhpc3RvZ3JhbT17fTt0aGlzLnhsYUNsdXN0ZXJIaXN0b2dyYW09Cnt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLnBhcmVudE5vZGU9dGhpcy50ZW1wbGF0ZUlkPW51bGw7dGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITE7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5hc3NvY2lhdGVkRnVuY3Rpb249IiJ9Z2V0Rmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubWV0YWdyYXBoLm5vZGVzKClbMF0pfWdldFJvb3RPcCgpe2xldCBIPXRoaXMubmFtZS5zcGxpdCgiLyIpO3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubmFtZSsiLygiK0hbSC5sZW5ndGgtMV0rIikiKX1sZWF2ZXMoKXtsZXQgSD1bXSxLPVt0aGlzXSxNO2Zvcig7Sy5sZW5ndGg7KXtsZXQgTD1LLnNoaWZ0KCk7TC5pc0dyb3VwTm9kZT8oTT1MLm1ldGFncmFwaCxfLmVhY2goTS5ub2RlcygpLFE9PksucHVzaChNLm5vZGUoUSkpKSk6SC5wdXNoKEwubmFtZSl9cmV0dXJuIEh9fQpkLk1ldGFub2RlSW1wbD1JO2QuY3JlYXRlTWV0YWVkZ2U9ZnVuY3Rpb24oSCxLKXtyZXR1cm4gbmV3IE4oSCxLKX07Y2xhc3MgTntjb25zdHJ1Y3RvcihILEspe3RoaXMudj1IO3RoaXMudz1LO3RoaXMuYmFzZUVkZ2VMaXN0PVtdO3RoaXMuaW5ib3VuZD1udWxsO3RoaXMudG90YWxTaXplPXRoaXMubnVtUmVmRWRnZXM9dGhpcy5udW1Db250cm9sRWRnZXM9dGhpcy5udW1SZWd1bGFyRWRnZXM9MH1hZGRCYXNlRWRnZShILEspe3RoaXMuYmFzZUVkZ2VMaXN0LnB1c2goSCk7SC5pc0NvbnRyb2xEZXBlbmRlbmN5P3RoaXMubnVtQ29udHJvbEVkZ2VzKz0xOnRoaXMubnVtUmVndWxhckVkZ2VzKz0xO0guaXNSZWZlcmVuY2VFZGdlJiYodGhpcy5udW1SZWZFZGdlcys9MSk7dGhpcy50b3RhbFNpemUrPU4uY29tcHV0ZVNpemVPZkVkZ2UoSCxLKTtLLm1heE1ldGFFZGdlU2l6ZT1NYXRoLm1heChLLm1heE1ldGFFZGdlU2l6ZSx0aGlzLnRvdGFsU2l6ZSl9c3RhdGljIGNvbXB1dGVTaXplT2ZFZGdlKEgsCkspe2xldCBNPUsubm9kZShILnYpO2lmKCFNLm91dHB1dFNoYXBlcylyZXR1cm4gMTtLLmhhc1NoYXBlSW5mbz0hMDtIPU9iamVjdC5rZXlzKE0ub3V0cHV0U2hhcGVzKS5tYXAoTD0+TS5vdXRwdXRTaGFwZXNbTF0pLm1hcChMPT5udWxsPT1MPzE6TC5yZWR1Y2UoKFEsVCk9PnstMT09PVQmJihUPTEpO3JldHVybiBRKlR9LDEpKTtyZXR1cm4gXy5zdW0oSCl9fWQuTWV0YWVkZ2VJbXBsPU47ZC5jcmVhdGVTZXJpZXNOb2RlPWZ1bmN0aW9uKEgsSyxNLEwsUSxUKXtyZXR1cm4gbmV3IE8oSCxLLE0sTCxRLFQpfTtkLmdldFNlcmllc05vZGVOYW1lPWY7Y2xhc3MgT3tjb25zdHJ1Y3RvcihILEssTSxMLFEsVCl7dGhpcy5uYW1lPVF8fGYoSCxLLE0pO3RoaXMudHlwZT15LlNFUklFUzt0aGlzLmhhc0xvb3A9ITE7dGhpcy5wcmVmaXg9SDt0aGlzLnN1ZmZpeD1LO3RoaXMuY2x1c3RlcklkPUw7dGhpcy5pZHM9W107dGhpcy5wYXJlbnQ9TTt0aGlzLmlzR3JvdXBOb2RlPSEwO3RoaXMuY2FyZGluYWxpdHk9CjA7dGhpcy5tZXRhZ3JhcGg9cChRLEEuU0VSSUVTLFQpO3RoaXMucGFyZW50Tm9kZT10aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5kZXZpY2VIaXN0b2dyYW09e307dGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPXt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH19ZC5EZWZhdWx0QnVpbGRQYXJhbXM9e2VuYWJsZUVtYmVkZGluZzohMCxpbkVtYmVkZGluZ1R5cGVzOlsiQ29uc3QiXSxvdXRFbWJlZGRpbmdUeXBlczpbIl5bYS16QS1aXStTdW1tYXJ5JCJdLHJlZkVkZ2VzOnsiQXNzaWduIDAiOiEwLCJBc3NpZ25BZGQgMCI6ITAsIkFzc2lnblN1YiAwIjohMCwiYXNzaWduIDAiOiEwLCJhc3NpZ25fYWRkIDAiOiEwLCJhc3NpZ25fc3ViIDAiOiEwLCJjb3VudF91cF90byAwIjohMCwiU2NhdHRlckFkZCAwIjohMCwiU2NhdHRlclN1YiAwIjohMCwKIlNjYXR0ZXJVcGRhdGUgMCI6ITAsInNjYXR0ZXJfYWRkIDAiOiEwLCJzY2F0dGVyX3N1YiAwIjohMCwic2NhdHRlcl91cGRhdGUgMCI6ITB9fTtkLmJ1aWxkPWZ1bmN0aW9uKEgsSyxNKXtsZXQgTD17fSxRPXt9LFQ9e30sWD1tKEsuaW5FbWJlZGRpbmdUeXBlcyksYWE9bShLLm91dEVtYmVkZGluZ1R5cGVzKSxsYT1bXSxaPUgubm9kZSxiYT1BcnJheShaLmxlbmd0aCk7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBlYT1BcnJheShaLmxlbmd0aCksY2E9MDtjb25zdCBrYT1FYT0+e2xldCB2YT1uZXcgRChFYSk7aWYoWCh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksTFt2YS5uYW1lXT12YTtpZihhYSh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksUVt2YS5uYW1lXT12YSxfLmVhY2godmEuaW5wdXRzLHhhPT57eGE9eGEubmFtZTtUW3hhXT1UW3hhXXx8W107VFt4YV0ucHVzaCh2YSl9KSx2YTtlYVtjYV09CnZhO2JhW2NhXT12YS5uYW1lO2NhKys7cmV0dXJuIHZhfTtfLmVhY2goWixrYSk7Y29uc3QgWT1FYT0+e2NvbnN0IHZhPWQuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCtFYS5zaWduYXR1cmUubmFtZTtrYSh7bmFtZTp2YSxpbnB1dDpbXSxkZXZpY2U6IiIsb3A6IiIsYXR0cjpbXX0pO2lmKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpe2xldCB5YT0wO3ZhciB4YT1TYT0+e2thKHtuYW1lOnZhK2QuTkFNRVNQQUNFX0RFTElNK1NhLm5hbWUsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiJpbnB1dF9hcmciLGF0dHI6W3trZXk6IlQiLHZhbHVlOnt0eXBlOlNhLnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9eWE7eWErK307RWEuc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP3hhKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUuaW5wdXRfYXJnLHhhKX1sZXQgQWE9MDtjb25zdCBGYT17fTtFYS5zaWduYXR1cmUub3V0cHV0X2FyZyYmKHhhPXlhPT57RmFbdmErCmQuTkFNRVNQQUNFX0RFTElNK3lhLm5hbWVdPUFhO0FhKyt9LEVhLnNpZ25hdHVyZS5vdXRwdXRfYXJnLm5hbWU/eGEoRWEuc2lnbmF0dXJlLm91dHB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUub3V0cHV0X2FyZyx4YSkpO18uZWFjaChFYS5ub2RlX2RlZix5YT0+e3lhLm5hbWU9dmErIi8iK3lhLm5hbWU7InN0cmluZyI9PT10eXBlb2YgeWEuaW5wdXQmJih5YS5pbnB1dD1beWEuaW5wdXRdKTtjb25zdCBTYT1rYSh5YSk7Xy5pc051bWJlcihGYVt5YS5uYW1lXSkmJihTYS5mdW5jdGlvbk91dHB1dEluZGV4PUZhW3lhLm5hbWVdKTtfLmVhY2goU2EuaW5wdXRzLFhhPT57WGEubmFtZT12YStkLk5BTUVTUEFDRV9ERUxJTStYYS5uYW1lfSl9KX07SC5saWJyYXJ5JiZILmxpYnJhcnkuZnVuY3Rpb24mJl8uZWFjaChILmxpYnJhcnkuZnVuY3Rpb24sWSk7ZWEuc3BsaWNlKGNhKTtiYS5zcGxpY2UoY2EpO3JldHVybiBlYX0sTSkudGhlbihlYT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiQnVpbGRpbmcgdGhlIGRhdGEgc3RydWN0dXJlIiwKNzAsKCk9PntsZXQgY2E9cShiYSxsYSksa2E9bmV3IEM7Xy5lYWNoKGVhLFk9PntsZXQgRWE9Y2FbWS5uYW1lXXx8WS5uYW1lO2thLm5vZGVzW0VhXT1ZO1kubmFtZSBpbiBUJiYoWS5vdXRFbWJlZGRpbmdzPVRbWS5uYW1lXSxfLmVhY2goWS5vdXRFbWJlZGRpbmdzLHZhPT57dmEubmFtZT1jYVt2YS5uYW1lXXx8dmEubmFtZX0pKTtZLm5hbWU9RWF9KTtfLmVhY2goZWEsWT0+e18uZWFjaChZLmlucHV0cywoRWEsdmEpPT57bGV0IHhhPUVhLm5hbWU7aWYoeGEgaW4gTCl7RWE9TFt4YV07WS5pbkVtYmVkZGluZ3MucHVzaChFYSk7Zm9yKHZhciBBYSBvZiBFYS5pbnB1dHMpbChrYSxjYVtBYS5uYW1lXXx8QWEubmFtZSxZLEFhLEssdmEpfWVsc2UgaWYoeGEgaW4gUSl7QWE9UVt4YV07Zm9yKGxldCBGYSBvZiBBYS5pbnB1dHMpbChrYSxjYVtGYS5uYW1lXXx8RmEubmFtZSxZLEVhLEssdmEpfWVsc2UgbChrYSxjYVt4YV18fHhhLFksRWEsSyx2YSl9KX0pO18uZWFjaChMLFk9PntZLm5hbWU9CmNhW1kubmFtZV18fFkubmFtZX0pO3JldHVybiBrYX0sTSkpfTtkLmNyZWF0ZUdyYXBoPXA7ZC5nZXRTdHJpY3ROYW1lPW47ZC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2U9ZnVuY3Rpb24oSCxLKXtIPXUoSCk7Sz11KEspO2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKWlmKEhbTV0hPT1LW01dKXJldHVybiExO3JldHVybiEwfTtkLmdldEhpZXJhcmNoaWNhbFBhdGg9eDtkLmdldEluY2x1ZGVOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU/IkFkZCB0byBtYWluIGdyYXBoIjoiUmVtb3ZlIGZyb20gbWFpbiBncmFwaCJ9O2QuZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/IlVuZ3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMiOiJHcm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyJ9O2QudG9nZ2xlTm9kZVNlcmllc0dyb3VwPQpmdW5jdGlvbihILEspe0hbS109SyBpbiBIJiZIW0tdIT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA6Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUH19KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9oaWVyYXJjaHkuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh4LEEseSx3KXtBPXk/eC5pbkVkZ2VzKEEubmFtZSk6eC5vdXRFZGdlcyhBLm5hbWUpO18uZWFjaChBLEM9PntDPXguZWRnZShDKTsoQy5udW1SZWd1bGFyRWRnZXM/dy5yZWd1bGFyOncuY29udHJvbCkucHVzaChDKX0pfWZ1bmN0aW9uIGsoeCxBKXtjb25zdCB5PXt9O18uZWFjaChBLm5vZGVzLHc9PntsZXQgQz1kLmdldEhpZXJhcmNoaWNhbFBhdGgody5uYW1lKSxHPXgucm9vdDtHLmRlcHRoPU1hdGgubWF4KEMubGVuZ3RoLEcuZGVwdGgpO3lbdy5vcF18fCh5W3cub3BdPVtdKTt5W3cub3BdLnB1c2godyk7Zm9yKGxldCBCPTA7QjxDLmxlbmd0aDtCKyspe0cuZGVwdGg9TWF0aC5tYXgoRy5kZXB0aCxDLmxlbmd0aC1CKTtHLmNhcmRpbmFsaXR5Kz13LmNhcmRpbmFsaXR5O0cub3BIaXN0b2dyYW1bdy5vcF09KEcub3BIaXN0b2dyYW1bdy5vcF18fDApKzE7bnVsbCE9dy5kZXZpY2UmJihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV09CihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV18fDApKzEpO251bGwhPXcueGxhQ2x1c3RlciYmKEcueGxhQ2x1c3Rlckhpc3RvZ3JhbVt3LnhsYUNsdXN0ZXJdPShHLnhsYUNsdXN0ZXJIaXN0b2dyYW1bdy54bGFDbHVzdGVyXXx8MCkrMSk7dy5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaCh3LmluRW1iZWRkaW5ncyxOPT57Ti5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwKMCkrMX0pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsTj0+e04uY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO2lmKEI9PT1DLmxlbmd0aC0xKWJyZWFrO3ZhciBEPUNbQl07bGV0IEk9eC5ub2RlKEQpO0l8fChJPWQuY3JlYXRlTWV0YW5vZGUoRCx4LmdyYXBoT3B0aW9ucyksSS5wYXJlbnROb2RlPUcseC5zZXROb2RlKEQsSSksRy5tZXRhZ3JhcGguc2V0Tm9kZShELEkpLDA9PT1ELmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmRy5uYW1lPT09Yi5ncmFwaC5ST09UX05BTUUmJihEPUQuc3Vic3RyaW5nKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWC5sZW5ndGgpLHlbRF18fAooeVtEXT1bXSkseC5saWJyYXJ5RnVuY3Rpb25zW0RdPXtub2RlOkksdXNhZ2VzOnlbRF19LEkuYXNzb2NpYXRlZEZ1bmN0aW9uPUQpKTtHPUl9eC5zZXROb2RlKHcubmFtZSx3KTt3LnBhcmVudE5vZGU9RztHLm1ldGFncmFwaC5zZXROb2RlKHcubmFtZSx3KTtfLmVhY2gody5pbkVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pfSl9ZnVuY3Rpb24gdCh4LEEpe2xldCB5PXguZ2V0Tm9kZU1hcCgpLHc9W10sQz1bXSxHPShELEIpPT57bGV0IEk9MDtmb3IoO0Q7KUJbSSsrXT1ELm5hbWUsRD1ELnBhcmVudE5vZGU7cmV0dXJuIEktMX07Xy5lYWNoKEEuZWRnZXMsRD0+e3ZhciBCPUcoQS5ub2Rlc1tELnZdLHcpLEk9RyhBLm5vZGVzW0Qud10sQyk7aWYoLTEhPT1CJiYtMSE9PUkpe2Zvcig7d1tCXT09PUNbSV07KWlmKEItLSwKSS0tLDA+Qnx8MD5JKXRocm93IEVycm9yKCJObyBkaWZmZXJlbmNlIGZvdW5kIGJldHdlZW4gYW5jZXN0b3IgcGF0aHMuIik7dmFyIE49eVt3W0IrMV1dO0I9d1tCXTtJPUNbSV07dmFyIE89Ti5tZXRhZ3JhcGguZWRnZShCLEkpO098fChPPWQuY3JlYXRlTWV0YWVkZ2UoQixJKSxOLm1ldGFncmFwaC5zZXRFZGdlKEIsSSxPKSk7Ti5oYXNOb25Db250cm9sRWRnZXN8fEQuaXNDb250cm9sRGVwZW5kZW5jeXx8KE4uaGFzTm9uQ29udHJvbEVkZ2VzPSEwKTtPLmFkZEJhc2VFZGdlKEQseCl9fSl9ZnVuY3Rpb24gbCh4LEEseSx3LEMsRyl7bGV0IEQ9eC5tZXRhZ3JhcGg7Xy5lYWNoKEQubm9kZXMoKSxCPT57Qj1ELm5vZGUoQik7Qi50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5NRVRBJiZsKEIsQSx5LHcsQyxHKX0pO3g9cChEKTt4PShHP246bSkoeCxELEEuZ3JhcGhPcHRpb25zKTtfLmVhY2goeCxmdW5jdGlvbihCLEkpe2xldCBOPUIubWV0YWdyYXBoLm5vZGVzKCk7Xy5lYWNoKE4sTz0+CntPPUQubm9kZShPKTtPLm93bmluZ1Nlcmllc3x8KE8ub3duaW5nU2VyaWVzPUkpfSk7Ti5sZW5ndGg8dyYmIShCLm5hbWUgaW4gQykmJihDW0IubmFtZV09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCk7Qi5uYW1lIGluIEMmJkNbQi5uYW1lXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB8fChBLnNldE5vZGUoSSxCKSxELnNldE5vZGUoSSxCKSxfLmVhY2goTixPPT57bGV0IEg9RC5ub2RlKE8pO0IubWV0YWdyYXBoLnNldE5vZGUoTyxIKTtCLnBhcmVudE5vZGU9SC5wYXJlbnROb2RlO0IuY2FyZGluYWxpdHkrKztudWxsIT1ILmRldmljZSYmKEIuZGV2aWNlSGlzdG9ncmFtW0guZGV2aWNlXT0oQi5kZXZpY2VIaXN0b2dyYW1bSC5kZXZpY2VdfHwwKSsxKTtudWxsIT1ILnhsYUNsdXN0ZXImJihCLnhsYUNsdXN0ZXJIaXN0b2dyYW1bSC54bGFDbHVzdGVyXT0oQi54bGFDbHVzdGVySGlzdG9ncmFtW0gueGxhQ2x1c3Rlcl18fDApKzEpO0guY29tcGF0aWJsZT8KQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzE7Xy5lYWNoKEguaW5FbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtfLmVhY2goSC5vdXRFbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9CihCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7SC5wYXJlbnROb2RlPUI7eVtPXT1JO0QucmVtb3ZlTm9kZShPKX0pKX0pfWZ1bmN0aW9uIHAoeCl7cmV0dXJuIF8ucmVkdWNlKHgubm9kZXMoKSwoQSx5KT0+e3k9eC5ub2RlKHkpO2lmKHkudHlwZT09PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gQTtsZXQgdz15Lm9wO3cmJihBW3ddPUFbd118fFtdLEFbd10ucHVzaCh5Lm5hbWUpKTtyZXR1cm4gQX0se30pfWZ1bmN0aW9uIG0oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9O18uZWFjaChDLGZ1bmN0aW9uKEIpe3ZhciBJPSIqIj09PUIuY2hhckF0KEIubGVuZ3RoLTEpLE49Qi5zcGxpdCgiLyIpLE89TltOLmxlbmd0aC0xXTtOPU4uc2xpY2UoMCxOLmxlbmd0aC0xKS5qb2luKCIvIik7dmFyIEg9Ty5tYXRjaCgvXihcRCopXyhcZCspJC8pO2xldCBLPSIiO0g/KE89SFsxXSxIPUhbMl0pOgooTz1JP08uc3Vic3RyKDAsTy5sZW5ndGgtMSk6TyxIPTAsSz1JPyIqIjoiIik7ST1kLmdldFNlcmllc05vZGVOYW1lKE8sSyxOKTtEW0ldPURbSV18fFtdO0I9ZC5jcmVhdGVTZXJpZXNOb2RlKE8sSyxOLCtILEIseSk7RFtJXS5wdXNoKEIpfSk7Xy5lYWNoKEQsZnVuY3Rpb24oQil7aWYoISgyPkIubGVuZ3RoKSl7Qi5zb3J0KGZ1bmN0aW9uKE4sTyl7cmV0dXJuK04uY2x1c3RlcklkLStPLmNsdXN0ZXJJZH0pO3ZhciBJPVtCWzBdXTtmb3IobGV0IE49MTtOPEIubGVuZ3RoO04rKyl7bGV0IE89QltOXTtPLmNsdXN0ZXJJZD09PUlbSS5sZW5ndGgtMV0uY2x1c3RlcklkKzE/SS5wdXNoKE8pOihxKEksdywrRyxBLHkpLEk9W09dKX1xKEksdywrRyxBLHkpfX0pfX0pO3JldHVybiB3fWZ1bmN0aW9uIG4oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9LEI9e307Xy5lYWNoKEMsZnVuY3Rpb24oTil7bGV0IE89IioiPT09Ck4uY2hhckF0KE4ubGVuZ3RoLTEpO3ZhciBIPU4uc3BsaXQoIi8iKTtsZXQgSz1IW0gubGVuZ3RoLTFdO0g9SC5zbGljZSgwLEgubGVuZ3RoLTEpLmpvaW4oIi8iKTtjb25zdCBNPS8oXGQrKS9nO3ZhciBMO2xldCBRLFQsWCxhYT0wO2Zvcig7TD1NLmV4ZWMoSyk7KSsrYWEsUT1LLnNsaWNlKDAsTC5pbmRleCksVD1MWzBdLEw9Sy5zbGljZShMLmluZGV4K0xbMF0ubGVuZ3RoKSxYPWQuZ2V0U2VyaWVzTm9kZU5hbWUoUSxMLEgpLERbWF09RFtYXSxEW1hdfHwoRFtYXT1kLmNyZWF0ZVNlcmllc05vZGUoUSxMLEgsK1QsTix5KSksRFtYXS5pZHMucHVzaChUKSxCW05dPUJbTl18fFtdLEJbTl0ucHVzaChbWCxUXSk7MT5hYSYmKFE9Tz9LLnN1YnN0cigwLEsubGVuZ3RoLTEpOkssVD0wLEw9Tz8iKiI6IiIsWD1kLmdldFNlcmllc05vZGVOYW1lKFEsTCxIKSxEW1hdPURbWF0sRFtYXXx8KERbWF09ZC5jcmVhdGVTZXJpZXNOb2RlKFEsTCxILCtULE4seSkpLERbWF0uaWRzLnB1c2goVCksQltOXT0KQltOXXx8W10sQltOXS5wdXNoKFtYLFRdKSl9KTt2YXIgST17fTtfLmVhY2goQixmdW5jdGlvbihOLE8pe04uc29ydChmdW5jdGlvbihNLEwpe3JldHVybiBEW0xbMF1dLmlkcy5sZW5ndGgtRFtNWzBdXS5pZHMubGVuZ3RofSk7dmFyIEg9TlswXVswXTtOPU5bMF1bMV07SVtIXT1JW0hdfHxbXTtjb25zdCBLPU8uc3BsaXQoIi8iKTtPPWQuY3JlYXRlU2VyaWVzTm9kZShEW0hdLnByZWZpeCxEW0hdLnN1ZmZpeCxLLnNsaWNlKDAsSy5sZW5ndGgtMSkuam9pbigiLyIpLCtOLE8seSk7SVtIXS5wdXNoKE8pfSk7Xy5lYWNoKEksZnVuY3Rpb24oTil7aWYoISgyPk4ubGVuZ3RoKSl7Ti5zb3J0KGZ1bmN0aW9uKEgsSyl7cmV0dXJuK0guY2x1c3RlcklkLStLLmNsdXN0ZXJJZH0pO3ZhciBPPVtOWzBdXTtmb3IobGV0IEg9MTtIPE4ubGVuZ3RoO0grKyl7bGV0IEs9TltIXTtLLmNsdXN0ZXJJZD09PU9bTy5sZW5ndGgtMV0uY2x1c3RlcklkKzE/Ty5wdXNoKEspOihxKE8sdywrRyxBLHkpLE89CltLXSl9cShPLHcsK0csQSx5KX19KX19KTtyZXR1cm4gd31mdW5jdGlvbiBxKHgsQSx5LHcsQyl7aWYoMTx4Lmxlbmd0aCl7bGV0IEc9ZC5nZXRTZXJpZXNOb2RlTmFtZSh4WzBdLnByZWZpeCx4WzBdLnN1ZmZpeCx4WzBdLnBhcmVudCx4WzBdLmNsdXN0ZXJJZCx4W3gubGVuZ3RoLTFdLmNsdXN0ZXJJZCksRD1kLmNyZWF0ZVNlcmllc05vZGUoeFswXS5wcmVmaXgseFswXS5zdWZmaXgseFswXS5wYXJlbnQseSxHLEMpO18uZWFjaCh4LGZ1bmN0aW9uKEIpe0QuaWRzLnB1c2goQi5jbHVzdGVySWQpO0QubWV0YWdyYXBoLnNldE5vZGUoQi5uYW1lLHcubm9kZShCLm5hbWUpKX0pO0FbR109RH19Y2xhc3MgdXtjb25zdHJ1Y3Rvcih4KXt0aGlzLmhhc1NoYXBlSW5mbz0hMTt0aGlzLm1heE1ldGFFZGdlU2l6ZT0xO3RoaXMuZ3JhcGhPcHRpb25zPXh8fHt9O3RoaXMuZ3JhcGhPcHRpb25zLmNvbXBvdW5kPSEwO3RoaXMucm9vdD1kLmNyZWF0ZU1ldGFub2RlKGQuUk9PVF9OQU1FLHRoaXMuZ3JhcGhPcHRpb25zKTsKdGhpcy5saWJyYXJ5RnVuY3Rpb25zPXt9O3RoaXMueGxhQ2x1c3RlcnM9dGhpcy5kZXZpY2VzPXRoaXMudGVtcGxhdGVzPW51bGw7dGhpcy5pbmRleD17fTt0aGlzLmluZGV4W2QuUk9PVF9OQU1FXT10aGlzLnJvb3Q7dGhpcy5vcmRlcmluZ3M9e319Z2V0Tm9kZU1hcCgpe3JldHVybiB0aGlzLmluZGV4fW5vZGUoeCl7cmV0dXJuIHRoaXMuaW5kZXhbeF19c2V0Tm9kZSh4LEEpe3RoaXMuaW5kZXhbeF09QX1nZXRCcmlkZ2VncmFwaCh4KXt2YXIgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIGluIGhpZXJhcmNoeTogIit4KTtpZighKCJtZXRhZ3JhcGgiaW4gQSkpcmV0dXJuIG51bGw7aWYoQS5icmlkZ2VncmFwaClyZXR1cm4gQS5icmlkZ2VncmFwaDtsZXQgeT1BLmJyaWRnZWdyYXBoPWQuY3JlYXRlR3JhcGgoIkJSSURHRUdSQVBIIixkLkdyYXBoVHlwZS5CUklER0UsdGhpcy5ncmFwaE9wdGlvbnMpO2lmKCEoQS5wYXJlbnROb2RlJiYKIm1ldGFncmFwaCJpbiBBLnBhcmVudE5vZGUpKXJldHVybiB5O3ZhciB3PUEucGFyZW50Tm9kZTtBPXcubWV0YWdyYXBoO3c9dGhpcy5nZXRCcmlkZ2VncmFwaCh3Lm5hbWUpO18uZWFjaChbQSx3XSxDPT57Qy5lZGdlcygpLmZpbHRlcihHPT5HLnY9PT14fHxHLnc9PT14KS5mb3JFYWNoKEc9PntsZXQgRD1HLnc9PT14LEI9Qy5lZGdlKEcpO18uZWFjaChCLmJhc2VFZGdlTGlzdCxJPT57bGV0IFtOLE9dPUQ/W0kudyxHLnZdOltJLnYsRy53XTt2YXIgSD10aGlzLmdldENoaWxkTmFtZSh4LE4pO0g9e3Y6RD9POkgsdzpEP0g6T307bGV0IEs9eS5lZGdlKEgpO0t8fChLPWQuY3JlYXRlTWV0YWVkZ2UoSC52LEgudyksSy5pbmJvdW5kPUQseS5zZXRFZGdlKEgudixILncsSykpO0suYWRkQmFzZUVkZ2UoSSx0aGlzKX0pfSl9KTtyZXR1cm4geX1nZXRDaGlsZE5hbWUoeCxBKXtsZXQgeT10aGlzLmluZGV4W0FdO2Zvcig7eTspe2lmKHkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLm5hbWU9PT0KeClyZXR1cm4geS5uYW1lO3k9eS5wYXJlbnROb2RlfXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBpbW1lZGlhdGUgY2hpbGQgZm9yIGRlc2NlbmRhbnQ6ICIrQSk7fWdldFByZWRlY2Vzc29ycyh4KXtsZXQgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit4KTtsZXQgeT10aGlzLmdldE9uZVdheUVkZ2VzKEEsITApO0EuaXNHcm91cE5vZGV8fF8uZWFjaChBLmluRW1iZWRkaW5ncyx3PT57Xy5lYWNoKEEuaW5wdXRzLEM9PntpZihDLm5hbWU9PT13Lm5hbWUpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh3Lm5hbWUseCk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2OncubmFtZSx3Onh9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0U3VjY2Vzc29ycyh4KXtsZXQgQT0KdGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCExKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5vdXRFbWJlZGRpbmdzLHc9PntfLmVhY2gody5pbnB1dHMsQz0+e2lmKEMubmFtZT09PXgpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh4LHcubmFtZSk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2Ongsdzp3Lm5hbWV9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0T25lV2F5RWRnZXMoeCxBKXtsZXQgeT17Y29udHJvbDpbXSxyZWd1bGFyOltdfTtpZigheC5wYXJlbnROb2RlfHwheC5wYXJlbnROb2RlLmlzR3JvdXBOb2RlKXJldHVybiB5O3ZhciB3PXgucGFyZW50Tm9kZTtsZXQgQz0Kdy5tZXRhZ3JhcGg7dz10aGlzLmdldEJyaWRnZWdyYXBoKHcubmFtZSk7aChDLHgsQSx5KTtoKHcseCxBLHkpO3JldHVybiB5fWdldFRvcG9sb2dpY2FsT3JkZXJpbmcoeCl7dmFyIEE9dGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7aWYoIUEuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYoeCBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3NbeF07bGV0IHk9e30sdz17fSxDPUEubWV0YWdyYXBoO18uZWFjaChDLmVkZ2VzKCksRD0+e0MuZWRnZShEKS5udW1SZWd1bGFyRWRnZXMmJihELnYgaW4geXx8KHlbRC52XT1bXSkseVtELnZdLnB1c2goRC53KSx3W0Qud109ITApfSk7bGV0IEc9Xy5kaWZmZXJlbmNlKF8ua2V5cyh5KSxfLmtleXModykpO3g9dGhpcy5vcmRlcmluZ3NbeF09e307Zm9yKEE9MDtHLmxlbmd0aDspe2xldCBEPUcuc2hpZnQoKTt4W0RdPUErKztfLmVhY2goeVtEXSxCPT4KRy5wdXNoKEIpKTtkZWxldGUgeVtEXX1yZXR1cm4geH1nZXRUZW1wbGF0ZUluZGV4KCl7bGV0IHg9ZDMua2V5cyh0aGlzLnRlbXBsYXRlcyksQT1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4oeCkucmFuZ2UoZDMucmFuZ2UoMCx4Lmxlbmd0aCkpO3JldHVybiB5PT5BKHkpfX1mLkRlZmF1bHRIaWVyYXJjaHlQYXJhbXM9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOnt9LHJhbmtEaXJlY3Rpb246IkJUIix1c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zOiExfTtmLmJ1aWxkPWZ1bmN0aW9uKHgsQSx5KXtsZXQgdz1uZXcgdSh7cmFua2RpcjpBLnJhbmtEaXJlY3Rpb259KSxDPXt9O3JldHVybiBiLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgbm9kZXMiLDIwLCgpPT57bGV0IEc9e30sRD17fTtfLmVhY2goeC5ub2RlcyxCPT57Qi5kZXZpY2UmJihHW0IuZGV2aWNlXT0hMCk7Qi54bGFDbHVzdGVyJiYoRFtCLnhsYUNsdXN0ZXJdPSEwKX0pOwp3LmRldmljZXM9Xy5rZXlzKEcpO3cueGxhQ2x1c3RlcnM9Xy5rZXlzKEQpO2sodyx4KX0seSkudGhlbigoKT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiRGV0ZWN0IHNlcmllcyIsMjAsKCk9PnswPEEuc2VyaWVzTm9kZU1pblNpemUmJmwody5yb290LHcsQyxBLnNlcmllc05vZGVNaW5TaXplLEEuc2VyaWVzTWFwLEEudXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgZWRnZXMiLDMwLCgpPT57dCh3LHgsQyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzIiwzMCwoKT0+e3cudGVtcGxhdGVzPWQudGVtcGxhdGUuZGV0ZWN0KHcsQS52ZXJpZnlUZW1wbGF0ZSl9LHkpKS50aGVuKCgpPT53KX07Zi5qb2luQW5kQWdncmVnYXRlU3RhdHM9ZnVuY3Rpb24oeCl7bGV0IEE9e30seT17fTtfLmVhY2goeC5yb290LmxlYXZlcygpLAp3PT57dz14Lm5vZGUodyk7bnVsbCE9dy5kZXZpY2UmJihBW3cuZGV2aWNlXT0hMCk7bnVsbCE9dy54bGFDbHVzdGVyJiYoeVt3LnhsYUNsdXN0ZXJdPSEwKX0pO3guZGV2aWNlcz1fLmtleXMoQSk7eC54bGFDbHVzdGVycz1fLmtleXMoeSk7Xy5lYWNoKHguZ2V0Tm9kZU1hcCgpLHc9Pnt3LmlzR3JvdXBOb2RlJiYody5zdGF0cz1uZXcgZC5Ob2RlU3RhdHMobnVsbCksdy5kZXZpY2VIaXN0b2dyYW09e30pfSk7Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSx3PT57bGV0IEM9dz14Lm5vZGUodyk7Zm9yKDtudWxsIT1DLnBhcmVudE5vZGU7KXtpZihudWxsIT13LmRldmljZSl7dmFyIEc9Qy5wYXJlbnROb2RlLmRldmljZUhpc3RvZ3JhbTtHW3cuZGV2aWNlXT0oR1t3LmRldmljZV18fDApKzF9bnVsbCE9dy54bGFDbHVzdGVyJiYoRz1DLnBhcmVudE5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSxHW3cueGxhQ2x1c3Rlcl09KEdbdy54bGFDbHVzdGVyXXx8MCkrMSk7bnVsbCE9dy5zdGF0cyYmQy5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUody5zdGF0cyk7CkM9Qy5wYXJlbnROb2RlfX0pfTtmLmdldEluY29tcGF0aWJsZU9wcz1mdW5jdGlvbih4LEEpe2xldCB5PVtdLHc9e307Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSxDPT57Qz14Lm5vZGUoQyk7aWYoQy50eXBlPT1kLk5vZGVUeXBlLk9QKXtpZighQy5jb21wYXRpYmxlKWlmKEMub3duaW5nU2VyaWVzKWlmKEEmJkEuc2VyaWVzTWFwW0Mub3duaW5nU2VyaWVzXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApeS5wdXNoKEMpO2Vsc2V7aWYoIXdbQy5vd25pbmdTZXJpZXNdKXtsZXQgRz14Lm5vZGUoQy5vd25pbmdTZXJpZXMpO0cmJih3W0Mub3duaW5nU2VyaWVzXT1HLHkucHVzaChHKSl9fWVsc2UgeS5wdXNoKEMpO18uZWFjaChDLmluRW1iZWRkaW5ncyxHPT57Ry5jb21wYXRpYmxlfHx5LnB1c2goRyl9KTtfLmVhY2goQy5vdXRFbWJlZGRpbmdzLEc9PntHLmNvbXBhdGlibGV8fHkucHVzaChHKX0pfX0pO3JldHVybiB5fX0pKGQuaGllcmFyY2h5fHwoZC5oaWVyYXJjaHk9Cnt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sYXlvdXQuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh3KXt3Lm5vZGUuaXNHcm91cE5vZGUmJnQodyk7dy5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEE/cCh3KTp3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZtKHcpfWZ1bmN0aW9uIGsodyl7dy5pbmJveFdpZHRoPTA8dy5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP2YuUEFSQU1TLmFubm90YXRpb25zLmluYm94V2lkdGg6MDt3Lm91dGJveFdpZHRoPTA8dy5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD9mLlBBUkFNUy5hbm5vdGF0aW9ucy5vdXRib3hXaWR0aDowO3cuY29yZUJveC53aWR0aD13LndpZHRoO3cuY29yZUJveC5oZWlnaHQ9dy5oZWlnaHQ7dy53aWR0aD1NYXRoLm1heCh3LmNvcmVCb3gud2lkdGgrdy5pbmJveFdpZHRoK3cub3V0Ym94V2lkdGgsMyp3LmRpc3BsYXlOYW1lLmxlbmd0aCl9ZnVuY3Rpb24gdCh3KXtsZXQgQz13LmNvcmVHcmFwaC5ub2RlcygpLm1hcChHPT4Kdy5jb3JlR3JhcGgubm9kZShHKSkuY29uY2F0KHcuaXNvbGF0ZWRJbkV4dHJhY3Qsdy5pc29sYXRlZE91dEV4dHJhY3Qsdy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCk7Xy5lYWNoKEMsRz0+e3N3aXRjaChHLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOl8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUub3ApO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Xy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5icmlkZ2UpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOkcuZXhwYW5kZWQ/aChHKTooXy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5tZXRhKSxHLmhlaWdodD1mLlBBUkFNUy5ub2RlU2l6ZS5tZXRhLmhlaWdodChHLm5vZGUuY2FyZGluYWxpdHkpKTticmVhaztjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOkcuZXhwYW5kZWQ/KF8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKSxoKEcpKTpfLmV4dGVuZChHLEcubm9kZS5oYXNOb25Db250cm9sRWRnZXM/CmYuUEFSQU1TLm5vZGVTaXplLnNlcmllcy52ZXJ0aWNhbDpmLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuaG9yaXpvbnRhbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitHLm5vZGUudHlwZSk7fUcuZXhwYW5kZWR8fGsoRyk7bihHKX0pfWZ1bmN0aW9uIGwodyxDKXtfLmV4dGVuZCh3LmdyYXBoKCkse25vZGVzZXA6Qy5ub2RlU2VwLHJhbmtzZXA6Qy5yYW5rU2VwLGVkZ2VzZXA6Qy5lZGdlU2VwfSk7bGV0IEc9W10sRD1bXTtfLmVhY2gody5ub2RlcygpLEg9Pnt3Lm5vZGUoSCkubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5CUklER0U/Ry5wdXNoKEgpOkQucHVzaChIKX0pO2lmKCFELmxlbmd0aClyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07ZGFncmUubGF5b3V0KHcpO2xldCBCPUluZmluaXR5LEk9SW5maW5pdHksTj0tSW5maW5pdHksTz0tSW5maW5pdHk7Xy5lYWNoKEQsSD0+e0g9dy5ub2RlKEgpO3ZhciBLPS41Kkgud2lkdGgsTT1ILngtCks7Sz1ILngrSztCPU08Qj9NOkI7Tj1LPk4/SzpOO0s9LjUqSC5oZWlnaHQ7TT1ILnktSztIPUgueStLO0k9TTxJP006STtPPUg+Tz9IOk99KTtfLmVhY2gody5lZGdlcygpLEg9PntIPXcuZWRnZShIKTtpZighSC5zdHJ1Y3R1cmFsKXt2YXIgSz13Lm5vZGUoSC5tZXRhZWRnZS52KSxNPXcubm9kZShILm1ldGFlZGdlLncpO2lmKDM9PT1ILnBvaW50cy5sZW5ndGgmJkEoSC5wb2ludHMpKXtpZihudWxsIT1LKXt2YXIgTD1LLmV4cGFuZGVkP0sueDp1KEspO0gucG9pbnRzWzBdLng9TH1udWxsIT1NJiYoTD1NLmV4cGFuZGVkP00ueDp1KE0pLEgucG9pbnRzWzJdLng9TCk7SC5wb2ludHM9W0gucG9pbnRzWzBdLEgucG9pbnRzWzFdXX1MPUgucG9pbnRzW0gucG9pbnRzLmxlbmd0aC0yXTtudWxsIT1NJiYoSC5wb2ludHNbSC5wb2ludHMubGVuZ3RoLTFdPXkoTCxNKSk7TT1ILnBvaW50c1sxXTtudWxsIT1LJiYoSC5wb2ludHNbMF09eShNLEspKTtfLmVhY2goSC5wb2ludHMsUT0+e0I9US54PApCP1EueDpCO049US54Pk4/US54Ok47ST1RLnk8ST9RLnk6STtPPVEueT5PP1EueTpPfSl9fSk7Xy5lYWNoKHcubm9kZXMoKSxIPT57SD13Lm5vZGUoSCk7SC54LT1CO0gueS09SX0pO18uZWFjaCh3LmVkZ2VzKCksSD0+e18uZWFjaCh3LmVkZ2UoSCkucG9pbnRzLEs9PntLLngtPUI7Sy55LT1JfSl9KTtyZXR1cm57d2lkdGg6Ti1CLGhlaWdodDpPLUl9fWZ1bmN0aW9uIHAodyl7bGV0IEM9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YTtfLmV4dGVuZCh3LEMpO18uZXh0ZW5kKHcuY29yZUJveCxsKHcuY29yZUdyYXBoLGYuUEFSQU1TLmdyYXBoLm1ldGEpKTt2YXIgRz13Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD9fLm1heCh3Lmlzb2xhdGVkSW5FeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rz9HOjA7dy5pbkV4dHJhY3RCb3guaGVpZ2h0PV8ucmVkdWNlKHcuaXNvbGF0ZWRJbkV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6CjA7SS54PTA7SS55PUIrTitJLmhlaWdodC8yO3JldHVybiBCK04rSS5oZWlnaHR9LDApO0c9dy5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP18ubWF4KHcuaXNvbGF0ZWRPdXRFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5vdXRFeHRyYWN0Qm94LndpZHRoPW51bGwhPUc/RzowO3cub3V0RXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2Uody5pc29sYXRlZE91dEV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz13LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD9fLm1heCh3LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPUc/RzowO3cubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9Xy5yZWR1Y2Uody5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoQixJLApOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz0wOzA8dy5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCYmRysrOzA8dy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuY29yZUdyYXBoLm5vZGVDb3VudCgpJiZHKys7bGV0IEQ9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldDtHPTE+PUc/MDpHKkQ7dy5jb3JlQm94LndpZHRoKz1NYXRoLm1heChmLk1JTl9BVVhfV0lEVEgsdy5pbkV4dHJhY3RCb3gud2lkdGgrdy5vdXRFeHRyYWN0Qm94LndpZHRoKStHK3cubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCtHO3cuY29yZUJveC5oZWlnaHQ9Qy5sYWJlbEhlaWdodCtNYXRoLm1heCh3LmluRXh0cmFjdEJveC5oZWlnaHQsdy5jb3JlQm94LmhlaWdodCx3LmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0LAp3Lm91dEV4dHJhY3RCb3guaGVpZ2h0KTt3LndpZHRoPXcuY29yZUJveC53aWR0aCtDLnBhZGRpbmdMZWZ0K0MucGFkZGluZ1JpZ2h0O3cuaGVpZ2h0PXcucGFkZGluZ1RvcCt3LmNvcmVCb3guaGVpZ2h0K3cucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBtKHcpe2xldCBDPXcuY29yZUdyYXBoLEc9Zi5QQVJBTVMuc3Vic2NlbmUuc2VyaWVzO18uZXh0ZW5kKHcsRyk7Xy5leHRlbmQody5jb3JlQm94LGwody5jb3JlR3JhcGgsZi5QQVJBTVMuZ3JhcGguc2VyaWVzKSk7Xy5lYWNoKEMubm9kZXMoKSxEPT57Qy5ub2RlKEQpLmV4Y2x1ZGVkPSExfSk7dy53aWR0aD13LmNvcmVCb3gud2lkdGgrRy5wYWRkaW5nTGVmdCtHLnBhZGRpbmdSaWdodDt3LmhlaWdodD13LmNvcmVCb3guaGVpZ2h0K0cucGFkZGluZ1RvcCtHLnBhZGRpbmdCb3R0b219ZnVuY3Rpb24gbih3KXtpZighdy5leHBhbmRlZCl7dmFyIEM9dy5pbkFubm90YXRpb25zLmxpc3QsRz13Lm91dEFubm90YXRpb25zLmxpc3Q7Xy5lYWNoKEMsCks9PnEoSykpO18uZWFjaChHLEs9PnEoSykpO3ZhciBEPWYuUEFSQU1TLmFubm90YXRpb25zLEI9Xy5yZWR1Y2UoQywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0tKHcuY29yZUJveC53aWR0aCtNLndpZHRoKS8yLUQueE9mZnNldDtNLmR5PUsrTCtNLmhlaWdodC8yO3JldHVybiBLK0wrTS5oZWlnaHR9LDApO18uZWFjaChDLEs9PntLLmR5LT1CLzI7Sy5sYWJlbE9mZnNldD1ELmxhYmVsT2Zmc2V0fSk7dmFyIEk9Xy5yZWR1Y2UoRywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0ody5jb3JlQm94LndpZHRoK00ud2lkdGgpLzIrRC54T2Zmc2V0O00uZHk9SytMK00uaGVpZ2h0LzI7cmV0dXJuIEsrTCtNLmhlaWdodH0sMCk7Xy5lYWNoKEcsSz0+e0suZHktPUkvMjtLLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgTj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEIvMik7Tj0wPk4/MDpOO3ZhciBPPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLApDLmxlbmd0aC0xXSkucmFuZ2UoWy1OLE5dKTtfLmVhY2goQywoSyxNKT0+e0sucG9pbnRzPVt7ZHg6Sy5keCtLLndpZHRoLzIsZHk6Sy5keX0se2R4Oi13LmNvcmVCb3gud2lkdGgvMixkeToxPEMubGVuZ3RoP08oTSk6MH1dfSk7Tj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEkvMik7Tj0wPk4/MDpOO3ZhciBIPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLEcubGVuZ3RoLTFdKS5yYW5nZShbLU4sTl0pO18uZWFjaChHLChLLE0pPT57Sy5wb2ludHM9W3tkeDp3LmNvcmVCb3gud2lkdGgvMixkeToxPEcubGVuZ3RoP0goTSk6MH0se2R4OksuZHgtSy53aWR0aC8yLGR5OksuZHl9XX0pO3cuaGVpZ2h0PU1hdGgubWF4KHcuaGVpZ2h0LEIsSSl9fWZ1bmN0aW9uIHEodyl7c3dpdGNoKHcuYW5ub3RhdGlvblR5cGUpe2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQ6Xy5leHRlbmQodyxmLlBBUkFNUy5jb25zdGFudC5zaXplKTticmVhaztjYXNlIGQucmVuZGVyLkFubm90YXRpb25UeXBlLlNIT1JUQ1VUOmlmKHcubm9kZS50eXBlPT09CmQuTm9kZVR5cGUuT1ApXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUub3ApO2Vsc2UgaWYody5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUubWV0YSk7ZWxzZSBpZih3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTKV8uZXh0ZW5kKHcsZi5QQVJBTVMuc2hvcnRjdXRTaXplLnNlcmllcyk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBub2RlIHR5cGU6ICIrdy5ub2RlLnR5cGUpO2JyZWFrO2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWTpfLmV4dGVuZCh3LGYuUEFSQU1TLmNvbnN0YW50LnNpemUpfX1mdW5jdGlvbiB1KHcpe3JldHVybiB3LmV4cGFuZGVkP3cueDp3Lngtdy53aWR0aC8yKyh3LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/dy5pbmJveFdpZHRoOjApK3cuY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIHgodyxDKXtyZXR1cm4gMTgwKk1hdGguYXRhbigoQy55LXcueSkvKEMueC0Kdy54KSkvTWF0aC5QSX1mdW5jdGlvbiBBKHcpe2xldCBDPXgod1swXSx3WzFdKTtmb3IobGV0IEc9MTtHPHcubGVuZ3RoLTE7RysrKXtsZXQgRD14KHdbR10sd1tHKzFdKTtpZigxPE1hdGguYWJzKEQtQykpcmV0dXJuITE7Qz1EfXJldHVybiEwfWZ1bmN0aW9uIHkodyxDKXtsZXQgRz1DLmV4cGFuZGVkP0MueDp1KEMpLEQ9Qy55O3ZhciBCPXcueC1HO3c9dy55LUQ7bGV0IEk9Qy5leHBhbmRlZD9DLndpZHRoOkMuY29yZUJveC53aWR0aCxOPUMuZXhwYW5kZWQ/Qy5oZWlnaHQ6Qy5jb3JlQm94LmhlaWdodDtNYXRoLmFicyh3KSpJLzI+TWF0aC5hYnMoQikqTi8yPygwPncmJihOPS1OKSxDPTA9PT13PzA6Ti8yKkIvdyxCPU4vMik6KDA+QiYmKEk9LUkpLEM9SS8yLEI9MD09PUI/MDpJLzIqdy9CKTtyZXR1cm57eDpHK0MseTpEK0J9fWYuUEFSQU1TPXthbmltYXRpb246e2R1cmF0aW9uOjI1MH0sZ3JhcGg6e21ldGE6e25vZGVTZXA6NSxyYW5rU2VwOjI1LGVkZ2VTZXA6NX0sc2VyaWVzOntub2RlU2VwOjUsCnJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsCmxhYmVsT2Zmc2V0OjB9LHZlcnRpY2FsOnt3aWR0aDoxNixoZWlnaHQ6MTMsbGFiZWxPZmZzZXQ6LTEzfSxob3Jpem9udGFsOnt3aWR0aDoyNCxoZWlnaHQ6OCxyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6LTEwfX0sYnJpZGdlOnt3aWR0aDoyMCxoZWlnaHQ6MjAscmFkaXVzOjIsbGFiZWxPZmZzZXQ6MH19LHNob3J0Y3V0U2l6ZTp7b3A6e3dpZHRoOjEwLGhlaWdodDo0fSxtZXRhOnt3aWR0aDoxMixoZWlnaHQ6NCxyYWRpdXM6MX0sc2VyaWVzOnt3aWR0aDoxNCxoZWlnaHQ6NH19LGFubm90YXRpb25zOntpbmJveFdpZHRoOjUwLG91dGJveFdpZHRoOjUwLHhPZmZzZXQ6MTAseU9mZnNldDozLGxhYmVsT2Zmc2V0OjIsbWF4TGFiZWxXaWR0aDoxMjB9LGNvbnN0YW50OntzaXplOnt3aWR0aDo0LGhlaWdodDo0fX0sc2VyaWVzOnttYXhTdGFja0NvdW50OjMscGFyYWxsZWxTdGFja09mZnNldFJhdGlvOi4yLHRvd2VyU3RhY2tPZmZzZXRSYXRpbzouNX0sbWluaW1hcDp7c2l6ZToxNTB9fTtmLk1JTl9BVVhfV0lEVEg9CjE0MDtmLmxheW91dFNjZW5lPWg7Zi5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlPXV9KShkLmxheW91dHx8KGQubGF5b3V0PXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sb2FkZXIuanMKdmFyIFVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaD1mdW5jdGlvbihoLGssdCxsPW5ldyBkLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcixwPWQuaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMpe2NvbnN0IG09ZC51dGlsLmdldFN1YnRhc2tUcmFja2VyKGgsMjAsIkdyYXBoIiksbj1kLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpO3JldHVybiBkLnBhcnNlci5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhKGssdCxkLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCwzMCwiRGF0YSIpKS50aGVuKGZ1bmN0aW9uKHEpe2lmKCFxLm5vZGUpdGhyb3cgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CnJldHVybiBkLmJ1aWxkKHEsZC5EZWZhdWx0QnVpbGRQYXJhbXMsbSl9LCgpPT57dGhyb3cgRXJyb3IoIk1hbGZvcm1lZCBHcmFwaERlZi4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGNhdXNlZCBieSBhIGJhZCBuZXR3b3JrIGNvbm5lY3Rpb24gb3IgZGlmZmljdWx0eSByZWNvbmNpbGluZyBtdWx0aXBsZSBHcmFwaERlZnM7IGZvciB0aGUgbGF0dGVyIGNhc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkyOS4iKTt9KS50aGVuKHE9PlVpKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtkLm9wLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eShxLGwpO2NvbnN0IHU9eWllbGQgZC5oaWVyYXJjaHkuYnVpbGQocSxwLG4pO3JldHVybntncmFwaDpxLGdyYXBoSGllcmFyY2h5OnV9fSkpLmNhdGNoKHE9PntoLnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtxfWAscSk7dGhyb3cgcTsKfSl9fSkoZC5sb2FkZXJ8fChkLmxvYWRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbm9kZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayhaLGJhLGVhKXtpZihiYS5ub2RlLmlzR3JvdXBOb2RlKXtpZihiYS5leHBhbmRlZClyZXR1cm4gZi5idWlsZEdyb3VwKFosYmEsZWEsZi5DbGFzcy5TdWJzY2VuZS5HUk9VUCk7Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKS5yZW1vdmUoKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0KFosYmEpe2xldCBlYT1iYS54LWJhLndpZHRoLzIrYmEucGFkZGluZ0xlZnQ7YmE9YmEueS1iYS5oZWlnaHQvMitiYS5wYWRkaW5nVG9wO1o9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtmLnRyYW5zbGF0ZShaLGVhLGJhKX1mdW5jdGlvbiBsKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGYuQ2xhc3MuTm9kZS5CVVRUT05fQ09OVEFJTkVSKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiY2lyY2xlIixmLkNsYXNzLk5vZGUuQlVUVE9OX0NJUkNMRSk7CmYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJwYXRoIixmLkNsYXNzLk5vZGUuRVhQQU5EX0JVVFRPTikuYXR0cigiZCIsIk0wLC0yLjIgVjIuMiBNLTIuMiwwIEgyLjIiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicGF0aCIsZi5DbGFzcy5Ob2RlLkNPTExBUFNFX0JVVFRPTikuYXR0cigiZCIsIk0tMi4yLDAgSDIuMiIpO1oub24oImNsaWNrIixjYT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4cGFuZCIse25hbWU6Y2Eubm9kZS5uYW1lfSl9KTtmLnBvc2l0aW9uQnV0dG9uKFosYmEpfWZ1bmN0aW9uIHAoWixiYSxlYSxjYSl7aWYoY2EpWi5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTtlbHNle3ZhciBrYT1mLmNvbnRleHRtZW51LmdldE1lbnUoZWEsbShiYS5ub2RlLGVhKSk7Wi5vbigiZGJsY2xpY2siLFk9PntlYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdmVyIiwKWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6WS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIsWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTpZLm5vZGUubmFtZX0pfSkub24oImNsaWNrIixZPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigiY29udGV4dG1lbnUiLChZLEVhKT0+e2VhLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTpZLm5vZGUubmFtZX0pO2thLmNhbGwoWSxFYSl9KX19ZnVuY3Rpb24gbShaLGJhKXtsZXQgZWE9W3t0aXRsZTooKT0+ZC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhaLmluY2x1ZGUpLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4dHJhY3QiLHtuYW1lOloubmFtZX0pfX1dO2JhLm5vZGVDb250ZXh0TWVudUl0ZW1zJiYoZWE9ZWEuY29uY2F0KGJhLm5vZGVDb250ZXh0TWVudUl0ZW1zKSk7Cm4oWikmJmVhLnB1c2goe3RpdGxlOigpPT54KFopLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpxKFopfSl9fSk7cmV0dXJuIGVhfWZ1bmN0aW9uIG4oWil7cmV0dXJuIG51bGwhPT1xKFopfWZ1bmN0aW9uIHEoWil7cmV0dXJuIFo/Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Wi5uYW1lOloudHlwZT09PWQuTm9kZVR5cGUuT1A/Wi5vd25pbmdTZXJpZXM6bnVsbDpudWxsfWZ1bmN0aW9uIHUoWil7bGV0IGJhPW51bGw7aWYoIVopcmV0dXJuIG51bGw7Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/YmE9WjpaLnBhcmVudE5vZGUmJloucGFyZW50Tm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJihiYT1aLnBhcmVudE5vZGUpO3JldHVybiBiYX1mdW5jdGlvbiB4KFope3JldHVybiBiLmdyYXBoLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZyhudWxsIT09dShaKT9iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDoKYi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCl9ZnVuY3Rpb24gQShaLGJhLGVhKXt2YXIgY2E9YmEuZGlzcGxheU5hbWU7bGV0IGthPWJhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmIWJhLmV4cGFuZGVkO1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInRleHQiLGYuQ2xhc3MuTm9kZS5MQUJFTCk7bGV0IFk9Wi5ub2RlKCk7WS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKFkpO1ouYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIik7a2EmJihjYS5sZW5ndGg+ZWEubWF4TWV0YW5vZGVMYWJlbExlbmd0aCYmKGNhPWNhLnN1YnN0cigwLGVhLm1heE1ldGFub2RlTGFiZWxMZW5ndGgtMikrIi4uLiIpLGVhPXcoZWEpLFouYXR0cigiZm9udC1zaXplIixlYShjYS5sZW5ndGgpKyJweCIpKTtjYT1aLnRleHQoY2EpO3koY2EsYmEubm9kZS50eXBlLGJhKTtyZXR1cm4gWn1mdW5jdGlvbiB5KFosYmEsZWEpe2xldCBjYT1aLm5vZGUoKTt2YXIga2E9CmNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO2xldCBZPWNhLnRleHRDb250ZW50LEVhPW51bGw7c3dpdGNoKGJhKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTplYSYmIWVhLmV4cGFuZGVkJiYoRWE9ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLk9QOkVhPWQubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5vcC5tYXhMYWJlbFdpZHRoO2JyZWFrO2Nhc2UgLTE6RWE9ZC5sYXlvdXQuUEFSQU1TLmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYoIShudWxsPT09RWF8fGthPD1FYSkpe2ZvcihrYT0xO2NhLmdldFN1YlN0cmluZ0xlbmd0aCgwLGthKTxFYTspa2ErKztiYT1jYS50ZXh0Q29udGVudC5zdWJzdHIoMCxrYSk7ZG8gYmE9YmEuc3Vic3RyKDAsYmEubGVuZ3RoLTEpLGNhLnRleHRDb250ZW50PWJhKyIuLi4iLGthPWNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO3doaWxlKGthPkVhJiYwPGJhLmxlbmd0aCk7cmV0dXJuIFouYXBwZW5kKCJ0aXRsZSIpLnRleHQoWSl9fQpmdW5jdGlvbiB3KFope2FhfHwoYWE9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW1oubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCxaLm1heE1ldGFub2RlTGFiZWxMZW5ndGhdKS5yYW5nZShbWi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUsWi5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpO3JldHVybiBhYX1mdW5jdGlvbiBDKFosYmEsZWEsY2Epe2Yuc2VsZWN0Q2hpbGQoWiwidGV4dCIsZi5DbGFzcy5Ob2RlLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsYmEpLmF0dHIoInkiLGVhK2NhKX1mdW5jdGlvbiBHKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGVhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6YmE9YmEubm9kZTtpZihfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIoYmEuZnVuY3Rpb25PdXRwdXRJbmRleCkpe2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoicG9seWdvbiIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWt9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImVsbGlwc2UiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9ImFubm90YXRpb24iO2JhLmNvcmVHcmFwaCYmKGVhPWJhLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKTtsZXQgY2E9W2YuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVRdO2JhLmlzRmFkZWRPdXQmJmNhLnB1c2goImZhZGVkLWVsbGlwc2UiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwidXNlIixjYSkuYXR0cigieGxpbms6aHJlZiIsIiNvcC1zZXJpZXMtIitlYSsiLXN0YW1wIik7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInJlY3QiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixiYS5yYWRpdXMpLmF0dHIoInJ5IixiYS5yYWRpdXMpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosCiJyZWN0IixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsYmEucmFkaXVzKS5hdHRyKCJyeSIsYmEucmFkaXVzKTticmVhaztjYXNlIGQuTm9kZVR5cGUuTUVUQTpmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicmVjdCIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGJhLnJhZGl1cykuYXR0cigicnkiLGJhLnJhZGl1cyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO31yZXR1cm4gWn1mdW5jdGlvbiBEKFope3N3aXRjaChaLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOnJldHVybiBmLkNsYXNzLk9QTk9ERTtjYXNlIGQuTm9kZVR5cGUuTUVUQTpyZXR1cm4gZi5DbGFzcy5NRVRBTk9ERTtjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOnJldHVybiBmLkNsYXNzLlNFUklFU05PREU7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpyZXR1cm4gZi5DbGFzcy5CUklER0VOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5FTExJUFNJUzpyZXR1cm4gZi5DbGFzcy5FTExJUFNJU05PREV9dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrCloubm9kZS50eXBlKTt9ZnVuY3Rpb24gQihaLGJhKXt2YXIgZWE9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLk5vZGUuU0hBUEUpO2xldCBjYT1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKGJhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6e2NvbnN0IGthPWJhLm5vZGU7Xy5pc051bWJlcihrYS5mdW5jdGlvbklucHV0SW5kZXgpfHxfLmlzTnVtYmVyKGthLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyhlYT1mLnNlbGVjdENoaWxkKGVhLCJwb2x5Z29uIiksZi5wb3NpdGlvblRyaWFuZ2xlKGVhLGJhLngsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSk6KGVhPWYuc2VsZWN0Q2hpbGQoZWEsImVsbGlwc2UiKSxmLnBvc2l0aW9uRWxsaXBzZShlYSxjYSxiYS55LGJhLmNvcmVCb3gud2lkdGgsYmEuY29yZUJveC5oZWlnaHQpKTtDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBkLk5vZGVUeXBlLk1FVEE6ZWE9CmVhLnNlbGVjdEFsbCgicmVjdCIpO2JhLmV4cGFuZGVkPyhmLnBvc2l0aW9uUmVjdChlYSxiYS54LGJhLnksYmEud2lkdGgsYmEuaGVpZ2h0KSx0KFosYmEpLEMoWixjYSxiYS55LC1iYS5oZWlnaHQvMitiYS5sYWJlbEhlaWdodC8yKSk6KGYucG9zaXRpb25SZWN0KGVhLGNhLGJhLnksYmEuY29yZUJveC53aWR0aCxiYS5jb3JlQm94LmhlaWdodCksQyhaLGNhLGJhLnksMCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9Zi5zZWxlY3RDaGlsZChlYSwidXNlIik7YmEuZXhwYW5kZWQ/KGYucG9zaXRpb25SZWN0KGVhLGJhLngsYmEueSxiYS53aWR0aCxiYS5oZWlnaHQpLHQoWixiYSksQyhaLGNhLGJhLnksLWJhLmhlaWdodC8yK2JhLmxhYmVsSGVpZ2h0LzIpKTooZi5wb3NpdGlvblJlY3QoZWEsY2EsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSxDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Wj0KZi5zZWxlY3RDaGlsZChlYSwicmVjdCIpO2YucG9zaXRpb25SZWN0KFosYmEueCxiYS55LGJhLndpZHRoLGJhLmhlaWdodCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO319ZnVuY3Rpb24gSShaLGJhLGVhKXtsZXQgY2E9Yi5ncmFwaC51dGlsLmVzY2FwZVF1ZXJ5U2VsZWN0b3IoWik7aWYoIWVhKXJldHVybmB1cmwoIyR7Y2F9KWA7ZWE9ZDMuc2VsZWN0KGVhKTtsZXQga2E9ZWEuc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKTtrYS5lbXB0eSgpJiYoa2E9ZWEuYXBwZW5kKCJkZWZzIikuYXR0cigiaWQiLCJfZ3JhcGgtZ3JhZGllbnRzIikpO2xldCBZPWthLnNlbGVjdCgibGluZWFyR3JhZGllbnQjIitjYSk7aWYoWS5lbXB0eSgpKXtZPWthLmFwcGVuZCgibGluZWFyR3JhZGllbnQiKS5hdHRyKCJpZCIsWik7WS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgRWE9MDtfLmVhY2goYmEsdmE9PntsZXQgeGE9CnZhLmNvbG9yO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSkuYXR0cigic3RvcC1jb2xvciIseGEpO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSt2YS5wcm9wb3J0aW9uKS5hdHRyKCJzdG9wLWNvbG9yIix4YSk7RWErPXZhLnByb3BvcnRpb259KX1yZXR1cm5gdXJsKCMke2NhfSlgfWZ1bmN0aW9uIE4oWixiYSxlYSxjYSxrYSl7bGV0IFk9ZC5yZW5kZXIuTWV0YW5vZGVDb2xvcnM7c3dpdGNoKGJhKXtjYXNlIGxhLlNUUlVDVFVSRTpyZXR1cm4gZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBPyhiYT1lYS5ub2RlLnRlbXBsYXRlSWQsbnVsbD09PWJhP1kuVU5LTk9XTjpZLlNUUlVDVFVSRV9QQUxFVFRFKFooYmEpLGNhKSk6ZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Y2E/WS5FWFBBTkRFRF9DT0xPUjoid2hpdGUiOmVhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuQlJJREdFP2VhLnN0cnVjdHVyYWw/IiNmMGUiOmVhLm5vZGUuaW5ib3VuZD8KIiMwZWYiOiIjZmUwIjpfLmlzTnVtYmVyKGVhLm5vZGUuZnVuY3Rpb25JbnB1dEluZGV4KT8iIzc5NTU0OCI6Xy5pc051bWJlcihlYS5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgbGEuREVWSUNFOnJldHVybiBudWxsPT1lYS5kZXZpY2VDb2xvcnM/WS5VTktOT1dOOmNhP1kuRVhQQU5ERURfQ09MT1I6SSgiZGV2aWNlLSIrZWEubm9kZS5uYW1lLGVhLmRldmljZUNvbG9ycyxrYSk7Y2FzZSBsYS5YTEFfQ0xVU1RFUjpyZXR1cm4gbnVsbD09ZWEueGxhQ2x1c3RlckNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJ4bGEtIitlYS5ub2RlLm5hbWUsZWEueGxhQ2x1c3RlckNvbG9ycyxrYSk7Y2FzZSBsYS5DT01QVVRFX1RJTUU6cmV0dXJuIGNhP1kuRVhQQU5ERURfQ09MT1I6ZWEuY29tcHV0ZVRpbWVDb2xvcnx8WS5VTktOT1dOO2Nhc2UgbGEuTUVNT1JZOnJldHVybiBjYT9ZLkVYUEFOREVEX0NPTE9SOmVhLm1lbW9yeUNvbG9yfHwKWS5VTktOT1dOO2Nhc2UgbGEuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09ZWEuY29tcGF0aWJpbGl0eUNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJvcC1jb21wYXQtIitlYS5ub2RlLm5hbWUsZWEuY29tcGF0aWJpbGl0eUNvbG9ycyxrYSk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5rbm93biBjYXNlIHRvIGNvbG9yIG5vZGVzIGJ5Iik7fX1mdW5jdGlvbiBPKFosYmEsZWEsY2Epe2NhPWNhfHxmLkNsYXNzLk5vZGUuU0hBUEU7bGV0IGthPWVhLmlzTm9kZVNlbGVjdGVkKGJhLm5vZGUubmFtZSksWT1iYS5pc0luRXh0cmFjdHx8YmEuaXNPdXRFeHRyYWN0fHxiYS5pc0xpYnJhcnlGdW5jdGlvbixFYT1iYS5leHBhbmRlZCYmY2EhPT1mLkNsYXNzLkFubm90YXRpb24uTk9ERSx2YT1iYS5pc0ZhZGVkT3V0O1ouY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLGVhLmlzTm9kZUhpZ2hsaWdodGVkKGJhLm5vZGUubmFtZSkpO1ouY2xhc3NlZCgic2VsZWN0ZWQiLGthKTsKWi5jbGFzc2VkKCJleHRyYWN0IixZKTtaLmNsYXNzZWQoImV4cGFuZGVkIixFYSk7Wi5jbGFzc2VkKCJmYWRlZCIsdmEpO1o9Wi5zZWxlY3QoIi4iK2NhKyIgLiIrZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YmE9TihlYS50ZW1wbGF0ZUluZGV4LGxhW2VhLmNvbG9yQnkudG9VcHBlckNhc2UoKV0sYmEsRWEsZWEuZ2V0R3JhcGhTdmdSb290KCkpO1ouc3R5bGUoImZpbGwiLGJhKTtaLnN0eWxlKCJzdHJva2UiLGthP251bGw6SChiYSkpfWZ1bmN0aW9uIEgoWil7cmV0dXJuInVybCI9PT1aLnN1YnN0cmluZygwLDMpP2QucmVuZGVyLk1ldGFub2RlQ29sb3JzLkdSQURJRU5UX09VVExJTkU6ZDMucmdiKFopLmRhcmtlcigpLnRvU3RyaW5nKCl9ZnVuY3Rpb24gSyhaLGJhKXtsZXQgZWE9W107Wj1iYS5nZXROb2RlQnlOYW1lKFopO2lmKFogaW5zdGFuY2VvZiBiLmdyYXBoLk9wTm9kZUltcGwpcmV0dXJuW1pdLmNvbmNhdChaLmluRW1iZWRkaW5ncyk7Wj1aLm1ldGFncmFwaC5ub2RlcygpOwpfLmVhY2goWixmdW5jdGlvbihjYSl7ZWE9ZWEuY29uY2F0KEsoY2EsYmEpKX0pO3JldHVybiBlYX1mdW5jdGlvbiBNKFosYmEsZWEsY2Epe2lmKGNhW2VhLm5hbWVdKXJldHVybiBjYTtjYVtlYS5uYW1lXT0hMDt2YXIga2E9ZWEuaW5wdXRzO2xldCBZPVgoYmEsZWEpO2QzLnNlbGVjdChaKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtZLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRWE9e307Xy5lYWNoKGthLGZ1bmN0aW9uKEFhKXtBYT1iYS5nZXROb2RlQnlOYW1lKEFhLm5hbWUpO2lmKHZvaWQgMCE9PUFhKXtBYSBpbnN0YW5jZW9mIGQuTWV0YW5vZGVJbXBsJiYoQWE9Yi5ncmFwaC5nZXRTdHJpY3ROYW1lKEFhLm5hbWUpLEFhPWJhLmdldE5vZGVCeU5hbWUoQWEpKTt2YXIgRmE9WChiYSxBYSkseWE9RWFbRmEubmFtZV07eWE/eWEub3BOb2Rlcy5wdXNoKEFhKTpFYVtGYS5uYW1lXT17dmlzaWJsZVBhcmVudDpGYSxvcE5vZGVzOltBYV19fX0pOwpsZXQgdmE9e30seGE9W1ldO3ZhW1kubmFtZV09e3RyYWNlZDohMSxpbmRleDowLGNvbm5lY3Rpb25FbmRwb2ludHM6W119O2VhPVk7Zm9yKGthPTE7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FO2thKyspZWE9ZWEucGFyZW50Tm9kZSx2YVtlYS5uYW1lXT17dHJhY2VkOiExLGluZGV4OmthLGNvbm5lY3Rpb25FbmRwb2ludHM6W119LHhhW2thXT1lYTtfLmZvck93bihFYSxmdW5jdGlvbihBYSl7bGV0IEZhPUFhLnZpc2libGVQYXJlbnQ7Xy5lYWNoKEFhLm9wTm9kZXMsZnVuY3Rpb24oeWEpe2NhPU0oWixiYSx5YSxjYSl9KTtGYS5uYW1lIT09WS5uYW1lJiZMKFosRmEsdmEseGEpfSk7cmV0dXJuIGNhfWZ1bmN0aW9uIEwoWixiYSxlYSxjYSl7dmFyIGthPWJhLFk9YmE7Zm9yKGJhPVtdOyFlYVtrYS5uYW1lXTspWS5uYW1lIT09a2EubmFtZSYmYmEucHVzaChbWSxrYV0pLFk9a2Esa2E9a2EucGFyZW50Tm9kZTtlYT1lYVtrYS5uYW1lXS5pbmRleDtsZXQgRWE9Y2FbTWF0aC5tYXgoZWEtCjEsMCldLm5hbWU7WT1rYT1ZLm5hbWU7Y29uc3QgdmE9ZDMuc2VsZWN0KFopO3ZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtZfS0tJHtFYX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCk7Xy5lYWNoKGJhLGZ1bmN0aW9uKHhhKXt2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7eGFbMF0ubmFtZX0tLSR7RWF9YCtgfn4ke3hhWzFdLm5hbWV9fn5PVVQiXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9KTtmb3IoWj0xO1o8ZWE7WisrKXZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtrYX1+fiR7Y2FbWl0ubmFtZX1gK2B+fklOLS0ke2NhW1otMV0ubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9ZnVuY3Rpb24gUShaLGJhKXtsZXQgZWE9e307Xy5lYWNoKGJhLGZ1bmN0aW9uKGNhKXtjYT1aLmdldE5vZGVCeU5hbWUoY2EpO2NhPVgoWixjYSk7ZWFbY2EubmFtZV09Y2F9KTtyZXR1cm4gZWF9ZnVuY3Rpb24gVChaLApiYSl7Xy5mb3JPd24oYmEsZnVuY3Rpb24oZWEpe2Zvcig7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FOyl7Y29uc3QgY2E9ZDMuc2VsZWN0KFopLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke2VhLm5hbWV9Il1gKTshY2Eubm9kZXMoKS5sZW5ndGh8fGNhLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIpfHxjYS5jbGFzc2VkKCJzZWxlY3RlZCIpfHxjYS5jbGFzc2VkKCJvcCIpfHxjYS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCEwKTtlYT1lYS5wYXJlbnROb2RlfX0pfWZ1bmN0aW9uIFgoWixiYSl7bGV0IGVhPSExLGNhPWJhO2Zvcig7IWVhOylpZihiYT1jYSxjYT1iYS5wYXJlbnROb2RlLHZvaWQgMD09PWNhKWVhPSEwO2Vsc2V7bGV0IGthPVouZ2V0UmVuZGVyTm9kZUJ5TmFtZShjYS5uYW1lKTtrYSYmKGthLmV4cGFuZGVkfHxjYSBpbnN0YW5jZW9mIGQuT3BOb2RlSW1wbCkmJihlYT0hMCl9cmV0dXJuIGJhfWguYnVpbGRHcm91cD1mdW5jdGlvbihaLGJhLGVhKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoiZyIsZi5DbGFzcy5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoYmEsY2E9PmNhLm5vZGUubmFtZSsiOiIrY2Eubm9kZS50eXBlKTtaLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIixjYT0+Y2Eubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO2VhLmFkZE5vZGVHcm91cChjYS5ub2RlLm5hbWUsa2EpfSkubWVyZ2UoWikuYXR0cigiY2xhc3MiLGNhPT5mLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoY2EpKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO3ZhciBZPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChrYSwiZyIsZi5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKTtmLmFubm90YXRpb24uYnVpbGRHcm91cChZLGNhLmluQW5ub3RhdGlvbnMsY2EsZWEpO1k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKGthLCJnIixmLkNsYXNzLkFubm90YXRpb24uT1VUQk9YKTsKZi5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWSxjYS5vdXRBbm5vdGF0aW9ucyxjYSxlYSk7WT1HKGthLGNhLGYuQ2xhc3MuTm9kZS5TSEFQRSk7Y2Eubm9kZS5pc0dyb3VwTm9kZSYmbChZLGNhLGVhKTtwKFksY2EsZWEpO2soa2EsY2EsZWEpO1k9QShrYSxjYSxlYSk7cChZLGNhLGVhLGNhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSk7TyhrYSxjYSxlYSk7QihrYSxjYSl9KTtaLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKGNhKXtlYS5yZW1vdmVOb2RlR3JvdXAoY2Eubm9kZS5uYW1lKTtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpOzA8Y2EuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCYma2Euc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uSU5CT1gpLnNlbGVjdEFsbCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKFk9PntlYS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoWSxjYSl9KTswPGNhLm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoJiZrYS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5PVVRCT1gpLnNlbGVjdEFsbCgiLiIrCmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaChZPT57ZWEucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFksY2EpfSl9KS5yZW1vdmUoKTtyZXR1cm4gWn07aC5nZXRDb250ZXh0TWVudT1tO2guY2FuQmVJblNlcmllcz1uO2guZ2V0U2VyaWVzTmFtZT1xO2guZ2V0R3JvdXBTZXR0aW5nTGFiZWw9eDtoLmVuZm9yY2VMYWJlbFdpZHRoPXk7bGV0IGFhPW51bGw7aC5idWlsZFNoYXBlPUc7aC5ub2RlQ2xhc3M9RDtsZXQgbGE7KGZ1bmN0aW9uKFope1pbWi5TVFJVQ1RVUkU9MF09IlNUUlVDVFVSRSI7WltaLkRFVklDRT0xXT0iREVWSUNFIjtaW1ouWExBX0NMVVNURVI9Ml09IlhMQV9DTFVTVEVSIjtaW1ouQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO1pbWi5NRU1PUlk9NF09Ik1FTU9SWSI7WltaLk9QX0NPTVBBVElCSUxJVFk9NV09Ik9QX0NPTVBBVElCSUxJVFkifSkobGE9aC5Db2xvckJ5fHwoaC5Db2xvckJ5PXt9KSk7aC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zPWZ1bmN0aW9uKFope2QzLnNlbGVjdChaKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTsKaC5nZXRGaWxsRm9yTm9kZT1OO2guc3R5bGl6ZT1PO2guZ2V0U3Ryb2tlRm9yRmlsbD1IO2gudXBkYXRlSW5wdXRUcmFjZT1mdW5jdGlvbihaLGJhLGVhLGNhKXtjb25zdCBrYT1kMy5zZWxlY3QoWik7a2Euc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIubm9uLWlucHV0IikuY2xhc3NlZCgibm9uLWlucHV0IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtY2hpbGQiKS5jbGFzc2VkKCJpbnB1dC1jaGlsZCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiLAohMSk7aWYoYmEmJmNhJiZlYSl7ZWE9SyhlYSxiYSk7dmFyIFk9e307Xy5lYWNoKGVhLGZ1bmN0aW9uKEVhKXtZPU0oWixiYSxFYSxZKX0pO2VhPU9iamVjdC5rZXlzKFkpO2VhPVEoYmEsZWEpO1QoWixlYSk7a2Euc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goZnVuY3Rpb24oRWEpe2thLnNlbGVjdEFsbChgW2RhdGEtbmFtZT0iJHtFYS5ub2RlLm5hbWV9Il1gKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKX0pO2thLnNlbGVjdEFsbCgiZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpIikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9fTtoLmdldFZpc2libGVQYXJlbnQ9WH0pKGYubm9kZXx8KGYubm9kZT17fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fAooYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9vcC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2lzTm90VHB1T3Aoayl7cmV0dXJuLTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKT8hMDotMT09ay50b0xvd2VyQ2FzZSgpLnNlYXJjaCgidHB1Iil9b3BWYWxpZChrKXtyZXR1cm4gMD09ay5uYW1lLnNlYXJjaChkLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfHwhay5vcHx8ay5kZXZpY2UmJnRoaXMuaXNOb3RUcHVPcChrLmRldmljZSl8fGsuZGV2aWNlJiYtMSE9ay5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIik/ITA6Xy5pbmNsdWRlcyhoLldISVRFTElTVCxrLm9wKX19aC5XSElURUxJU1Q9IkFicyBBY29zIEFjb3NoIEFkZCBBZGROIEFkanVzdENvbnRyYXN0djIgQWRqdXN0SHVlIEFkanVzdFNhdHVyYXRpb24gQWxsIEFuZ2xlIEFueSBBcHByb3hpbWF0ZUVxdWFsIEFyZ01heCBBcmdNaW4gQXNpbiBBc2luaCBBc3NlcnQgQXNzaWduQWRkVmFyaWFibGVPcCBBc3NpZ25TdWJWYXJpYWJsZU9wIEFzc2lnblZhcmlhYmxlT3AgQXRhbiBBdGFuMiBBdGFuaCBBdmdQb29sIEF2Z1Bvb2wzRCBBdmdQb29sM0RHcmFkIEF2Z1Bvb2xHcmFkIEJhdGNoTWF0TXVsIEJhdGNoVG9TcGFjZSBCYXRjaFRvU3BhY2VORCBCaWFzQWRkIEJpYXNBZGRHcmFkIEJpYXNBZGRWMSBCaXRjYXN0IEJpdHdpc2VBbmQgQml0d2lzZU9yIEJpdHdpc2VYb3IgQnJvYWRjYXN0QXJncyBCcm9hZGNhc3RHcmFkaWVudEFyZ3MgQnVja2V0aXplIENhc3QgQ2VpbCBDaGVja051bWVyaWNzIENob2xlc2t5IENsaXBCeVZhbHVlIENvbXBsZXggQ29tcGxleEFicyBDb25jYXQgQ29uY2F0T2Zmc2V0IENvbmNhdFYyIENvbmogQ29uanVnYXRlVHJhbnNwb3NlIENvbnN0IENvbnRyb2xUcmlnZ2VyIENvbnYyRCBDb252MkRCYWNrcHJvcEZpbHRlciBDb252MkRCYWNrcHJvcElucHV0IENvbnYzRCBDb252M0RCYWNrcHJvcEZpbHRlclYyIENvbnYzREJhY2twcm9wSW5wdXRWMiBDb3MgQ29zaCBDcm9zcyBDcm9zc1JlcGxpY2FTdW0gQ3VtcHJvZCBDdW1zdW0gRGVwdGhUb1NwYWNlIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IERpYWcgRGlhZ1BhcnQgRGlnYW1tYSBEaXYgRHluYW1pY1N0aXRjaCBFbHUgRWx1R3JhZCBFbXB0eSBFcXVhbCBFcmYgRXJmYyBFeHAgRXhwYW5kRGltcyBFeHBtMSBFeHRyYWN0SW1hZ2VQYXRjaGVzIEZGVCBGRlQyRCBGRlQzRCBGYWtlUXVhbnRXaXRoTWluTWF4QXJncyBGYWtlUXVhbnRXaXRoTWluTWF4QXJnc0dyYWRpZW50IEZha2VRdWFudFdpdGhNaW5NYXhWYXJzIEZha2VRdWFudFdpdGhNaW5NYXhWYXJzR3JhZGllbnQgRmlsbCBGbG9vciBGbG9vckRpdiBGbG9vck1vZCBGdXNlZEJhdGNoTm9ybSBGdXNlZEJhdGNoTm9ybUdyYWQgRnVzZWRCYXRjaE5vcm1HcmFkVjIgRnVzZWRCYXRjaE5vcm1WMiBHYXRoZXIgR2F0aGVyTmQgR2F0aGVyVjIgR2V0SXRlbSBHcmVhdGVyIEdyZWF0ZXJFcXVhbCBIU1ZUb1JHQiBJRkZUIElGRlQyRCBJRkZUM0QgSVJGRlQgSVJGRlQyRCBJUkZGVDNEIElkZW50aXR5IElkZW50aXR5TiBJZiBJbWFnIEluZmVlZERlcXVldWUgSW5mZWVkRGVxdWV1ZVR1cGxlIElucGxhY2VBZGQgSW5wbGFjZVVwZGF0ZSBJbnYgSW52ZXJ0IEludmVydFBlcm11dGF0aW9uIElzRmluaXRlIElzSW5mIElzTmFuIEwyTG9zcyBMUk4gTFJOR3JhZCBMZWZ0U2hpZnQgTGVzcyBMZXNzRXF1YWwgTGdhbW1hIExpblNwYWNlIExpc3REaWZmIExvZyBMb2cxcCBMb2dTb2Z0bWF4IExvZ2ljYWxBbmQgTG9naWNhbE5vdCBMb2dpY2FsT3IgTWF0TXVsIE1hdHJpeEJhbmRQYXJ0IE1hdHJpeERpYWcgTWF0cml4RGlhZ1BhcnQgTWF0cml4U2V0RGlhZyBNYXRyaXhUcmlhbmd1bGFyU29sdmUgTWF4IE1heFBvb2wgTWF4UG9vbDNEIE1heFBvb2wzREdyYWQgTWF4UG9vbDNER3JhZEdyYWQgTWF4UG9vbEdyYWQgTWF4UG9vbEdyYWRHcmFkIE1heFBvb2xHcmFkR3JhZFYyIE1heFBvb2xHcmFkVjIgTWF4UG9vbFYyIE1heGltdW0gTWVhbiBNaW4gTWluaW11bSBNaXJyb3JQYWQgTW9kIE11bCBNdWx0aW5vbWlhbCBOZWcgTm9PcCBOb25NYXhTdXBwcmVzc2lvblY0IE5vdEVxdWFsIE9uZUhvdCBPbmVzTGlrZSBPdXRmZWVkRW5xdWV1ZSBPdXRmZWVkRW5xdWV1ZVR1cGxlIFBhY2sgUGFkIFBhZFYyIFBhcmFsbGVsRHluYW1pY1N0aXRjaCBQbGFjZWhvbGRlcldpdGhEZWZhdWx0IFBvdyBQcmV2ZW50R3JhZGllbnQgUHJvZCBRciBRdWFudGl6ZUFuZERlcXVhbnRpemVWMiBRdWFudGl6ZUFuZERlcXVhbnRpemVWMyBSRkZUIFJGRlQyRCBSRkZUM0QgUkdCVG9IU1YgUmFuZG9tU2h1ZmZsZSBSYW5kb21TdGFuZGFyZE5vcm1hbCBSYW5kb21Vbmlmb3JtIFJhbmRvbVVuaWZvcm1JbnQgUmFuZ2UgUmFuayBSZWFkVmFyaWFibGVPcCBSZWFsIFJlYWxEaXYgUmVjaXByb2NhbCBSZWNpcHJvY2FsR3JhZCBSZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgUmVsdSBSZWx1NiBSZWx1NkdyYWQgUmVsdUdyYWQgUmVzaGFwZSBSZXNpemVCaWxpbmVhciBSZXNpemVCaWxpbmVhckdyYWQgUmVzb3VyY2VBcHBseUFkYU1heCBSZXNvdXJjZUFwcGx5QWRhZGVsdGEgUmVzb3VyY2VBcHBseUFkYWdyYWQgUmVzb3VyY2VBcHBseUFkYWdyYWREQSBSZXNvdXJjZUFwcGx5QWRhbSBSZXNvdXJjZUFwcGx5QWRkU2lnbiBSZXNvdXJjZUFwcGx5Q2VudGVyZWRSTVNQcm9wIFJlc291cmNlQXBwbHlGdHJsIFJlc291cmNlQXBwbHlGdHJsVjIgUmVzb3VyY2VBcHBseUdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5TW9tZW50dW0gUmVzb3VyY2VBcHBseVBvd2VyU2lnbiBSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIFJlc291cmNlQXBwbHlQcm94aW1hbEdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5Uk1TUHJvcCBSZXNvdXJjZUdhdGhlciBSZXNvdXJjZVNjYXR0ZXJBZGQgUmVzb3VyY2VTY2F0dGVyRGl2IFJlc291cmNlU2NhdHRlck1heCBSZXNvdXJjZVNjYXR0ZXJNaW4gUmVzb3VyY2VTY2F0dGVyTXVsIFJlc291cmNlU2NhdHRlck5kQWRkIFJlc291cmNlU2NhdHRlck5kVXBkYXRlIFJlc291cmNlU2NhdHRlclN1YiBSZXNvdXJjZVNjYXR0ZXJVcGRhdGUgUmVzb3VyY2VTdHJpZGVkU2xpY2VBc3NpZ24gUmV2ZXJzZSBSZXZlcnNlU2VxdWVuY2UgUmV2ZXJzZVYyIFJpZ2h0U2hpZnQgUmludCBSb3VuZCBSc3FydCBSc3FydEdyYWQgU2NhdHRlck5kIFNlbGVjdCBTZWx1IFNlbHVHcmFkIFNlbmRUUFVFbWJlZGRpbmdHcmFkaWVudHMgU2hhcGUgU2hhcGVOIFNpZ21vaWQgU2lnbW9pZEdyYWQgU2lnbiBTaW4gU2luaCBTaXplIFNsaWNlIFNuYXBzaG90IFNvZnRtYXggU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU29mdHBsdXMgU29mdHBsdXNHcmFkIFNvZnRzaWduIFNvZnRzaWduR3JhZCBTcGFjZVRvQmF0Y2ggU3BhY2VUb0JhdGNoTkQgU3BhY2VUb0RlcHRoIFNwYXJzZU1hdE11bCBTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyBTcGFyc2VUb0RlbnNlIFNwbGl0IFNwbGl0ViBTcXJ0IFNxcnRHcmFkIFNxdWFyZSBTcXVhcmVkRGlmZmVyZW5jZSBTcXVlZXplIFN0YWNrQ2xvc2VWMiBTdGFja1BvcFYyIFN0YWNrUHVzaFYyIFN0YWNrVjIgU3RhdGVsZXNzSWYgU3RhdGVsZXNzUmFuZG9tTm9ybWFsIFN0YXRlbGVzc1JhbmRvbVVuaWZvcm0gU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIFN0YXRlbGVzc1doaWxlIFN0b3BHcmFkaWVudCBTdHJpZGVkU2xpY2UgU3RyaWRlZFNsaWNlR3JhZCBTdWIgU3VtIFN5bWJvbGljR3JhZGllbnQgVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgVGFuIFRhbmggVGFuaEdyYWQgVGVuc29yQXJyYXlDbG9zZVYzIFRlbnNvckFycmF5Q29uY2F0VjMgVGVuc29yQXJyYXlHYXRoZXJWMyBUZW5zb3JBcnJheUdyYWRWMyBUZW5zb3JBcnJheVJlYWRWMyBUZW5zb3JBcnJheVNjYXR0ZXJWMyBUZW5zb3JBcnJheVNpemVWMyBUZW5zb3JBcnJheVNwbGl0VjMgVGVuc29yQXJyYXlWMyBUZW5zb3JBcnJheVdyaXRlVjMgVGlsZSBUb3BLVjIgVHJhbnNwb3NlIFRydW5jYXRlRGl2IFRydW5jYXRlTW9kIFRydW5jYXRlZE5vcm1hbCBVbnBhY2sgVW5zb3J0ZWRTZWdtZW50TWF4IFVuc29ydGVkU2VnbWVudE1pbiBVbnNvcnRlZFNlZ21lbnRQcm9kIFVuc29ydGVkU2VnbWVudFN1bSBWYXJJc0luaXRpYWxpemVkT3AgVmFyaWFibGVTaGFwZSBXaGlsZSBYbGFEeW5hbWljVXBkYXRlU2xpY2UgWGxhSG9zdENvbXB1dGUgWGxhSWYgWGxhUmVjdiBYbGFSZWR1Y2VXaW5kb3cgWGxhU2VuZCBYbGFTb3J0IFhsYVdoaWxlIFplcm9zTGlrZSBFbnRlciBFeGl0IExvb3BDb25kIE1lcmdlIE5leHRJdGVyYXRpb24gU3dpdGNoIF9BcmcgX1BhcmFsbGVsQ29uY2F0VXBkYXRlIF9SZXR2YWwgX1RQVUNvbXBpbGUgX1RQVUV4ZWN1dGUgVFBVQ29tcGlsYXRpb25SZXN1bHQgVFBVUmVwbGljYXRlZElucHV0IFRQVVJlcGxpY2F0ZWRPdXRwdXQgVFBVUmVwbGljYXRlTWV0YWRhdGEgTWVyZ2VWMkNoZWNrcG9pbnRzIFJlc3RvcmVWMiBTYXZlVjIgQWJvcnQgQXNzZXJ0IEFzc2lnbiBQbGFjZWhvbGRlciBQbGFjZWhvbGRlclYyIFNoYXJkZWRGaWxlbmFtZSBTdHJpbmdKb2luIFZhcmlhYmxlIFZhcmlhYmxlVjIgVmFySGFuZGxlT3AgQXVkaW9TdW1tYXJ5IEF1ZGlvU3VtbWFyeVYyIERlYnVnTnVtZXJpY1N1bW1hcnkgSGlzdG9ncmFtU3VtbWFyeSBJbWFnZVN1bW1hcnkgTWVyZ2VTdW1tYXJ5IFNjYWxhclN1bW1hcnkgU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSIuc3BsaXQoIiAiKTsKZi5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXI9aDtmLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eT1mdW5jdGlvbihrLHQpe2lmKG51bGw9PT10KXRocm93IEVycm9yKCJDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK3QpO18uZWFjaChrLm5vZGVzLGw9PntsLmNvbXBhdGlibGU9dC5vcFZhbGlkKGwpO18uZWFjaChsLmluRW1iZWRkaW5ncyxwPT57cC5jb21wYXRpYmxlPXQub3BWYWxpZChwKX0pO18uZWFjaChsLm91dEVtYmVkZGluZ3MscD0+e3AuY29tcGF0aWJsZT10Lm9wVmFsaWQocCl9KX0pfX0pKGQub3B8fChkLm9wPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9wYXJzZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh1KXtpZigidHJ1ZSI9PT11KXJldHVybiEwO2lmKCJmYWxzZSI9PT11KXJldHVybiExO2lmKCciJz09PXVbMF0pcmV0dXJuIHUuc3Vic3RyaW5nKDEsdS5sZW5ndGgtMSk7bGV0IHg9cGFyc2VGbG9hdCh1KTtyZXR1cm4gaXNOYU4oeCk/dTp4fWZ1bmN0aW9uIGsodSl7cmV0dXJuIG5ldyBQcm9taXNlKCh4LEEpPT57ZmV0Y2godSkudGhlbih5PT57eS5vaz95LmFycmF5QnVmZmVyKCkudGhlbih4LEEpOnkudGV4dCgpLnRoZW4oQSxBKX0pfSl9ZnVuY3Rpb24gdCh1LHgsQT0xRTYseT0iXG4iKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odyxDKXtmdW5jdGlvbiBHKEQsQixJKXt2YXIgTj1JPj11LmJ5dGVMZW5ndGg7Qj1CLnNwbGl0KHkpO0JbMF09RCtCWzBdO2NvbnN0IE89Tj8iIjpCLnBvcCgpO2ZvcihsZXQgSCBvZiBCKXRyeXt4KEgpfWNhdGNoKEspe0MoSyk7cmV0dXJufU4/dyghMCk6CihEPW5ldyBCbG9iKFt1LnNsaWNlKEksSStBKV0pLE49bmV3IEZpbGVSZWFkZXIsTi5vbmxvYWQ9ZnVuY3Rpb24oSCl7RyhPLEgudGFyZ2V0LnJlc3VsdCxJK0EpfSxOLnJlYWRBc1RleHQoRCkpfUcoIiIsIiIsMCl9KX1mdW5jdGlvbiBsKHUpe3JldHVybiBtKHUsbil9ZnVuY3Rpb24gcCh1KXtyZXR1cm4gbSh1LHEpLnRoZW4oeD0+eC5zdGVwX3N0YXRzKX1mdW5jdGlvbiBtKHUseCl7ZnVuY3Rpb24gQShCKXtsZXQgST1CLmluZGV4T2YoIjoiKSxOPUIuc3Vic3RyaW5nKDAsSSkudHJpbSgpO0I9aChCLnN1YnN0cmluZyhJKzIpLnRyaW0oKSk7cmV0dXJue25hbWU6Tix2YWx1ZTpCfX1mdW5jdGlvbiB5KEIsSSxOLE8pe2xldCBIPUJbSV07bnVsbD09SD9CW0ldPU8uam9pbigiLiIpaW4geD9bTl06TjpBcnJheS5pc0FycmF5KEgpP0gucHVzaChOKTpCW0ldPVtILE5dfWxldCB3PXt9LEM9W10sRz1bXSxEPXc7cmV0dXJuIHQodSxmdW5jdGlvbihCKXtpZihCKXN3aXRjaChCPUIudHJpbSgpLApCW0IubGVuZ3RoLTFdKXtjYXNlICJ7IjpCPUIuc3Vic3RyaW5nKDAsQi5sZW5ndGgtMikudHJpbSgpO2xldCBJPXt9O0MucHVzaChEKTtHLnB1c2goQik7eShELEIsSSxHKTtEPUk7YnJlYWs7Y2FzZSAifSI6RD1DLnBvcCgpO0cucG9wKCk7YnJlYWs7ZGVmYXVsdDpCPUEoQikseShELEIubmFtZSxCLnZhbHVlLEcuY29uY2F0KEIubmFtZSkpfX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gd30pfWYuZmV0Y2hQYlR4dD1rO2YuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhPWZ1bmN0aW9uKHUseCl7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5UYXNrKCgpPT5udWxsPT11P1Byb21pc2UucmVzb2x2ZShudWxsKTprKHUpLHgpLnRoZW4oQT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgbWV0YWRhdGEucGJ0eHQiLDYwLCgpPT5udWxsIT1BP3AoQSk6UHJvbWlzZS5yZXNvbHZlKG51bGwpLHgpKX07Zi5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gYi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlJlYWRpbmcgZ3JhcGggcGJ0eHQiLAo0MCwoKT0+eD9uZXcgUHJvbWlzZShmdW5jdGlvbih5LHcpe2xldCBDPW5ldyBGaWxlUmVhZGVyO0Mub25sb2FkPSgpPT55KEMucmVzdWx0KTtDLm9uZXJyb3I9KCk9PncoQy5lcnJvcik7Qy5yZWFkQXNBcnJheUJ1ZmZlcih4KX0pOmsodSksQSkudGhlbih5PT5iLmdyYXBoLnV0aWwucnVuQXN5bmNQcm9taXNlVGFzaygiUGFyc2luZyBncmFwaC5wYnR4dCIsNjAsKCk9PmwoeSksQSkpfTtmLnN0cmVhbVBhcnNlPXQ7Y29uc3Qgbj17ImxpYnJhcnkuZnVuY3Rpb24iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5pbnB1dCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZnVuYyI6ITAsCiJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5pIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QucyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLnNpZ25hdHVyZS5pbnB1dF9hcmciOiEwLAoibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUub3V0cHV0X2FyZyI6ITAsImxpYnJhcnkudmVyc2lvbnMiOiEwLG5vZGU6ITAsIm5vZGUuaW5wdXQiOiEwLCJub2RlLmF0dHIiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5iIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5pIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QucyI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwfSxxPXsic3RlcF9zdGF0cy5kZXZfc3RhdHMiOiEwLAoic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5tZW1vcnkiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltIjohMH07Zi5wYXJzZUdyYXBoUGJUeHQ9bDtmLnBhcnNlU3RhdHNQYlR4dD1wfSkoZC5wYXJzZXJ8fChkLnBhcnNlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcHJvdG8uanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcmVuZGVyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoTCxRLFQsWCxhYSl7UT1uZXcgSShRLFQsWCxhYSwhMCk7TC5pbkFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gayhMLFEsVCxYLGFhKXtRPW5ldyBJKFEsVCxYLGFhLCExKTtMLm91dEFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gdChMLFEpe18uZWFjaChMLm5vZGVzKCksVD0+e1Q9TC5ub2RlKFQpO1QuZXhwYW5kZWQ9MTxRO2lmKDA8USlzd2l0Y2goVC5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmNhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6bChULFEtMSl9fSl9ZnVuY3Rpb24gbChMLFEpe0wuY29yZUdyYXBoJiZ0KEwuY29yZUdyYXBoLFEpfWZ1bmN0aW9uIHAoTCxRLFQpe2xldCBYPUwubm9kZShRKSxhYT1MLm5vZGUoVCksbGE9TC5lZGdlKFEsVCk7aWYoWC5ub2RlLmluY2x1ZGUhPT1kLkluY2x1c2lvblR5cGUuSU5DTFVERSYmYWEubm9kZS5pbmNsdWRlIT09ZC5JbmNsdXNpb25UeXBlLklOQ0xVREV8fApYLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxhYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSlrKFgsYWEubm9kZSxhYSxsYSxOLlNIT1JUQ1VUKSxoKGFhLFgubm9kZSxYLGxhLE4uU0hPUlRDVVQpLEwucmVtb3ZlRWRnZShRLFQpfWZ1bmN0aW9uIG0oTCxRLFQpe2xldCBYPUwuY29yZUdyYXBoLGFhPVgubm9kZShRKTthYS5pc091dEV4dHJhY3Q9ITA7Xy5lYWNoKFgucHJlZGVjZXNzb3JzKFEpLGxhPT57cChYLGxhLFEpfSk7KEcuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxUKSYmXy5lYWNoKFguc3VjY2Vzc29ycyhRKSxsYT0+e3AoWCxRLGxhKX0pOzA9PT1YLm5laWdoYm9ycyhRKS5sZW5ndGgmJihhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBuKEwsUSxUKXtsZXQgWD1MLmNvcmVHcmFwaCxhYT0KWC5ub2RlKFEpO2FhLmlzSW5FeHRyYWN0PSEwO18uZWFjaChYLnN1Y2Nlc3NvcnMoUSksbGE9PntwKFgsUSxsYSl9KTsoRy5kZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWV8fFQpJiZfLmVhY2goWC5wcmVkZWNlc3NvcnMoUSksbGE9PntwKFgsbGEsUSl9KTswPT09WC5uZWlnaGJvcnMoUSkubGVuZ3RoJiYoYWEubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLEwuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBxKEwsUSl7aWYoTC50eXBlPT09ZC5Ob2RlVHlwZS5PUClmb3IodmFyIFQ9MDtUPFEubGVuZ3RoO1QrKyl7aWYoTC5vcD09PVFbVF0pcmV0dXJuITB9ZWxzZSBpZihMLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJihMPUwuZ2V0Um9vdE9wKCkpKWZvcihUPTA7VDxRLmxlbmd0aDtUKyspaWYoTC5vcD09PVFbVF0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdShMKXtsZXQgUT1MLmNvcmVHcmFwaDtfLmVhY2goUS5ub2RlcygpLApUPT57US5ub2RlKFQpLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxULnN0YXJ0c1dpdGgoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8KEwuY29yZUdyYXBoLm91dEVkZ2VzKFQpLmxlbmd0aD5MLmNvcmVHcmFwaC5pbkVkZ2VzKFQpLmxlbmd0aD9tKEwsVCwhMCk6bihMLFQsITApKX0pfWZ1bmN0aW9uIHgoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLm91dEV4dHJhY3RUeXBlcykmJm0oTCxUKX0pfWZ1bmN0aW9uIEEoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLmluRXh0cmFjdFR5cGVzKSYmbihMLFQpfSl9ZnVuY3Rpb24geShMKXtsZXQgUT0KTC5jb3JlR3JhcGgsVD17fSxYPXt9LGFhPTA7Xy5lYWNoKFEubm9kZXMoKSxrYT0+e2lmKFEubm9kZShrYSkubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEKXt2YXIgWT1fLnJlZHVjZShRLnByZWRlY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZSh4YSxrYSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PVkmJjA8US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCYmKFk9US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCk7dmFyIEVhPV8ucmVkdWNlKFEuc3VjY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZShrYSx4YSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PUVhJiYwPFEuc3VjY2Vzc29ycyhrYSkubGVuZ3RoJiYoRWE9US5zdWNjZXNzb3JzKGthKS5sZW5ndGgpO1Rba2FdPVk7WFtrYV09RWE7YWErK319KTtpZighKGFhPEcubWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbikpe3ZhciBsYT0KRy5taW5EZWdyZWVGb3JFeHRyYWN0aW9uLTEsWj1NYXRoLnJvdW5kKC43NSphYSksYmE9TWF0aC5yb3VuZCguMjUqYWEpLGVhPU9iamVjdC5rZXlzKFQpLnNvcnQoKGthLFkpPT5UW2thXS1UW1ldKSxjYT1UW2VhW1pdXTtjYT1jYStjYS1UW2VhW2JhXV07Y2E9TWF0aC5tYXgoY2EsbGEpO2ZvcihsZXQga2E9YWEtMTtUW2VhW2thXV0+Y2E7a2EtLSluKEwsZWFba2FdKTtlYT1PYmplY3Qua2V5cyhYKS5zb3J0KChrYSxZKT0+WFtrYV0tWFtZXSk7Wj1YW2VhW1pdXTtiYT1aKzQqKFotWFtlYVtiYV1dKTtiYT1NYXRoLm1heChiYSxsYSk7Zm9yKGxhPWFhLTE7WFtlYVtsYV1dPmJhO2xhLS0pKFo9US5ub2RlKGVhW2xhXSkpJiYhWi5pc0luRXh0cmFjdCYmbShMLGVhW2xhXSl9fWZ1bmN0aW9uIHcoTCl7bGV0IFE9TC5jb3JlR3JhcGgsVD17fTtfLmVhY2goUS5lZGdlcygpLFg9PntRLmVkZ2UoWCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKFRbWC52XT1UW1gudl18fFtdKS5wdXNoKFgpLAooVFtYLnddPVRbWC53XXx8W10pLnB1c2goWCkpfSk7Xy5lYWNoKFQsWD0+e1gubGVuZ3RoPkcubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKFgsYWE9PnAoUSxhYS52LGFhLncpKX0pfWZ1bmN0aW9uIEMoTCl7dShMKTtHLm91dEV4dHJhY3RUeXBlcyYmeChMKTtHLmluRXh0cmFjdFR5cGVzJiZBKEwpO3koTCk7Ry5tYXhDb250cm9sRGVncmVlJiZ3KEwpO2xldCBRPUwuY29yZUdyYXBoO18uZWFjaChRLm5vZGVzKCksVD0+e2xldCBYPVEubm9kZShUKTt2YXIgYWE9US5uZWlnaGJvcnMoVCkubGVuZ3RoO2lmKFgubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09YWEpe2FhPTA8WC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDtsZXQgbGE9MDxYLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7WC5pc0luRXh0cmFjdD8oTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6ClguaXNPdXRFeHRyYWN0PyhMLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6Ry5leHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSYmKGFhJiYhbGE/KFguaXNJbkV4dHJhY3Q9ITAsTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6bGEmJiFhYSYmKFguaXNPdXRFeHRyYWN0PSEwLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goWCksWC5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUS5yZW1vdmVOb2RlKFQpKSl9fSl9Zi5PcE5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2ZmZmZmZiIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIiLENPTVBBVElCTEU6IiMwZjlkNTgiLElOQ09NUEFUSUJMRToiI2RiNDQzNyJ9O2YuTWV0YW5vZGVDb2xvcnM9CntERUZBVUxUX0ZJTEw6IiNkOWQ5ZDkiLERFRkFVTFRfU1RST0tFOiIjYTZhNmE2IixTQVRVUkFUSU9OOi42LExJR0hUTkVTUzouODUsRVhQQU5ERURfQ09MT1I6IiNmMGYwZjAiLEhVRVM6WzIyMCwxMDAsMTgwLDQwLDIwLDM0MCwyNjAsMzAwLDE0MCw2MF0sU1RSVUNUVVJFX1BBTEVUVEUoTCxRKXt2YXIgVD1mLk1ldGFub2RlQ29sb3JzLkhVRVM7TD1UW0wlVC5sZW5ndGhdO1Q9TWF0aC5zaW4oTCpNYXRoLlBJLzM2MCk7cmV0dXJuIGQzLmhzbChMLC4wMSooUT8zMDo5MC02MCpUKSwuMDEqKFE/OTU6ODApKS50b1N0cmluZygpfSxERVZJQ0VfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sWExBX0NMVVNURVJfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sVU5LTk9XTjoiI2VlZSIsR1JBRElFTlRfT1VUTElORToiIzg4OCJ9O2YuU2VyaWVzTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiJ3aGl0ZSIsCkRFRkFVTFRfU1RST0tFOiIjYjJiMmIyIn07Y29uc3QgRz17ZW5hYmxlRXh0cmFjdGlvbjohMCxtaW5Ob2RlQ291bnRGb3JFeHRyYWN0aW9uOjE1LG1pbkRlZ3JlZUZvckV4dHJhY3Rpb246NSxtYXhDb250cm9sRGVncmVlOjQsbWF4QnJpZGdlUGF0aERlZ3JlZTo0LG91dEV4dHJhY3RUeXBlczpbIk5vT3AiXSxpbkV4dHJhY3RUeXBlczpbXSxkZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWU6ITAsZXh0cmFjdElzb2xhdGVkTm9kZXNXaXRoQW5ub3RhdGlvbnNPbk9uZVNpZGU6ITAsZW5hYmxlQnJpZGdlZ3JhcGg6ITAsbWluTWF4Q29sb3JzOlsiI2ZmZjVmMCIsIiNmYjZhNGEiXSxtYXhBbm5vdGF0aW9uczo1fSxEPW5ldyBSZWdFeHAoIl4oPzoiK2IuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCsiKT8oXFx3KylfW2EtejAtOV17OH0oPzpfXFxkKyk/JCIpO2NsYXNzIEJ7Y29uc3RydWN0b3IoTCxRKXt0aGlzLmhpZXJhcmNoeT1MO3RoaXMuZGlzcGxheWluZ1N0YXRzPQpRO3RoaXMuaW5kZXg9e307dGhpcy5yZW5kZXJlZE9wTmFtZXM9W107dGhpcy5jb21wdXRlU2NhbGVzKCk7dGhpcy5oYXNTdWJoaWVyYXJjaHk9e307dGhpcy5yb290PW5ldyBNKEwucm9vdCxMLmdyYXBoT3B0aW9ucyk7dGhpcy5pbmRleFtMLnJvb3QubmFtZV09dGhpcy5yb290O3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTC5yb290Lm5hbWUpO3RoaXMuYnVpbGRTdWJoaWVyYXJjaHkoTC5yb290Lm5hbWUpO3RoaXMucm9vdC5leHBhbmRlZD0hMDt0aGlzLnRyYWNlSW5wdXRzPSExfWNvbXB1dGVTY2FsZXMoKXt0aGlzLmRldmljZUNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShfLm1hcChkMy5yYW5nZSh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCksZi5NZXRhbm9kZUNvbG9ycy5ERVZJQ0VfUEFMRVRURSkpO3RoaXMueGxhQ2x1c3RlckNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSwKZi5NZXRhbm9kZUNvbG9ycy5YTEFfQ0xVU1RFUl9QQUxFVFRFKSk7bGV0IEw9dGhpcy5oaWVyYXJjaHkucm9vdC5tZXRhZ3JhcGg7dmFyIFE9ZDMubWF4KEwubm9kZXMoKSxUPT57VD1MLm5vZGUoVCk7aWYobnVsbCE9VC5zdGF0cylyZXR1cm4gVC5zdGF0cy50b3RhbEJ5dGVzfSk7dGhpcy5tZW1vcnlVc2FnZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFFdKS5yYW5nZShHLm1pbk1heENvbG9ycyk7UT1kMy5tYXgoTC5ub2RlcygpLFQ9PntUPUwubm9kZShUKTtpZihudWxsIT1ULnN0YXRzKXJldHVybiBULnN0YXRzLmdldFRvdGFsTWljcm9zKCl9KTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUV0pLnJhbmdlKEcubWluTWF4Q29sb3JzKTt0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/ZC5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwKdGhpcy5oaWVyYXJjaHkubWF4TWV0YUVkZ2VTaXplXSkucmFuZ2UoW2Quc2NlbmUuZWRnZS5NSU5fRURHRV9XSURUSCxkLnNjZW5lLmVkZ2UuTUFYX0VER0VfV0lEVEhdKX1nZXRSZW5kZXJOb2RlQnlOYW1lKEwpe3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5vZGVCeU5hbWUoTCl7cmV0dXJuIHRoaXMuaGllcmFyY2h5Lm5vZGUoTCl9Y29sb3JIaXN0b2dyYW0oTCxRKXtpZigwPE9iamVjdC5rZXlzKEwpLmxlbmd0aCl7Y29uc3QgVD1fLnN1bShPYmplY3Qua2V5cyhMKS5tYXAoWD0+TFtYXSkpO3JldHVybiBPYmplY3Qua2V5cyhMKS5tYXAoWD0+KHtjb2xvcjpRKFgpLHByb3BvcnRpb246TFtYXS9UfSkpfWNvbnNvbGUuaW5mbygibm8gcGFpcnMgZm91bmQhIik7cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKEwpe2lmKCFMKXJldHVybiBudWxsO2lmKEwgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFtMXTt2YXIgUT10aGlzLmhpZXJhcmNoeS5ub2RlKEwpOwppZighUSlyZXR1cm4gbnVsbDtsZXQgVD1RLmlzR3JvdXBOb2RlP25ldyBNKFEsdGhpcy5oaWVyYXJjaHkuZ3JhcGhPcHRpb25zKTpuZXcgSChRKTt0aGlzLmluZGV4W0xdPVQ7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChMKTtRLnN0YXRzJiYoVC5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoUS5zdGF0cy50b3RhbEJ5dGVzKSxULmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKFEuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpO1QuaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWIuZ3JhcGgudXRpbC5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhRLnN0YXRzKTt2YXIgWD1udWxsLGFhPW51bGwsbGE9bnVsbDtpZihRLmlzR3JvdXBOb2RlKXtYPVEuZGV2aWNlSGlzdG9ncmFtO2FhPVEueGxhQ2x1c3Rlckhpc3RvZ3JhbTt2YXIgWj1RLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtRPVEuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CmlmKDAhPVp8fDAhPVEpbGE9Wi8oWitRKX1lbHNlKFo9VC5ub2RlLmRldmljZSkmJihYPXtbWl06MX0pLChaPVQubm9kZS54bGFDbHVzdGVyKSYmKGFhPXtbWl06MX0pLFQubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5PUCYmKGxhPVQubm9kZS5jb21wYXRpYmxlPzE6MCk7WCYmKFQuZGV2aWNlQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0oWCx0aGlzLmRldmljZUNvbG9yTWFwKSk7YWEmJihULnhsYUNsdXN0ZXJDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShhYSx0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpO251bGwhPWxhJiYoVC5jb21wYXRpYmlsaXR5Q29sb3JzPVt7Y29sb3I6Yi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUscHJvcG9ydGlvbjpsYX0se2NvbG9yOmIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEUscHJvcG9ydGlvbjoxLWxhfV0pO3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoTCl7dmFyIFE9CmQuZ2V0SGllcmFyY2hpY2FsUGF0aChMKTtsZXQgVD0wLFg9bnVsbDtmb3IoO1Q8US5sZW5ndGgmJihMPVFbVF0sWD10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTCksWC5leHBhbmRlZCk7VCsrKTtyZXR1cm4gVD09US5sZW5ndGgtMiYmKFE9UVtUKzFdLFguaW5Bbm5vdGF0aW9ucy5ub2RlTmFtZXNbUV18fFgub3V0QW5ub3RhdGlvbnMubm9kZU5hbWVzW1FdKT9ROkx9c2V0RGVwdGgoTCl7bCh0aGlzLnJvb3QsK0wpfWlzTm9kZUF1eGlsaWFyeShMKXtsZXQgUT10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTC5ub2RlLnBhcmVudE5vZGUubmFtZSksVD1fLmZpbmQoUS5pc29sYXRlZEluRXh0cmFjdCxYPT5YLm5vZGUubmFtZT09PUwubm9kZS5uYW1lKTtpZihUKXJldHVybiEwO1Q9Xy5maW5kKFEuaXNvbGF0ZWRPdXRFeHRyYWN0LFg9Plgubm9kZS5uYW1lPT09TC5ub2RlLm5hbWUpO3JldHVybiEhVH1nZXROYW1lc09mUmVuZGVyZWRPcHMoKXtyZXR1cm4gdGhpcy5yZW5kZXJlZE9wTmFtZXN9Y2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShMLApRLFQsWCl7dmFyIGFhPVQubmFtZS5yZXBsYWNlKFEsWCk7bGV0IGxhPUwubWV0YWdyYXBoLm5vZGUoYWEpO2lmKGxhKXJldHVybiBsYTtsYT1uZXcgZC5PcE5vZGVJbXBsKHtuYW1lOmFhLGlucHV0OltdLGRldmljZTpULmRldmljZSxvcDpULm9wLGF0dHI6Xy5jbG9uZURlZXAoVC5hdHRyKX0pO2xhLmNhcmRpbmFsaXR5PVQuY2FyZGluYWxpdHk7bGEuaW5jbHVkZT1ULmluY2x1ZGU7bGEub3V0cHV0U2hhcGVzPV8uY2xvbmVEZWVwKFQub3V0cHV0U2hhcGVzKTtsYS54bGFDbHVzdGVyPVQueGxhQ2x1c3RlcjtsYS5mdW5jdGlvbklucHV0SW5kZXg9VC5mdW5jdGlvbklucHV0SW5kZXg7bGEuZnVuY3Rpb25PdXRwdXRJbmRleD1ULmZ1bmN0aW9uT3V0cHV0SW5kZXg7bGEuaW5wdXRzPVQuaW5wdXRzLm1hcChaPT57Y29uc3QgYmE9Xy5jbG9uZShaKTtiYS5uYW1lPVoubmFtZS5yZXBsYWNlKFEsWCk7cmV0dXJuIGJhfSk7bGEucGFyZW50Tm9kZT1MO0wubWV0YWdyYXBoLnNldE5vZGUobGEubmFtZSwKbGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUobGEubmFtZSxsYSk7YWE9Wj0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsUSxaLFgpO2xhLmluRW1iZWRkaW5ncz1ULmluRW1iZWRkaW5ncy5tYXAoYWEpO2xhLm91dEVtYmVkZGluZ3M9VC5vdXRFbWJlZGRpbmdzLm1hcChhYSk7cmV0dXJuIGxhfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoTCxRLFQsWCxhYSl7Y29uc3QgbGE9e307TD10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLFQsWCxhYSxsYSk7Xy5pc0VtcHR5KGxhKXx8dGhpcy5wYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhRLGxhKTtyZXR1cm4gTH1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUSxULFgsYWEsbGEpe2NvbnN0IFo9Yi5ncmFwaC5jcmVhdGVNZXRhbm9kZShULm5hbWUucmVwbGFjZShYLGFhKSk7Wi5kZXB0aD1ULmRlcHRoO1ouY2FyZGluYWxpdHk9VC5jYXJkaW5hbGl0eTtaLnRlbXBsYXRlSWQ9ClQudGVtcGxhdGVJZDtaLm9wSGlzdG9ncmFtPV8uY2xvbmUoVC5vcEhpc3RvZ3JhbSk7Wi5kZXZpY2VIaXN0b2dyYW09Xy5jbG9uZShULmRldmljZUhpc3RvZ3JhbSk7Wi54bGFDbHVzdGVySGlzdG9ncmFtPV8uY2xvbmUoVC54bGFDbHVzdGVySGlzdG9ncmFtKTtaLmhhc05vbkNvbnRyb2xFZGdlcz1ULmhhc05vbkNvbnRyb2xFZGdlcztaLmluY2x1ZGU9VC5pbmNsdWRlO1oubm9kZUF0dHJpYnV0ZXM9Xy5jbG9uZShULm5vZGVBdHRyaWJ1dGVzKTtaLmFzc29jaWF0ZWRGdW5jdGlvbj1ULmFzc29jaWF0ZWRGdW5jdGlvbjtfLmVhY2goVC5tZXRhZ3JhcGgubm9kZXMoKSxiYT0+e2JhPVQubWV0YWdyYXBoLm5vZGUoYmEpO3N3aXRjaChiYS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTpiYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLGJhLFgsYWEsbGEpO2JhLnBhcmVudE5vZGU9WjtaLm1ldGFncmFwaC5zZXROb2RlKGJhLm5hbWUsYmEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoYmEubmFtZSwKYmEpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5PUDpiYT10aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoWixYLGJhLGFhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCkmJnRoaXMucGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhRLGJhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uT3V0cHV0SW5kZXgpJiYobGFbYmEuZnVuY3Rpb25PdXRwdXRJbmRleF09YmEpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKGJhLm5hbWUrIiBpcyBvZGRseSBuZWl0aGVyIGEgbWV0YW5vZGUgbm9yIGFuIG9wbm9kZS4iKX19KTt0aGlzLmNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoVCxaLFgsYWEpO3JldHVybiBafWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoTCxRLFQsWCl7Xy5lYWNoKEwubWV0YWdyYXBoLmVkZ2VzKCksYWE9PnthYT1MLm1ldGFncmFwaC5lZGdlKGFhKTtjb25zdCBsYT1hYS52LnJlcGxhY2UoVCxYKSxaPWFhLncucmVwbGFjZShULFgpLGJhPW5ldyBkLk1ldGFlZGdlSW1wbChsYSwKWik7YmEuaW5ib3VuZD1hYS5pbmJvdW5kO2JhLm51bVJlZ3VsYXJFZGdlcz1hYS5udW1SZWd1bGFyRWRnZXM7YmEubnVtQ29udHJvbEVkZ2VzPWFhLm51bUNvbnRyb2xFZGdlcztiYS5udW1SZWZFZGdlcz1hYS5udW1SZWZFZGdlcztiYS50b3RhbFNpemU9YWEudG90YWxTaXplO2FhLmJhc2VFZGdlTGlzdCYmKGJhLmJhc2VFZGdlTGlzdD1hYS5iYXNlRWRnZUxpc3QubWFwKGVhPT57Y29uc3QgY2E9Xy5jbG9uZShlYSk7Y2Eudj1lYS52LnJlcGxhY2UoVCxYKTtjYS53PWVhLncucmVwbGFjZShULFgpO3JldHVybiBjYX0pKTtRLm1ldGFncmFwaC5ub2RlKFopP1EubWV0YWdyYXBoLnNldEVkZ2UobGEsWixiYSk6US5tZXRhZ3JhcGguc2V0RWRnZShaLGxhLGJhKX0pfXBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoTCxRKXtsZXQgVD1NYXRoLm1pbihRLmZ1bmN0aW9uSW5wdXRJbmRleCxMLmlucHV0cy5sZW5ndGgtMSk7Zm9yKHZhciBYPV8uY2xvbmUoTC5pbnB1dHNbVF0pO1guaXNDb250cm9sRGVwZW5kZW5jeTspVCsrLApYPUwuaW5wdXRzW1RdO1EuaW5wdXRzLnB1c2goWCk7WD10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnMoTC5uYW1lKTtsZXQgYWEsbGE9MDtfLmVhY2goWC5yZWd1bGFyLFo9PntsYSs9Wi5udW1SZWd1bGFyRWRnZXM7aWYobGE+VClyZXR1cm4gYWE9WiwhMX0pO18uZWFjaChhYS5iYXNlRWRnZUxpc3QsWj0+e1oudz09PUwubmFtZSYmKFoudz1RLm5hbWUpO1oudj09PUwubmFtZSYmKFoudj1RLm5hbWUpfSl9cGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoTCxRKXtjb25zdCBUPXRoaXMuaGllcmFyY2h5LmdldFN1Y2Nlc3NvcnMoTC5uYW1lKTtfLmVhY2goVC5yZWd1bGFyLFg9PntfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9Pntjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKGFhLncpO18uZWFjaChsYS5pbnB1dHMsWj0+e1oubmFtZT09PUwubmFtZSYmKFoubmFtZT1RW1oub3V0cHV0VGVuc29yS2V5XS5uYW1lLFoub3V0cHV0VGVuc29yS2V5PWFhLm91dHB1dFRlbnNvcktleSl9KX0pOwpfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9PnthYS52PVFbYWEub3V0cHV0VGVuc29yS2V5XS5uYW1lO2FhLm91dHB1dFRlbnNvcktleT0iMCJ9KX0pfWJ1aWxkU3ViaGllcmFyY2h5KEwpe2lmKCEoTCBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSkpe3RoaXMuaGFzU3ViaGllcmFyY2h5W0xdPSEwO3ZhciBRPXRoaXMuaW5kZXhbTF07aWYoUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEF8fFEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpe3ZhciBUPVEubm9kZS5tZXRhZ3JhcGgsWD1RLmNvcmVHcmFwaCxhYT1bXSxsYT1bXTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fChfLmVhY2goVC5ub2RlcygpLHhhPT57Y29uc3QgQWE9VC5ub2RlKHhhKSxGYT10aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW0FhLm9wXTtGYSYmMCE9PXhhLmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHhhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShULApBYSxGYS5ub2RlLEZhLm5vZGUubmFtZSxBYS5uYW1lKSxhYS5wdXNoKEFhKSxsYS5wdXNoKHhhKSl9KSxfLmVhY2gobGEsKHhhLEFhKT0+e0FhPWFhW0FhXTt4YS5wYXJlbnROb2RlPUFhLnBhcmVudE5vZGU7VC5zZXROb2RlKEFhLm5hbWUseGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoQWEubmFtZSx4YSl9KSk7Xy5lYWNoKFQubm9kZXMoKSx4YT0+e2xldCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YSksRmE9QWEubm9kZTtYLnNldE5vZGUoeGEsQWEpO0ZhLmlzR3JvdXBOb2RlfHwoXy5lYWNoKEZhLmluRW1iZWRkaW5ncyx5YT0+e2xldCBTYT1uZXcgSyhudWxsKSxYYT1uZXcgSCh5YSk7aChBYSx5YSxYYSxTYSxOLkNPTlNUQU5UKTt0aGlzLmluZGV4W3lhLm5hbWVdPVhhfSksXy5lYWNoKEZhLm91dEVtYmVkZGluZ3MseWE9PntsZXQgU2E9bmV3IEsobnVsbCksWGE9bmV3IEgoeWEpO2soQWEseWEsWGEsU2EsTi5TVU1NQVJZKTt0aGlzLmluZGV4W3lhLm5hbWVdPQpYYX0pKX0pO18uZWFjaChULmVkZ2VzKCkseGE9Pnt2YXIgQWE9VC5lZGdlKHhhKTtBYT1uZXcgSyhBYSk7QWEuaXNGYWRlZE91dD10aGlzLmluZGV4W3hhLnZdLmlzRmFkZWRPdXR8fHRoaXMuaW5kZXhbeGEud10uaXNGYWRlZE91dDtYLnNldEVkZ2UoeGEudix4YS53LEFhKX0pO0cuZW5hYmxlRXh0cmFjdGlvbiYmUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJkMoUSk7Xy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHx0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoVCk7TD09PWIuZ3JhcGguUk9PVF9OQU1FJiZfLmZvck93bih0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zLHhhPT57eGE9eGEubm9kZTtjb25zdCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YS5uYW1lKTtRLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LnB1c2goQWEpO0FhLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERTsKWC5yZW1vdmVOb2RlKHhhLm5hbWUpfSk7dmFyIFo9US5ub2RlLnBhcmVudE5vZGU7aWYoWil7dmFyIGJhPXRoaXMuaW5kZXhbWi5uYW1lXSxlYT0oeGEsLi4uQWEpPT5BYS5jb25jYXQoW3hhPyJJTiI6Ik9VVCJdKS5qb2luKCJ+fiIpLGNhPXRoaXMuaGllcmFyY2h5LmdldEJyaWRnZWdyYXBoKEwpLGthPXt9LFk9e30sRWE9e307Xy5lYWNoKGNhLmVkZ2VzKCkseGE9PntsZXQgQWE9ISFULm5vZGUoeGEudyksRmE9QWE/eGEudjp4YS53O2NhLmVkZ2UoeGEpLm51bVJlZ3VsYXJFZGdlcz9BYT9ZW0ZhXT0oWVtGYV18fDApKzE6a2FbRmFdPShrYVtGYV18fDApKzE6RWFbRmFdPShFYVtGYV18fDApKzF9KTt2YXIgdmE9dGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO18uZWFjaChjYS5lZGdlcygpLHhhPT57dmFyIEFhPWNhLmVkZ2UoeGEpO2xldCBGYT0hIVQubm9kZSh4YS53KSxbeWEsU2FdPUZhP1t4YS53LHhhLnZdOlt4YS52LHhhLnddO3ZhciBYYT10aGlzLmluZGV4W3lhXSx1Yj10aGlzLmluZGV4W1NhXSwKQmI9dWI/dWIubm9kZTp2YVtTYV0scWI9IUFhLm51bVJlZ3VsYXJFZGdlcyYmRWFbU2FdPkcubWF4Q29udHJvbERlZ3JlZSxbLHpiXT1GYT9bUS5pbkFubm90YXRpb25zLFhhLmluQW5ub3RhdGlvbnNdOltRLm91dEFubm90YXRpb25zLFhhLm91dEFubm90YXRpb25zXTtsZXQgdmI9KEZhP1k6a2EpW1NhXT5HLm1heEJyaWRnZVBhdGhEZWdyZWU7eGE9bnVsbDt2YXIgR2I9ITE7Ry5lbmFibGVCcmlkZ2VncmFwaCYmIXZiJiYhcWImJlhhLmlzSW5Db3JlKCkmJihHYj1OYj0+YmEuY29yZUdyYXBoLmVkZ2UoRmE/e3Y6TmIsdzpMfTp7djpMLHc6TmJ9KSwoeGE9R2IoU2EpKXx8KHhhPUdiKGVhKEZhLFNhLFoubmFtZSkpKSxHYj0hIXhhKTtYYT0hMTtpZih4YSYmIUFhLm51bVJlZ3VsYXJFZGdlcyl7WGE9eGE7Zm9yKHFiPWJhLm5vZGU7WGEuYWRqb2luaW5nTWV0YWVkZ2U7KVhhPVhhLmFkam9pbmluZ01ldGFlZGdlLHFiPXFiLnBhcmVudE5vZGU7cWI9dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhxYi5uYW1lKTsKWGE9WGEubWV0YWVkZ2U7WGE9cWJbWGEudl0+cWJbWGEud119R2ImJiFYYT8oQmI9ZWEoRmEsTCksdWI9ZWEoRmEsU2EsTCksemI9WC5ub2RlKHViKSx6Ynx8KEdiPVgubm9kZShCYiksR2J8fChHYj1uZXcgSCh7bmFtZTpCYix0eXBlOmQuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjAscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpkLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpGYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbQmJdPUdiLFguc2V0Tm9kZShCYixHYikpLHpiPW5ldyBIKHtuYW1lOnViLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFt1Yl09emIsWC5zZXROb2RlKHViLAp6YiksWC5zZXRQYXJlbnQodWIsQmIpLEdiLm5vZGUuY2FyZGluYWxpdHkrKyksQWE9bmV3IEsoQWEpLEFhLmFkam9pbmluZ01ldGFlZGdlPXhhLEZhP1guc2V0RWRnZSh1Yix5YSxBYSk6WC5zZXRFZGdlKHlhLHViLEFhKSk6emIucHVzaChuZXcgSShCYix1YixuZXcgSyhBYSksTi5TSE9SVENVVCxGYSkpfSk7Xy5lYWNoKFshMCwhMV0seGE9PntsZXQgQWE9ZWEoeGEsTCksRmE9WC5ub2RlKEFhKTtGYSYmXy5lYWNoKFgubm9kZXMoKSx5YT0+e2lmKFgubm9kZSh5YSkubm9kZS50eXBlIT09ZC5Ob2RlVHlwZS5CUklER0UmJih4YT8hWC5wcmVkZWNlc3NvcnMoeWEpLmxlbmd0aDohWC5zdWNjZXNzb3JzKHlhKS5sZW5ndGgpKXt2YXIgU2E9ZWEoeGEsTCwiU1RSVUNUVVJBTF9UQVJHRVQiKSxYYT1YLm5vZGUoU2EpO1hhfHwoWGE9bmV3IEgoe25hbWU6U2EsdHlwZTpkLk5vZGVUeXBlLkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eToxLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLAppbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnhhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWGEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1NhXT1YYSxYLnNldE5vZGUoU2EsWGEpLEZhLm5vZGUuY2FyZGluYWxpdHkrKyxYLnNldFBhcmVudChTYSxBYSkpO1hhPW5ldyBLKG51bGwpO1hhLnN0cnVjdHVyYWw9ITA7WGEud2VpZ2h0LS07eGE/WC5zZXRFZGdlKFNhLHlhLFhhKTpYLnNldEVkZ2UoeWEsU2EsWGEpfX0pfSl9fX19YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhMKXtfLmVhY2goTC5lZGdlcygpLFE9PntRPUwuZWRnZShRKTtRPW5ldyBLKFEpO18uZm9yRWFjaChRLm1ldGFlZGdlLmJhc2VFZGdlTGlzdCxUPT57dmFyIFg9VC52LnNwbGl0KGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGFhPVgubGVuZ3RoOzA8PWFhO2FhLS0pe1Q9WC5zbGljZSgwLGFhKTtjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKFQuam9pbihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkpOwppZihsYSl7aWYobGEudHlwZT09PWQuTm9kZVR5cGUuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbbGEub3BdKWZvcihYPTE7WDxULmxlbmd0aDtYKyspKGFhPVQuc2xpY2UoMCxYKS5qb2luKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSkmJnRoaXMuYnVpbGRTdWJoaWVyYXJjaHkoYWEpO2JyZWFrfX19KX0pfX1mLlJlbmRlckdyYXBoSW5mbz1CO2NsYXNzIEl7Y29uc3RydWN0b3IoTCxRLFQsWCxhYSl7dGhpcy5ub2RlPUw7dGhpcy5yZW5kZXJOb2RlSW5mbz1RO3RoaXMucmVuZGVyTWV0YWVkZ2VJbmZvPVQ7dGhpcy5hbm5vdGF0aW9uVHlwZT1YO3RoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5keT10aGlzLmR4PTA7VCYmVC5tZXRhZWRnZSYmKHRoaXMudj1ULm1ldGFlZGdlLnYsdGhpcy53PVQubWV0YWVkZ2Uudyk7dGhpcy5pc0luPWFhO3RoaXMucG9pbnRzPVtdfX1mLkFubm90YXRpb249STtsZXQgTjsoZnVuY3Rpb24oTCl7TFtMLlNIT1JUQ1VUPTBdPSJTSE9SVENVVCI7CkxbTC5DT05TVEFOVD0xXT0iQ09OU1RBTlQiO0xbTC5TVU1NQVJZPTJdPSJTVU1NQVJZIjtMW0wuRUxMSVBTSVM9M109IkVMTElQU0lTIn0pKE49Zi5Bbm5vdGF0aW9uVHlwZXx8KGYuQW5ub3RhdGlvblR5cGU9e30pKTtjbGFzcyBPe2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdO3RoaXMubm9kZU5hbWVzPXt9fXB1c2goTCl7aWYoIShMLm5vZGUubmFtZSBpbiB0aGlzLm5vZGVOYW1lcykpaWYodGhpcy5ub2RlTmFtZXNbTC5ub2RlLm5hbWVdPSEwLHRoaXMubGlzdC5sZW5ndGg8Ry5tYXhBbm5vdGF0aW9ucyl0aGlzLmxpc3QucHVzaChMKTtlbHNle3ZhciBRPXRoaXMubGlzdFt0aGlzLmxpc3QubGVuZ3RoLTFdO1EuYW5ub3RhdGlvblR5cGU9PT1OLkVMTElQU0lTPyhMPVEubm9kZSxMLnNldE51bU1vcmVOb2RlcygrK0wubnVtTW9yZU5vZGVzKSk6KFE9bmV3IGIuZ3JhcGguRWxsaXBzaXNOb2RlSW1wbCgxKSx0aGlzLmxpc3QucHVzaChuZXcgSShRLG5ldyBIKFEpLG51bGwsTi5FTExJUFNJUywKTC5pc0luKSkpfX19Zi5Bbm5vdGF0aW9uTGlzdD1PO2NsYXNzIEh7Y29uc3RydWN0b3IoTCl7dGhpcy5ub2RlPUw7dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IE87dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgTzt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9MDt0aGlzLnN0cnVjdHVyYWw9dGhpcy5leGNsdWRlZD0hMTt0aGlzLnBhZGRpbmdCb3R0b209dGhpcy5wYWRkaW5nUmlnaHQ9dGhpcy5wYWRkaW5nTGVmdD10aGlzLnBhZGRpbmdUb3A9dGhpcy5sYWJlbEhlaWdodD10aGlzLnJhZGl1cz10aGlzLmxhYmVsT2Zmc2V0PTA7dGhpcy5pc091dEV4dHJhY3Q9dGhpcy5pc0luRXh0cmFjdD0hMTt0aGlzLmNvcmVCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMuaXNGYWRlZE91dD0hMTt0aGlzLmRpc3BsYXlOYW1lPUwubmFtZS5zdWJzdHJpbmcoTC5uYW1lLmxhc3RJbmRleE9mKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSsKMSk7TC50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZMLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChMPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TFsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT10aGlzLmRpc3BsYXlOYW1lLnN1YnN0cmluZyhiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSkpfWlzSW5Db3JlKCl7cmV0dXJuIXRoaXMuaXNJbkV4dHJhY3QmJiF0aGlzLmlzT3V0RXh0cmFjdCYmIXRoaXMuaXNMaWJyYXJ5RnVuY3Rpb259fWYuUmVuZGVyTm9kZUluZm89SDtjbGFzcyBLe2NvbnN0cnVjdG9yKEwpe3RoaXMubWV0YWVkZ2U9TDt0aGlzLmFkam9pbmluZ01ldGFlZGdlPW51bGw7dGhpcy5zdHJ1Y3R1cmFsPSExO3RoaXMud2VpZ2h0PTE7dGhpcy5pc0ZhZGVkT3V0PSExfX1mLlJlbmRlck1ldGFlZGdlSW5mbz0KSztjbGFzcyBNIGV4dGVuZHMgSHtjb25zdHJ1Y3RvcihMLFEpe3N1cGVyKEwpO0w9TC5tZXRhZ3JhcGguZ3JhcGgoKTtRLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWQuY3JlYXRlR3JhcGgoTC5uYW1lLGQuR3JhcGhUeXBlLkNPUkUsUSk7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5saWJyYXJ5RnVuY3Rpb25zQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzb2xhdGVkSW5FeHRyYWN0PVtdO3RoaXMuaXNvbGF0ZWRPdXRFeHRyYWN0PVtdO3RoaXMubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3Q9W119fWYuUmVuZGVyR3JvdXBOb2RlSW5mbz1NO2YubWFrZUluRXh0cmFjdD1uO2YubWFwSW5kZXhUb0h1ZT1mdW5jdGlvbihMKXtyZXR1cm4gMSs1NzkuMjU2MTY3OTcyNSpMJTM1OH07Zi5leHBhbmRVbnRpbE5vZGVJc1Nob3duPWZ1bmN0aW9uKEwsUSl7dmFyIFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjZW5lIik7ClE9US5zcGxpdCgiLyIpO3ZhciBYPVFbUS5sZW5ndGgtMV0ubWF0Y2goLyguKik6XHcrLyk7Mj09PVgubGVuZ3RoJiYoUVtRLmxlbmd0aC0xXT1YWzFdKTtYPVFbMF07bGV0IGFhPUwuZ2V0UmVuZGVyTm9kZUJ5TmFtZShYKTtmb3IobGV0IGxhPTE7bGE8US5sZW5ndGgmJmFhLm5vZGUudHlwZSE9PWIuZ3JhcGguTm9kZVR5cGUuT1A7bGErKylMLmJ1aWxkU3ViaGllcmFyY2h5KFgpLGFhLmV4cGFuZGVkPSEwLFQuc2V0Tm9kZUV4cGFuZGVkKGFhKSxYKz0iLyIrUVtsYV0sYWE9TC5nZXRSZW5kZXJOb2RlQnlOYW1lKFgpO3JldHVybiBhYS5ub2RlLm5hbWV9fSkoZC5yZW5kZXJ8fChkLnJlbmRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxLHUseCxBKXt2YXIgeT1rKHEsdSx4KTtpZigheS5lbXB0eSgpKXJldHVybiB5O3U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdSk7aWYoeCBpbnN0YW5jZW9mIEFycmF5KWZvcih5PTA7eTx4Lmxlbmd0aDt5KyspdS5jbGFzc0xpc3QuYWRkKHhbeV0pO2Vsc2UgdS5jbGFzc0xpc3QuYWRkKHgpO0E/cS5ub2RlKCkuaW5zZXJ0QmVmb3JlKHUsQSk6cS5ub2RlKCkuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIGQzLnNlbGVjdCh1KS5kYXR1bShxLmRhdHVtKCkpfWZ1bmN0aW9uIGsocSx1LHgpe3E9cS5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IEE9MDtBPHEubGVuZ3RoO0ErKyl7bGV0IHk9cVtBXTtpZih5LnRhZ05hbWU9PT11KWlmKHggaW5zdGFuY2VvZiBBcnJheSl7bGV0IHc9ITA7Zm9yKGxldCBDPTA7Qzx4Lmxlbmd0aDtDKyspdz13JiZ5LmNsYXNzTGlzdC5jb250YWlucyh4W0NdKTsKaWYodylyZXR1cm4gZDMuc2VsZWN0KHkpfWVsc2UgaWYoIXh8fHkuY2xhc3NMaXN0LmNvbnRhaW5zKHgpKXJldHVybiBkMy5zZWxlY3QoeSl9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiB0KHEsdSl7bGV0IHg9dS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz8wOmQubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2woayhxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpLDAseCk7dmFyIEE9MDx1Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx5PTA8dS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB3PTA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1kLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxHPTA7QSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7QSYmKEE9dS5jb3JlQm94LndpZHRoLEE9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIPwpBLWQubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdS5pbkV4dHJhY3RCb3gud2lkdGgvMjpBLXUuaW5FeHRyYWN0Qm94LndpZHRoLzItdS5vdXRFeHRyYWN0Qm94LndpZHRoLSh5P0M6MCksQT1BLXUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0odz9DOjApLGwoayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksQSx4KSk7eSYmKHk9dS5jb3JlQm94LndpZHRoLHk9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIP3ktZC5sYXlvdXQuTUlOX0FVWF9XSURUSCt1Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp5LXUub3V0RXh0cmFjdEJveC53aWR0aC8yLHk9eS11LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHc/QzowKSxsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx5LHgpKTt3JiYodT11LmNvcmVCb3gud2lkdGgtdS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsbChrKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdSx4KSl9ZnVuY3Rpb24gbChxLAp1LHgpe251bGwhPXEuYXR0cigidHJhbnNmb3JtIikmJihxPXEudHJhbnNpdGlvbigicG9zaXRpb24iKSk7cS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit1KyIsIit4KyIpIil9ZnVuY3Rpb24gcChxLHUpe3JldHVybiB1P3EudG9GaXhlZCgwKToxPD1NYXRoLmFicyhxKT9xLnRvRml4ZWQoMSk6cS50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7bGV0IHk9IkRldmljZTogIitxLmRldmljZV9uYW1lKyJcbiI7eSs9ImR0eXBlOiAiK3EuZHR5cGUrIlxuIjtsZXQgdz0iKHNjYWxhcikiOzA8cS5zaGFwZS5sZW5ndGgmJih3PSIoIitxLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3k9eSsoIlxuc2hhcGU6ICIrdysiXG5cbiMoZWxlbWVudHMpOiAiKSsodSsiXG4iKTtxPVtdO2Zvcih1PTA7dTx4Lmxlbmd0aDt1KyspMDx4W3VdJiZxLnB1c2goIiMoIitmLmhlYWx0aFBpbGxFbnRyaWVzW3VdLmxhYmVsKyIpOiAiK3hbdV0pO3krPXEuam9pbigiLCAiKSsiXG5cbiI7QS5tYXg+PQpBLm1pbiYmKHkrPSJtaW46ICIrQS5taW4rIiwgbWF4OiAiK0EubWF4KyJcbiIseSs9Im1lYW46ICIrQS5tZWFuKyIsIHN0ZGRldjogIitBLnN0ZGRldik7cmV0dXJuIHl9ZnVuY3Rpb24gbihxLHUseCxBLHk9NjAsdz0xMCxDPTAsRyl7ZDMuc2VsZWN0KHEucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih1KXt2YXIgRD11LnZhbHVlLEI9RC5zbGljZSgyLDgpLEk9QlswXSxOPUJbMV0sTz1CWzVdLEg9RFsxXSxLPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT15JiYoeT02MCk7bnVsbD09dyYmKHc9MTApO251bGw9PUMmJihDPTApO251bGwhPXgmJngubm9kZS50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5PUCYmKHkvPTIsdy89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChNKTt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO0E9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIrQTtMLnNldEF0dHJpYnV0ZSgiaWQiLEEpO3ZhciBRPTAsVD0iMCUiO2ZvcihsZXQgYWE9MDthYTxCLmxlbmd0aDthYSsrKWlmKEJbYWFdKXtRKz1CW2FhXTt2YXIgWD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WC5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsVCk7WC5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGYuaGVhbHRoUGlsbEVudHJpZXNbYWFdLmJhY2tncm91bmRfY29sb3IpO0wuYXBwZW5kQ2hpbGQoWCk7VD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WD0xMDAqUS9IKyIlIjtULnNldEF0dHJpYnV0ZSgib2Zmc2V0IixYKTtULnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZi5oZWFsdGhQaWxsRW50cmllc1thYV0uYmFja2dyb3VuZF9jb2xvcik7CkwuYXBwZW5kQ2hpbGQoVCk7VD1YfU0uYXBwZW5kQ2hpbGQoTCk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJyZWN0Iik7TS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ1cmwoIyIrQSsiKSIpO00uc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKHkpKTtNLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcodykpO00uc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcoQykpO0QuYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJ0aXRsZSIpO00udGV4dENvbnRlbnQ9bSh1LEgsQixLKTtELmFwcGVuZENoaWxkKE0pO3U9ITE7aWYobnVsbCE9eCYmKE09eC54LXkvMix3PXgueS13LXguaGVpZ2h0LzItMiwwPngubGFiZWxPZmZzZXQmJih3Kz14LmxhYmVsT2Zmc2V0KSxELnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTSsiLCAiK3crIikiKSwoQlsyXXx8QlszXXx8Qls0XSkmJih4PXgubm9kZS5hdHRyKSYmCngubGVuZ3RoKSlmb3IoQj0wO0I8eC5sZW5ndGg7QisrKWlmKCJUIj09PXhbQl0ua2V5KXt1PSh4PXhbQl0udmFsdWUudHlwZSkmJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KHgpO2JyZWFrfXg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShLLm1pbikmJk51bWJlci5pc0Zpbml0ZShLLm1heCkpe2lmKEI9cChLLm1pbix1KSxLPXAoSy5tYXgsdSkseC50ZXh0Q29udGVudD0xPEg/QisiIH4gIitLOkIsMDxJfHwwPE58fDA8Tyl4LnRleHRDb250ZW50Kz0iICgiLEg9W10sMDxJJiZILnB1c2goYE5hTlx1MDBkNyR7SX1gKSwwPE4mJkgucHVzaChgLVx1MjIxZVx1MDBkNyR7Tn1gKSwwPE8mJkgucHVzaChgK1x1MjIxZVx1MDBkNyR7T31gKSx4LnRleHRDb250ZW50Kz1ILmpvaW4oIjsgIikrIikifWVsc2UgeC50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO3guY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKTsKbnVsbD09RyYmKEc9eS8yKTt4LnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKEcpKTt4LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMtMikpO0QuYXBwZW5kQ2hpbGQoeCk7UG9seW1lci5kb20ocS5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChEKX19Zi5TVkdfTkFNRVNQQUNFPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Zi5DbGFzcz17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsClJFRl9MSU5FOiJyZWZsaW5lIixTRUxFQ1RBQkxFOiJzZWxlY3RhYmxlZWRnZSIsU0VMRUNURUQ6InNlbGVjdGVkZWRnZSIsU1RSVUNUVVJBTDoic3RydWN0dXJhbCJ9LEFubm90YXRpb246e09VVEJPWDoib3V0LWFubm90YXRpb25zIixJTkJPWDoiaW4tYW5ub3RhdGlvbnMiLEdST1VQOiJhbm5vdGF0aW9uIixOT0RFOiJhbm5vdGF0aW9uLW5vZGUiLEVER0U6ImFubm90YXRpb24tZWRnZSIsQ09OVFJPTF9FREdFOiJhbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSIsTEFCRUw6ImFubm90YXRpb24tbGFiZWwiLEVMTElQU0lTOiJhbm5vdGF0aW9uLWVsbGlwc2lzIn0sU2NlbmU6e0dST1VQOiJzY2VuZSIsQ09SRToiY29yZSIsRlVOQ1RJT05fTElCUkFSWToiZnVuY3Rpb24tbGlicmFyeSIsSU5FWFRSQUNUOiJpbi1leHRyYWN0IixPVVRFWFRSQUNUOiJvdXQtZXh0cmFjdCJ9LFN1YnNjZW5lOntHUk9VUDoic3Vic2NlbmUifSxPUE5PREU6Im9wIixNRVRBTk9ERToibWV0YSIsU0VSSUVTTk9ERToic2VyaWVzIiwKQlJJREdFTk9ERToiYnJpZGdlIixFTExJUFNJU05PREU6ImVsbGlwc2lzIn07Zi5oZWFsdGhQaWxsRW50cmllcz1be2JhY2tncm91bmRfY29sb3I6IiNDQzJGMkMiLGxhYmVsOiJOYU4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0ZGOEQwMCIsbGFiZWw6Ii1cdTIyMWUifSx7YmFja2dyb3VuZF9jb2xvcjoiI0VBRUFFQSIsbGFiZWw6Ii0ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0E1QTVBNSIsbGFiZWw6IjAifSx7YmFja2dyb3VuZF9jb2xvcjoiIzI2MjYyNiIsbGFiZWw6IisifSx7YmFja2dyb3VuZF9jb2xvcjoiIzAwM0VENCIsbGFiZWw6IitcdTIyMWUifV07Zi5maXQ9ZnVuY3Rpb24ocSx1LHgsQSl7dmFyIHk9cS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgdz1udWxsO3RyeXtpZih3PXUuZ2V0QkJveCgpLDA9PT13LndpZHRoKXJldHVybn1jYXRjaChDKXtyZXR1cm59dT1kLmxheW91dC5QQVJBTVMuZ3JhcGg7eT1kMy56b29tSWRlbnRpdHkuc2NhbGUoLjkqTWF0aC5taW4oeS53aWR0aC8Kdy53aWR0aCx5LmhlaWdodC93LmhlaWdodCwyKSkudHJhbnNsYXRlKHUucGFkZGluZy5wYWRkaW5nTGVmdCx1LnBhZGRpbmcucGFkZGluZ1RvcCk7ZDMuc2VsZWN0KHEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoeC50cmFuc2Zvcm0seSkub24oImVuZC5maXR0ZWQiLCgpPT57eC5vbigiZW5kLmZpdHRlZCIsbnVsbCk7QSgpfSl9O2YucGFuVG9Ob2RlPWZ1bmN0aW9uKHEsdSx4LEEpe3g9ZDMuc2VsZWN0KHUpLnNlbGVjdChgW2RhdGEtbmFtZT0iJHtxfSJdYCkubm9kZSgpO2lmKCF4KXJldHVybiBjb25zb2xlLndhcm4oYHBhblRvTm9kZSgpIGZhaWxlZCBmb3Igbm9kZSBuYW1lICIke3F9ImApLCExO3ZhciB5PXguZ2V0QkJveCgpLHc9eC5nZXRTY3JlZW5DVE0oKTtxPXUuY3JlYXRlU1ZHUG9pbnQoKTt4PXUuY3JlYXRlU1ZHUG9pbnQoKTtxLng9eS54O3EueT15Lnk7eC54PXkueCt5LndpZHRoO3gueT15LnkreS5oZWlnaHQ7cT1xLm1hdHJpeFRyYW5zZm9ybSh3KTt4PQp4Lm1hdHJpeFRyYW5zZm9ybSh3KTt3PShHLEQsQixJKT0+IShHPkImJkQ8SSk7eT11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IEM9eS50b3AreS5oZWlnaHQtMTUwO3JldHVybiB3KHEueCx4LngseS5sZWZ0LHkubGVmdCt5LndpZHRoLTMyMCl8fHcocS55LHgueSx5LnRvcCxDKT8odz15LmxlZnQreS53aWR0aC8yLShxLngreC54KS8yLHE9eS50b3AreS5oZWlnaHQvMi0ocS55K3gueSkvMix4PWQzLnpvb21UcmFuc2Zvcm0odSksZDMuc2VsZWN0KHUpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoQS50cmFuc2xhdGVCeSx3L3guayxxL3guayksITApOiExfTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQ9aDtmLnNlbGVjdENoaWxkPWs7Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe0E9QXx8Zi5DbGFzcy5TY2VuZS5HUk9VUDtsZXQgeT1rKHEsImciLEEpLmVtcHR5KCk7cT1oKHEsImciLEEpO0E9aChxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpO2xldCB3PV8ucmVkdWNlKHUuY29yZUdyYXBoLm5vZGVzKCksCihDLEcpPT57Rz11LmNvcmVHcmFwaC5ub2RlKEcpO0cuZXhjbHVkZWR8fEMucHVzaChHKTtyZXR1cm4gQ30sW10pO3Uubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJncucmV2ZXJzZSgpO2YuZWRnZS5idWlsZEdyb3VwKEEsdS5jb3JlR3JhcGgseCk7Zi5ub2RlLmJ1aWxkR3JvdXAoQSx3LHgpOzA8dS5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/KEE9aChxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkSW5FeHRyYWN0LHgpKTprKHEsImciLGYuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKTswPHUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD8oQT1oKHEsImciLGYuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkT3V0RXh0cmFjdCx4KSk6ayhxLCJnIixmLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpOzA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/CihBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxmLm5vZGUuYnVpbGRHcm91cChBLHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QseCkpOmsocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTt0KHEsdSk7eSYmcS5hdHRyKCJvcGFjaXR5IiwwKS50cmFuc2l0aW9uKCkuYXR0cigib3BhY2l0eSIsMSk7cmV0dXJuIHF9O2YuYWRkR3JhcGhDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKHEsdSl7ZDMuc2VsZWN0KHEpLm9uKCJjbGljayIsKCk9Pnt1LmZpcmUoImdyYXBoLXNlbGVjdCIpfSl9O2YudHJhbnNsYXRlPWw7Zi5wb3NpdGlvblJlY3Q9ZnVuY3Rpb24ocSx1LHgsQSx5KXtxLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix1LUEvMikuYXR0cigieSIseC15LzIpLmF0dHIoIndpZHRoIixBKS5hdHRyKCJoZWlnaHQiLHkpfTtmLnBvc2l0aW9uVHJpYW5nbGU9ZnVuY3Rpb24ocSx1LHgsQSx5KXt5Lz0yO0EvPTI7dT1bW3UseC15XSxbdStBLAp4K3ldLFt1LUEseCt5XV07cS50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIix1Lm1hcCh3PT53LmpvaW4oIiwiKSkuam9pbigiICIpKX07Zi5wb3NpdGlvbkJ1dHRvbj1mdW5jdGlvbihxLHUpe2xldCB4PWQubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodSkrKHUuZXhwYW5kZWQ/dS53aWR0aDp1LmNvcmVCb3gud2lkdGgpLzItNixBPXUueS0odS5leHBhbmRlZD91LmhlaWdodDp1LmNvcmVCb3guaGVpZ2h0KS8yKzY7dS5ub2RlLnR5cGUhPT1kLk5vZGVUeXBlLlNFUklFU3x8dS5leHBhbmRlZHx8KHgrPTEwLEEtPTIpO3U9InRyYW5zbGF0ZSgiK3grIiwiK0ErIikiO3Euc2VsZWN0QWxsKCJwYXRoIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsdSk7cS5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKS5hdHRyKHtjeDp4LGN5OkEscjpkLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5leHBhbmRCdXR0b25SYWRpdXN9KX07Zi5wb3NpdGlvbkVsbGlwc2U9CmZ1bmN0aW9uKHEsdSx4LEEseSl7cS50cmFuc2l0aW9uKCkuYXR0cigiY3giLHUpLmF0dHIoImN5Iix4KS5hdHRyKCJyeCIsQS8yKS5hdHRyKCJyeSIseS8yKX07Zi5odW1hbml6ZUhlYWx0aFBpbGxTdGF0PXA7Zi5hZGRIZWFsdGhQaWxsPW47Zi5hZGRIZWFsdGhQaWxscz1mdW5jdGlvbihxLHUseCl7aWYodSl7dmFyIEE9MTtkMy5zZWxlY3QocSkuc2VsZWN0QWxsKCJnLm5vZGVzaGFwZSIpLmVhY2goZnVuY3Rpb24oeSl7Y29uc3Qgdz11W3kubm9kZS5uYW1lXTtuKHRoaXMsdz93W3hdOm51bGwseSxBKyspfSl9fX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90ZW1wbGF0ZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKG4pe2xldCBxPV8ubWFwKHtkZXB0aDpuLmRlcHRoLCJ8VnwiOm4ubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOm4ubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiICIpO249Xy5tYXAobi5vcEhpc3RvZ3JhbSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiLCIpO3JldHVybiBxKyIgW29wc10gIitufWZ1bmN0aW9uIGsobil7Y29uc3QgcT1uLmdldE5vZGVNYXAoKTtsZXQgdT1PYmplY3Qua2V5cyhxKS5yZWR1Y2UoKHgsQSk9Pntjb25zdCB5PXFbQV07aWYoeS50eXBlIT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiB4O0E9QS5zcGxpdCgiLyIpLmxlbmd0aC0xO2xldCB3PWgoeSksQz14W3ddfHx7bm9kZXM6W10sbGV2ZWw6QX07eFt3XT1DO0Mubm9kZXMucHVzaCh5KTtDLmxldmVsPkEmJihDLmxldmVsPQpBKTtyZXR1cm4geH0se30pO3JldHVybiBPYmplY3Qua2V5cyh1KS5tYXAoeD0+W3gsdVt4XV0pLmZpbHRlcigoWyx4XSk9Pnt4PXgubm9kZXM7aWYoMTx4Lmxlbmd0aClyZXR1cm4hMDt4PXhbMF07cmV0dXJuIHgudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmeC5hc3NvY2lhdGVkRnVuY3Rpb259KS5zb3J0KChbLHhdKT0+eC5ub2Rlc1swXS5kZXB0aCl9ZnVuY3Rpb24gdChuLHEpe3JldHVybiBfLnJlZHVjZShuLGZ1bmN0aW9uKHUseCl7bGV0IEE9eFswXSx5PVtdO3hbMV0ubm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KXtmb3IobGV0IEM9MDtDPHkubGVuZ3RoO0MrKylpZighcXx8cCh5W0NdLm1ldGFub2RlLm1ldGFncmFwaCx3Lm1ldGFncmFwaCkpe3cudGVtcGxhdGVJZD15W0NdLm1ldGFub2RlLnRlbXBsYXRlSWQ7eVtDXS5tZW1iZXJzLnB1c2gody5uYW1lKTtyZXR1cm59dy50ZW1wbGF0ZUlkPUErIlsiK3kubGVuZ3RoKyJdIjt5LnB1c2goe21ldGFub2RlOncsbWVtYmVyczpbdy5uYW1lXX0pfSk7CnkuZm9yRWFjaChmdW5jdGlvbih3KXt1W3cubWV0YW5vZGUudGVtcGxhdGVJZF09e2xldmVsOnhbMV0ubGV2ZWwsbm9kZXM6dy5tZW1iZXJzfX0pO3JldHVybiB1fSx7fSl9ZnVuY3Rpb24gbChuLHEsdSl7cmV0dXJuIF8uc29ydEJ5KG4sW3g9PnEubm9kZSh4KS5vcCx4PT5xLm5vZGUoeCkudGVtcGxhdGVJZCx4PT5xLm5laWdoYm9ycyh4KS5sZW5ndGgseD0+cS5wcmVkZWNlc3NvcnMoeCkubGVuZ3RoLHg9PnEuc3VjY2Vzc29ycyh4KS5sZW5ndGgseD0+eC5zdWJzdHIodS5sZW5ndGgpXSl9ZnVuY3Rpb24gcChuLHEpe2Z1bmN0aW9uIHUoSSxOKXtsZXQgTz1JLnN1YnN0cih4Lmxlbmd0aCksSD1OLnN1YnN0cihBLmxlbmd0aCk7aWYoeVtPXV53W0hdKXJldHVybiBjb25zb2xlLndhcm4oImRpZmZlcmVudCB2aXNpdCBwYXR0ZXJuIiwiWyIreCsiXSIsTywiWyIrQSsiXSIsSCksITA7eVtPXXx8KHlbT109d1tIXT0hMCxDLnB1c2goe24xOkksbjI6Tn0pKTtyZXR1cm4hMX1pZighYi5ncmFwaC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2UobiwKcSkpcmV0dXJuITE7bGV0IHg9bi5ncmFwaCgpLm5hbWUsQT1xLmdyYXBoKCkubmFtZSx5PXt9LHc9e30sQz1bXTt2YXIgRz1uLnNvdXJjZXMoKSxEPXEuc291cmNlcygpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCJkaWZmZXJlbnQgc291cmNlIGxlbmd0aCIpLCExO0c9bChHLG4seCk7RD1sKEQscSxBKTtmb3IodmFyIEI9MDtCPEcubGVuZ3RoO0IrKylpZih1KEdbQl0sRFtCXSkpcmV0dXJuITE7Zm9yKDswPEMubGVuZ3RoOyl7RD1DLnBvcCgpO2lmKCFtKG4ubm9kZShELm4xKSxxLm5vZGUoRC5uMikpKXJldHVybiExO0c9bi5zdWNjZXNzb3JzKEQubjEpO0Q9cS5zdWNjZXNzb3JzKEQubjIpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCIjIG9mIHN1Y2Nlc3NvcnMgbWlzbWF0Y2giLEcsRCksITE7Rz1sKEcsbix4KTtEPWwoRCxxLEEpO2ZvcihCPTA7QjxHLmxlbmd0aDtCKyspaWYodShHW0JdLERbQl0pKXJldHVybiExfXJldHVybiEwfQpmdW5jdGlvbiBtKG4scSl7aWYobi50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiBuLnRlbXBsYXRlSWQmJnEudGVtcGxhdGVJZCYmbi50ZW1wbGF0ZUlkPT09cS50ZW1wbGF0ZUlkO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuT1AmJnEudHlwZT09PWQuTm9kZVR5cGUuT1ApcmV0dXJuIG4ub3A9PT1xLm9wO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZxLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyl7bGV0IHU9bi5tZXRhZ3JhcGgubm9kZUNvdW50KCk7cmV0dXJuIHU9PT1xLm1ldGFncmFwaC5ub2RlQ291bnQoKSYmKDA9PT11fHxuLm1ldGFncmFwaC5ub2RlKG4ubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wPT09cS5tZXRhZ3JhcGgubm9kZShxLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcCl9cmV0dXJuITF9Zi5kZXRlY3Q9ZnVuY3Rpb24obixxKXtuPWsobik7bGV0IHU9dChuLHEpO3JldHVybiBPYmplY3Qua2V5cyh1KS5zb3J0KHg9PnVbeF0ubGV2ZWwpLnJlZHVjZSgoeCwKQSk9Pnt4W0FdPXVbQV07cmV0dXJuIHh9LHt9KX19KShkLnRlbXBsYXRlfHwoZC50ZW1wbGF0ZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdXRpbC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmLnRpbWU9ZnVuY3Rpb24oaCxrKXtsZXQgdD1EYXRlLm5vdygpO2s9aygpO2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktdCwibXMiKTtyZXR1cm4ga307Zi5nZXRUcmFja2VyPWZ1bmN0aW9uKGgpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGspe2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUsbXNnOmt9KX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oayl7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZStrLG1zZzpoLnByb2dyZXNzLm1zZ30pfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihrLHQpe2NvbnNvbGUuZXJyb3IodC5zdGFjayk7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZSxtc2c6ayxlcnJvcjohMH0pfX19O2YuZ2V0U3VidGFza1RyYWNrZXI9ZnVuY3Rpb24oaCxrLHQpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGwpe2guc2V0TWVzc2FnZSh0KwoiOiAiK2wpfSx1cGRhdGVQcm9ncmVzczpmdW5jdGlvbihsKXtoLnVwZGF0ZVByb2dyZXNzKGwqay8xMDApfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihsLHApe2gucmVwb3J0RXJyb3IodCsiOiAiK2wscCl9fX07Zi5ydW5UYXNrPWZ1bmN0aW9uKGgsayl7ay5zZXRNZXNzYWdlKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iik7dHJ5e2xldCB0PWIuZ3JhcGgudXRpbC50aW1lKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0IixoKTtrLnVwZGF0ZVByb2dyZXNzKDQwKTtyZXR1cm4gdH1jYXRjaCh0KXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIsdCl9fTtmLnJ1bkFzeW5jVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UocD0+e2wuc2V0TWVzc2FnZShoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2xldCBtPWIuZ3JhcGgudXRpbC50aW1lKGgsdCk7bC51cGRhdGVQcm9ncmVzcyhrKTtwKG0pfWNhdGNoKG0pe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiKwpoLG0pfX0sMjApfSl9O2YucnVuQXN5bmNQcm9taXNlVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UoKHAsbSk9PntmdW5jdGlvbiBuKHEpe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiK2gscSk7bShxKX1sLnNldE1lc3NhZ2UoaCk7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgcT1EYXRlLm5vdygpO3QoKS50aGVuKGZ1bmN0aW9uKHUpe2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktcSwibXMiKTtsLnVwZGF0ZVByb2dyZXNzKGspO3AodSl9KS5jYXRjaChuKX1jYXRjaChxKXtuKHEpfX0sMjApfSl9O2YuZXNjYXBlUXVlcnlTZWxlY3Rvcj1mdW5jdGlvbihoKXtyZXR1cm4gaC5yZXBsYWNlKC8oWzouXFtcXSwvXFxcKFwpXSkvZywiXFwkMSIpfTtmLk1FTU9SWV9VTklUUz1be3N5bWJvbDoiQiJ9LHtzeW1ib2w6IktCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJNQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiR0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlRCIiwKbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiUEIiLG51bVVuaXRzOjEwMjR9XTtmLlRJTUVfVU5JVFM9W3tzeW1ib2w6Ilx1MDBiNXMifSx7c3ltYm9sOiJtcyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJzIixudW1Vbml0czoxRTN9LHtzeW1ib2w6Im1pbiIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImhyIixudW1Vbml0czo2MH0se3N5bWJvbDoiZGF5cyIsbnVtVW5pdHM6MjR9XTtmLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZT1mdW5jdGlvbihoLGssdD0wKXtyZXR1cm4gdCsxPGsubGVuZ3RoJiZoPj1rW3QrMV0ubnVtVW5pdHM/Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShoL2tbdCsxXS5udW1Vbml0cyxrLHQrMSk6TnVtYmVyKGgudG9QcmVjaXNpb24oMykpKyIgIitrW3RdLnN5bWJvbH07Zi5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cz1mdW5jdGlvbihoKXtyZXR1cm4gaCYmKDA8aC50b3RhbEJ5dGVzfHwwPGguZ2V0VG90YWxNaWNyb3MoKXx8aC5vdXRwdXRTaXplKT8KITA6ITF9O2YucmVtb3ZlQ29tbW9uUHJlZml4PWZ1bmN0aW9uKGgpe2lmKDI+aC5sZW5ndGgpcmV0dXJuIGg7bGV0IGs9MCx0PTAsbD1fLm1pbihfLm1hcChoLHA9PnAubGVuZ3RoKSk7Zm9yKDs7KXtrKys7bGV0IHA9Xy5tYXAoaCxtPT5tLnN1YnN0cmluZygwLGspKTtpZihwLmV2ZXJ5KChtLG4pPT4wPT09bj8hMDptPT09cFtuLTFdKSl7aWYoaz49bClyZXR1cm4gaDt0PWt9ZWxzZSBicmVha31yZXR1cm4gXy5tYXAoaCxwPT5wLnN1YnN0cmluZyh0KSl9O2YuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lPWZ1bmN0aW9uKGgpe2g9K25ldyBEYXRlLStuZXcgRGF0ZShoLzFFMyk7cmV0dXJuIDNFND5oPyJqdXN0IG5vdyI6NkU0Pmg/TWF0aC5mbG9vcihoLzFFMykrIiBzZWNvbmRzIGFnbyI6MTJFND5oPyJhIG1pbnV0ZSBhZ28iOjM2RTU+aD9NYXRoLmZsb29yKGgvNkU0KSsiIG1pbnV0ZXMgYWdvIjoxPT1NYXRoLmZsb29yKGgvMzZFNSk/ImFuIGhvdXIgYWdvIjo4NjRFNT5oP01hdGguZmxvb3IoaC8KMzZFNSkrIiBob3VycyBhZ28iOjE3MjhFNT5oPyJ5ZXN0ZXJkYXkiOk1hdGguZmxvb3IoaC84NjRFNSkrIiBkYXlzIGFnbyJ9fSkoZC51dGlsfHwoZC51dGlsPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9taW5pbWFwLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihoLGssdCxsLHAsbSl7dGhpcy5zdmc9aDt0aGlzLmxhYmVsUGFkZGluZz1tO3RoaXMuem9vbUc9azt0aGlzLm1haW5ab29tPXQ7dGhpcy5tYXhXYW5kSD1wO2g9ZDMuc2VsZWN0KGwuc2hhZG93Um9vdCk7bGV0IG49aC5zZWxlY3QoInN2ZyIpLHE9bi5zZWxlY3QoInJlY3QiKTt0aGlzLnZpZXdwb2ludENvb3JkPXt4OjAseTowfTtrPWQzLmRyYWcoKS5zdWJqZWN0KE9iamVjdCkub24oImRyYWciLCgpPT57dGhpcy52aWV3cG9pbnRDb29yZC54PWQzLmV2ZW50Lng7dGhpcy52aWV3cG9pbnRDb29yZC55PWQzLmV2ZW50Lnk7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX0pO3EuZGF0dW0odGhpcy52aWV3cG9pbnRDb29yZCkuY2FsbChrKTtuLm9uKCJjbGljayIsKCk9PntpZighZDMuZXZlbnQuZGVmYXVsdFByZXZlbnRlZCl7dmFyIHU9TnVtYmVyKHEuYXR0cigid2lkdGgiKSkseD1OdW1iZXIocS5hdHRyKCJoZWlnaHQiKSksCkE9ZDMubW91c2Uobi5ub2RlKCkpO3RoaXMudmlld3BvaW50Q29vcmQueD1BWzBdLXUvMjt0aGlzLnZpZXdwb2ludENvb3JkLnk9QVsxXS14LzI7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX19KTt0aGlzLnZpZXdwb2ludD1xLm5vZGUoKTt0aGlzLm1pbmltYXBTdmc9bi5ub2RlKCk7dGhpcy5taW5pbWFwPWw7dGhpcy5jYW52YXM9aC5zZWxlY3QoImNhbnZhcy5maXJzdCIpLm5vZGUoKTt0aGlzLmNhbnZhc0J1ZmZlcj1oLnNlbGVjdCgiY2FudmFzLnNlY29uZCIpLm5vZGUoKTt0aGlzLmRvd25sb2FkQ2FudmFzPWguc2VsZWN0KCJjYW52YXMuZG93bmxvYWQiKS5ub2RlKCk7ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpO3RoaXMudXBkYXRlKCl9dXBkYXRlVmlld3BvaW50KCl7ZDMuc2VsZWN0KHRoaXMudmlld3BvaW50KS5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSk7bGV0IGg9Ci10aGlzLnZpZXdwb2ludENvb3JkLngqdGhpcy5zY2FsZU1haW4vdGhpcy5zY2FsZU1pbmltYXAsaz0tdGhpcy52aWV3cG9pbnRDb29yZC55KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwO2QzLnNlbGVjdCh0aGlzLnN2ZykuY2FsbCh0aGlzLm1haW5ab29tLnRyYW5zZm9ybSxkMy56b29tSWRlbnRpdHkudHJhbnNsYXRlKGgsaykuc2NhbGUodGhpcy5zY2FsZU1haW4pKX11cGRhdGUoKXtsZXQgaD1udWxsO3RyeXtpZihoPXRoaXMuem9vbUcuZ2V0QkJveCgpLDA9PT1oLndpZHRoKXJldHVybn1jYXRjaCh1KXtyZXR1cm59dmFyIGs9ZDMuc2VsZWN0KCIjZ3JhcGhkb3dubG9hZCIpO3RoaXMuZG93bmxvYWQ9ay5ub2RlKCk7ay5vbigiY2xpY2siLCgpPT57VVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLmRvd25sb2FkLmhyZWYpO3ZhciB1PXRoaXMuZG93bmxvYWRDYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmciKTtjb25zdCB4PXUuc2xpY2UoMCx1LmluZGV4T2YoIiwiKSk7aWYoeC5lbmRzV2l0aCgiO2Jhc2U2NCIpKXt2YXIgQT0KYXRvYih1LnNsaWNlKHUuaW5kZXhPZigiLCIpKzEpKTt1PShuZXcgVWludDhBcnJheShBLmxlbmd0aCkpLm1hcCgoeSx3KT0+QS5jaGFyQ29kZUF0KHcpKTt0aGlzLmRvd25sb2FkLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdV0se3R5cGU6ImltYWdlL3BuZyJ9KSl9ZWxzZSBjb25zb2xlLndhcm4oYG5vbi1iYXNlNjQgZGF0YSBVUkwgKCR7eH0pOyBjYW5ub3QgdXNlIGJsb2IgZG93bmxvYWRgKSx0aGlzLmRvd25sb2FkLmhyZWY9dX0pO2s9ZDMuc2VsZWN0KHRoaXMuc3ZnKTt2YXIgdD0iIixsPXRoaXMuc3ZnO2w9KGwuZ2V0Um9vdE5vZGU/bC5nZXRSb290Tm9kZSgpOnRoaXMuc3ZnLnBhcmVudE5vZGUpLnN0eWxlU2hlZXRzO2Zvcih2YXIgcD0wO3A8bC5sZW5ndGg7cCsrKXRyeXt2YXIgbT1sW3BdLmNzc1J1bGVzfHxsW3BdLnJ1bGVzO2lmKG51bGwhPW0pZm9yKGxldCB1PTA7dTxtLmxlbmd0aDt1KyspdCs9bVt1XS5jc3NUZXh0LnJlcGxhY2UoLyA/dGYtW1x3LV0rID8vZywKIiIpKyJcbiJ9Y2F0Y2godSl7aWYoIlNlY3VyaXR5RXJyb3IiIT09dS5uYW1lKXRocm93IHU7fW09ay5hcHBlbmQoInN0eWxlIik7bS50ZXh0KHQpO3Q9ZDMuc2VsZWN0KHRoaXMuem9vbUcpO2w9dC5hdHRyKCJ0cmFuc2Zvcm0iKTt0LmF0dHIoInRyYW5zZm9ybSIsbnVsbCk7aC5oZWlnaHQrPWgueTtoLndpZHRoKz1oLng7aC5oZWlnaHQrPTIqdGhpcy5sYWJlbFBhZGRpbmc7aC53aWR0aCs9Mip0aGlzLmxhYmVsUGFkZGluZztrLmF0dHIoIndpZHRoIixoLndpZHRoKS5hdHRyKCJoZWlnaHQiLGguaGVpZ2h0KTt0aGlzLnNjYWxlTWluaW1hcD10aGlzLm1heFdhbmRIL01hdGgubWF4KGgud2lkdGgsaC5oZWlnaHQpO3RoaXMubWluaW1hcFNpemU9e3dpZHRoOmgud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAsaGVpZ2h0OmguaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwfTtkMy5zZWxlY3QodGhpcy5taW5pbWFwU3ZnKS5hdHRyKHRoaXMubWluaW1hcFNpemUpO2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuYXR0cih0aGlzLm1pbmltYXBTaXplKTsKcD1kMy5zZWxlY3QodGhpcy5kb3dubG9hZENhbnZhcyk7cC5zdHlsZSgid2lkdGgiLGgud2lkdGgpO3Auc3R5bGUoImhlaWdodCIsaC5oZWlnaHQpO3AuYXR0cigid2lkdGgiLDMqaC53aWR0aCk7cC5hdHRyKCJoZWlnaHQiLDMqaC5oZWlnaHQpO251bGwhPXRoaXMudHJhbnNsYXRlJiZudWxsIT10aGlzLnpvb20mJnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy56b29tKCkpO2xldCBuPShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcodGhpcy5zdmcpO20ucmVtb3ZlKCk7ay5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKTt0LmF0dHIoInRyYW5zZm9ybSIsbCk7bGV0IHE9bmV3IEltYWdlO3Eub25sb2FkPSgpPT57dmFyIHU9dGhpcy5jYW52YXNCdWZmZXIuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNCdWZmZXIud2lkdGgsdGhpcy5jYW52YXNCdWZmZXIuaGVpZ2h0KTt1LmRyYXdJbWFnZShxLDAsMCx0aGlzLm1pbmltYXBTaXplLndpZHRoLAp0aGlzLm1pbmltYXBTaXplLmhlaWdodCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57ZDMuc2VsZWN0KHRoaXMuY2FudmFzQnVmZmVyKS5zdHlsZSgiZGlzcGxheSIsbnVsbCk7ZDMuc2VsZWN0KHRoaXMuY2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTtbdGhpcy5jYW52YXMsdGhpcy5jYW52YXNCdWZmZXJdPVt0aGlzLmNhbnZhc0J1ZmZlcix0aGlzLmNhbnZhc119KTt1PXRoaXMuZG93bmxvYWRDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCk7dS5kcmF3SW1hZ2UocSwwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCl9O3Eub25lcnJvcj0oKT0+e3Euc3JjPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25dLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpfTtxLnNyYz0KImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04LCIrZW5jb2RlVVJJQ29tcG9uZW50KG4pfXpvb20oaCl7aWYobnVsbCE9dGhpcy5zY2FsZU1pbmltYXApe2gmJih0aGlzLnRyYW5zbGF0ZT1baC54LGgueV0sdGhpcy5zY2FsZU1haW49aC5rKTt2YXIgaz10aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWQzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCk7dGhpcy52aWV3cG9pbnRDb29yZC54PS10aGlzLnRyYW5zbGF0ZVswXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjt0aGlzLnZpZXdwb2ludENvb3JkLnk9LXRoaXMudHJhbnNsYXRlWzFdKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO2g9ay53aWR0aCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtrPWsuaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO3QuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpLmF0dHIoIndpZHRoIiwKaCkuYXR0cigiaGVpZ2h0IixrKTt0PXRoaXMubWluaW1hcFNpemUud2lkdGg7dmFyIGw9dGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQscD10aGlzLnZpZXdwb2ludENvb3JkLngsbT10aGlzLnZpZXdwb2ludENvb3JkLnk7Ljg+KE1hdGgubWluKE1hdGgubWF4KDAscCtoKSx0KS1NYXRoLm1pbihNYXRoLm1heCgwLHApLHQpKSooTWF0aC5taW4oTWF0aC5tYXgoMCxtK2spLGwpLU1hdGgubWluKE1hdGgubWF4KDAsbSksbCkpLyh0KmwpP3RoaXMubWluaW1hcC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTp0aGlzLm1pbmltYXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9fX1kLk1pbmltYXA9Zn0pKGIuc2NlbmV8fChiLnNjZW5lPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtbWluaW1hcC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1taW5pbWFwIixpbml0OmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIG5ldyB0Zi5zY2VuZS5NaW5pbWFwKGIsZCxmLHRoaXMsaCxrKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC90Zi1ncmFwaC1zY2VuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1zY2VuZSIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxuYW1lOlN0cmluZyxjb2xvckJ5OlN0cmluZyx0cmFjZUlucHV0czpCb29sZWFuLF9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZTpCb29sZWFuLF9pc0F0dGFjaGVkOkJvb2xlYW4sX3pvb206T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9oaWdobGlnaHRlZE5vZGVDaGFuZ2VkIn0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3NlbGVjdGVkTm9kZUNoYW5nZWQifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6T2JqZWN0LF96b29tZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX29uWm9vbUNoYW5nZWQiLHZhbHVlOiExfSxfem9vbVN0YXJ0Q29vcmRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfem9vbVRyYW5zZm9ybTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX21heFpvb21EaXN0YW5jZUZvckNsaWNrOnt0eXBlOk51bWJlciwKdmFsdWU6MjB9LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb24sbWluaW1hcDpPYmplY3QsX25vZGVHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2Fubm90YXRpb25Hcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2VkZ2VHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo5fSxtaW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjZ9LG1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjExfSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoOnt0eXBlOk51bWJlcix2YWx1ZToxOH0scHJvZ3Jlc3M6T2JqZWN0LG5vZGVDb250ZXh0TWVudUl0ZW1zOkFycmF5LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LApoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcn0sb2JzZXJ2ZXJzOlsiX2NvbG9yQnlDaGFuZ2VkKGNvbG9yQnkpIiwiX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQocmVuZGVySGllcmFyY2h5KSIsIl9hbmltYXRlQW5kRml0KF9pc0F0dGFjaGVkLCByZW5kZXJIaWVyYXJjaHkpIiwiX3VwZGF0ZUhlYWx0aFBpbGxzKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgpIiwiX3VwZGF0ZUlucHV0VHJhY2UodHJhY2VJbnB1dHMsIHNlbGVjdGVkTm9kZSkiXSxnZXROb2RlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpfSxpc05vZGVFeHBhbmRlZDpmdW5jdGlvbihiKXtyZXR1cm4gYi5leHBhbmRlZH0sc2V0Tm9kZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fYnVpbGQodGhpcy5yZW5kZXJIaWVyYXJjaHkpO3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0scGFuVG9Ob2RlKGIpe3RmLmdyYXBoLnNjZW5lLnBhblRvTm9kZShiLAp0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20pJiYodGhpcy5fem9vbWVkPSEwKX0sZ2V0R3JhcGhTdmdSb290KCl7cmV0dXJuIHRoaXMuJC5zdmd9LGdldENvbnRleHRNZW51KCl7cmV0dXJuIHRoaXMuJC5jb250ZXh0TWVudX0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9ub2RlR3JvdXBJbmRleD17fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleD17fTt0aGlzLl9lZGdlR3JvdXBJbmRleD17fTt0aGlzLl91cGRhdGVMYWJlbHMoITEpO2QzLnNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3QoIiNyb290Iikuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7dGYuZ3JhcGguc2NlbmUubm9kZS5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5zdmcpfSxfYnVpbGQ6ZnVuY3Rpb24oYil7dGhpcy50ZW1wbGF0ZUluZGV4PWIuaGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKTt0Zi5ncmFwaC51dGlsLnRpbWUoInRmLWdyYXBoLXNjZW5lIChsYXlvdXQpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5sYXlvdXQubGF5b3V0U2NlbmUoYi5yb290LAp0aGlzKX0uYmluZCh0aGlzKSk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAoYnVpbGQgc2NlbmUpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5idWlsZEdyb3VwKGQzLnNlbGVjdCh0aGlzLiQucm9vdCksYi5yb290LHRoaXMpO3RmLmdyYXBoLnNjZW5lLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcih0aGlzLiQuc3ZnLHRoaXMpO3RoaXMuX3VwZGF0ZUlucHV0VHJhY2UoKX0uYmluZCh0aGlzKSk7c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWx0aFBpbGxzKHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpO3RoaXMubWluaW1hcC51cGRhdGUoKX0uYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fem9vbT1kMy56b29tKCkub24oImVuZCIsZnVuY3Rpb24oKXt0aGlzLl96b29tU3RhcnRDb29yZHMmJihNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLngtCnRoaXMuX3pvb21UcmFuc2Zvcm0ueCwyKStNYXRoLnBvdyh0aGlzLl96b29tU3RhcnRDb29yZHMueS10aGlzLl96b29tVHJhbnNmb3JtLnksMikpPHRoaXMuX21heFpvb21EaXN0YW5jZUZvckNsaWNrP3RoaXMuX2ZpcmVFbmFibGVDbGljaygpOnNldFRpbWVvdXQodGhpcy5fZmlyZUVuYWJsZUNsaWNrLmJpbmQodGhpcyksNTApKTt0aGlzLl96b29tU3RhcnRDb29yZHM9bnVsbH0uYmluZCh0aGlzKSkub24oInpvb20iLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVRyYW5zZm9ybT1kMy5ldmVudC50cmFuc2Zvcm07dGhpcy5fem9vbVN0YXJ0Q29vcmRzfHwodGhpcy5fem9vbVN0YXJ0Q29vcmRzPXRoaXMuX3pvb21UcmFuc2Zvcm0sdGhpcy5maXJlKCJkaXNhYmxlLWNsaWNrIikpO3RoaXMuX3pvb21lZD0hMDtkMy5zZWxlY3QodGhpcy4kLnJvb3QpLmF0dHIoInRyYW5zZm9ybSIsZDMuZXZlbnQudHJhbnNmb3JtKTt0aGlzLm1pbmltYXAuem9vbShkMy5ldmVudC50cmFuc2Zvcm0pfS5iaW5kKHRoaXMpKTsKZDMuc2VsZWN0KHRoaXMuJC5zdmcpLmNhbGwodGhpcy5fem9vbSkub24oImRibGNsaWNrLnpvb20iLG51bGwpO2QzLnNlbGVjdCh3aW5kb3cpLm9uKCJyZXNpemUiLGZ1bmN0aW9uKCl7dGhpcy5taW5pbWFwLnpvb20oKX0uYmluZCh0aGlzKSk7dGhpcy5taW5pbWFwPXRoaXMuJC5taW5pbWFwLmluaXQodGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tLHRmLmdyYXBoLmxheW91dC5QQVJBTVMubWluaW1hcC5zaXplLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5sYWJlbEhlaWdodCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSExO3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9idWlsZChiKX0sX2FuaW1hdGVBbmRGaXQ6ZnVuY3Rpb24oYil7IXRoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlJiYKYiYmc2V0VGltZW91dCh0aGlzLmZpdC5iaW5kKHRoaXMpLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuYW5pbWF0aW9uLmR1cmF0aW9uKX0sX3VwZGF0ZUxhYmVsczpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIudGl0bGUiKSxmPWQuc3R5bGUsaD10aGlzLiQkKCIuYXV4VGl0bGUiKSxrPWguc3R5bGUsdD10aGlzLiQkKCIuZnVuY3Rpb25MaWJyYXJ5VGl0bGUiKS5zdHlsZTtjb25zdCBsPWQzLnNlbGVjdCh0aGlzLiQuc3ZnKTt2YXIgcD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5DT1JFKS5ub2RlKCk7aWYoYiYmcCYmdGhpcy5wcm9ncmVzcyYmMTAwPT09dGhpcy5wcm9ncmVzcy52YWx1ZSl7Yj1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLm5vZGUoKXx8bC5zZWxlY3QoIi4iKwp0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5HUk9VUCsiXHgzZS4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLm5vZGUoKTt2YXIgbT1wLmdldENUTSgpLmU7cD1iP2IuZ2V0Q1RNKCkuZTpudWxsO2YuZGlzcGxheT0iaW5saW5lIjtmLmxlZnQ9bSsicHgiO251bGwhPT1wJiZwIT09bT8oay5kaXNwbGF5PSJpbmxpbmUiLHA9TWF0aC5tYXgobStkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLHApLGsubGVmdD1wKyJweCIpOmsuZGlzcGxheT0ibm9uZSI7ZD0oZD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5ub2RlKCkpP2QuZ2V0Q1RNKCkuZTpudWxsO251bGwhPT1kJiZkIT09cD8odC5kaXNwbGF5PSJpbmxpbmUiLGQ9TWF0aC5tYXgocCtoLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGQpLHQubGVmdD1kKyJweCIpOgp0LmRpc3BsYXk9Im5vbmUifWVsc2UgZi5kaXNwbGF5PSJub25lIixrLmRpc3BsYXk9Im5vbmUiLHQuZGlzcGxheT0ibm9uZSJ9LF9jb2xvckJ5Q2hhbmdlZDpmdW5jdGlvbigpe251bGwhPXRoaXMucmVuZGVySGllcmFyY2h5JiYoXy5lYWNoKHRoaXMuX25vZGVHcm91cEluZGV4LChiLGQpPT57dGhpcy5fdXBkYXRlTm9kZVN0YXRlKGQpfSksdGhpcy5taW5pbWFwLnVwZGF0ZSgpKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U9ITA7dGYuZ3JhcGguc2NlbmUuZml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSxmdW5jdGlvbigpe3RoaXMuX3pvb21lZD0hMX0uYmluZCh0aGlzKSl9LGlzTm9kZVNlbGVjdGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5zZWxlY3RlZE5vZGV9LGlzTm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5oaWdobGlnaHRlZE5vZGV9LGFkZEFubm90YXRpb25Hcm91cDpmdW5jdGlvbihiLApkLGYpe2I9Yi5ub2RlLm5hbWU7dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl09dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl18fHt9O3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdW2Qubm9kZS5uYW1lXT1mfSxnZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdfSxyZW1vdmVBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYixkKXtkZWxldGUgdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYi5ub2RlLm5hbWVdW2Qubm9kZS5uYW1lXX0sYWRkTm9kZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fbm9kZUdyb3VwSW5kZXhbYl09ZH0sZ2V0Tm9kZUdyb3VwOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0scmVtb3ZlTm9kZUdyb3VwOmZ1bmN0aW9uKGIpe2RlbGV0ZSB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0sYWRkRWRnZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZWRnZUdyb3VwSW5kZXhbYl09CmR9LGdldEVkZ2VHcm91cDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWRnZUdyb3VwSW5kZXhbYl19LF91cGRhdGVIZWFsdGhQaWxsczpmdW5jdGlvbihiLGQpe3RmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGxzKHRoaXMuJC5zdmcsYixkKX0sX3VwZGF0ZU5vZGVTdGF0ZTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmdldE5vZGUoYiksZj10aGlzLmdldE5vZGVHcm91cChiKTtmJiZ0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZixkLHRoaXMpO2Qubm9kZS50eXBlPT09dGYuZ3JhcGguTm9kZVR5cGUuTUVUQSYmZC5ub2RlLmFzc29jaWF0ZWRGdW5jdGlvbiYmIWQuaXNMaWJyYXJ5RnVuY3Rpb24mJihmPWQzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKycgZ1tkYXRhLW5hbWVceDNkIicrKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrCmQubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24pKyciXScpLHRmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShmLGQsdGhpcykpO18uZWFjaCh0aGlzLmdldEFubm90YXRpb25Hcm91cHNJbmRleChiKSxoPT57dGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGgsZCx0aGlzLHRmLmdyYXBoLnNjZW5lLkNsYXNzLkFubm90YXRpb24uTk9ERSl9KX0sX3NlbGVjdGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtpZihiIT09ZCYmKGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSxiKSl7dGhpcy5taW5pbWFwLnVwZGF0ZSgpO2Q9dGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5Lm5vZGUoYik7Zm9yKHZhciBmPVtdO251bGwhPWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLm5hbWUhPXRmLmdyYXBoLlJPT1RfTkFNRTspZD1kLnBhcmVudE5vZGUsZi5wdXNoKGQubmFtZSk7dmFyIGg7Xy5mb3JFYWNoUmlnaHQoZixrPT57dGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoayk7Cms9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShrKTtrLm5vZGUuaXNHcm91cE5vZGUmJiFrLmV4cGFuZGVkJiYoay5leHBhbmRlZD0hMCxofHwoaD1rKSl9KTtoJiYodGhpcy5zZXROb2RlRXhwYW5kZWQoaCksdGhpcy5fem9vbWVkPSEwKTtiJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYik7c2V0VGltZW91dCgoKT0+e3RoaXMucGFuVG9Ob2RlKGIpfSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9fSxfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2IhPT1kJiYoYiYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGIpLGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSl9LF9vblpvb21DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpfSxfZmlyZUVuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJlbmFibGUtY2xpY2siKX0sX3VwZGF0ZUlucHV0VHJhY2U6ZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5ub2RlLnVwZGF0ZUlucHV0VHJhY2UodGhpcy5nZXRHcmFwaFN2Z1Jvb3QoKSwKdGhpcy5yZW5kZXJIaWVyYXJjaHksdGhpcy5zZWxlY3RlZE5vZGUsdGhpcy50cmFjZUlucHV0cyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGguaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9ncmFwaENoYW5nZWQifSxiYXNpY0dyYXBoOk9iamVjdCxzdGF0czpPYmplY3QsZGV2aWNlc0ZvclN0YXRzOk9iamVjdCxoaWVyYXJjaHlQYXJhbXM6T2JqZWN0LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRFZGdlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9sYXN0U2VsZWN0ZWRFZGdlR3JvdXA6T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFjZUlucHV0czpCb29sZWFuLApub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxfcmVuZGVyRGVwdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9hbGxvd0dyYXBoU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLGVkZ2VXaWR0aEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlTm9kZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0sZWRnZUxhYmVsRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOiIifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6e3R5cGU6T2JqZWN0LHZhbHVlOiIifX0sb2JzZXJ2ZXJzOlsiX3N0YXRzQ2hhbmdlZChzdGF0cywgZGV2aWNlc0ZvclN0YXRzKSIsIl9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShncmFwaEhpZXJhcmNoeSwgZWRnZVdpZHRoRnVuY3Rpb24sIGhhbmRsZU5vZGVTZWxlY3RlZCwgZWRnZUxhYmVsRnVuY3Rpb24sIGhhbmRsZUVkZ2VTZWxlY3RlZCkiLCJfc2VsZWN0ZWROb2RlQ2hhbmdlZChzZWxlY3RlZE5vZGUpIiwKIl9zZWxlY3RlZEVkZ2VDaGFuZ2VkKHNlbGVjdGVkRWRnZSkiXSxwYW5Ub05vZGUoYil7dGhpcy4kJCgidGYtZ3JhcGgtc2NlbmUiKS5wYW5Ub05vZGUoYil9LF9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShiKXtiJiZ0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeShiKX0sX3N0YXRzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuZ3JhcGhIaWVyYXJjaHkmJihiJiZkJiYodGYuZ3JhcGguam9pblN0YXRzSW5mb1dpdGhHcmFwaCh0aGlzLmJhc2ljR3JhcGgsYixkKSx0Zi5ncmFwaC5oaWVyYXJjaHkuam9pbkFuZEFnZ3JlZ2F0ZVN0YXRzKHRoaXMuZ3JhcGhIaWVyYXJjaHkpKSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KSl9LF9idWlsZFJlbmRlckhpZXJhcmNoeTpmdW5jdGlvbihiKXt0Zi5ncmFwaC51dGlsLnRpbWUoIm5ldyB0Zi5ncmFwaC5yZW5kZXIuSGllcmFyY2h5IixmdW5jdGlvbigpe2Z1bmN0aW9uIGQoaCl7cmV0dXJue21pblZhbHVlOmguZG9tYWluKClbMF0sCm1heFZhbHVlOmguZG9tYWluKClbMV0sc3RhcnRDb2xvcjpoLnJhbmdlKClbMF0sZW5kQ29sb3I6aC5yYW5nZSgpWzFdfX1pZihiLnJvb3QudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEpe3ZhciBmPW5ldyB0Zi5ncmFwaC5yZW5kZXIuUmVuZGVyR3JhcGhJbmZvKGIsISF0aGlzLnN0YXRzKTtmLmVkZ2VMYWJlbEZ1bmN0aW9uPXRoaXMuZWRnZUxhYmVsRnVuY3Rpb247Zi5lZGdlV2lkdGhGdW5jdGlvbj10aGlzLmVkZ2VXaWR0aEZ1bmN0aW9uO3RoaXMuX3NldENvbG9yQnlQYXJhbXMoe2NvbXB1dGVfdGltZTpkKGYuY29tcHV0ZVRpbWVTY2FsZSksbWVtb3J5OmQoZi5tZW1vcnlVc2FnZVNjYWxlKSxkZXZpY2U6Xy5tYXAoZi5kZXZpY2VDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57ZGV2aWNlOmgsY29sb3I6Zi5kZXZpY2VDb2xvck1hcChoKX19KSx4bGFfY2x1c3RlcjpfLm1hcChmLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57eGxhX2NsdXN0ZXI6aCwKY29sb3I6Zi54bGFDbHVzdGVyQ29sb3JNYXAoaCl9fSl9KTt0aGlzLl9zZXRSZW5kZXJIaWVyYXJjaHkoZik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgicmVuZGVyZWQiKX0pfX0uYmluZCh0aGlzKSl9LF9nZXRWaXNpYmxlOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoYik6Yn0sbGlzdGVuZXJzOnsiZ3JhcGgtc2VsZWN0IjoiX2dyYXBoU2VsZWN0ZWQiLCJkaXNhYmxlLWNsaWNrIjoiX2Rpc2FibGVDbGljayIsImVuYWJsZS1jbGljayI6Il9lbmFibGVDbGljayIsIm5vZGUtdG9nZ2xlLWV4cGFuZCI6Il9ub2RlVG9nZ2xlRXhwYW5kIiwibm9kZS1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwibm9kZS1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwibm9kZS11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCIsIm5vZGUtdG9nZ2xlLWV4dHJhY3QiOiJfbm9kZVRvZ2dsZUV4dHJhY3QiLAoibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiOiJfbm9kZVRvZ2dsZVNlcmllc0dyb3VwIiwiZWRnZS1zZWxlY3QiOiJfZWRnZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCJ9LGZpdDpmdW5jdGlvbigpe3RoaXMuJC5zY2VuZS5maXQoKX0sX2dyYXBoQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZ3JhcGgtc2VsZWN0Iil9LF9ncmFwaFNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG51bGwpLHRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLG51bGwpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZGlzYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMX0sX2VuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0KITB9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkKGIpe3RoaXMuaGFuZGxlTm9kZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZChiKX0sX3NlbGVjdGVkRWRnZUNoYW5nZWQoYil7dGhpcy5fZGVzZWxlY3RQcmV2aW91c0VkZ2UoKTtiJiYodGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLmNsYXNzZWQodGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCwhMCksdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYikpO3RoaXMuaGFuZGxlRWRnZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZChiKX0sX25vZGVTZWxlY3RlZDpmdW5jdGlvbihiKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiZ0aGlzLnNldCgic2VsZWN0ZWROb2RlIixiLmRldGFpbC5uYW1lKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZWRnZVNlbGVjdGVkKGIpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsYi5kZXRhaWwuZWRnZUdyb3VwKSwKdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsYi5kZXRhaWwuZWRnZURhdGEpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfbm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLGIuZGV0YWlsLm5hbWUpfSxfbm9kZVVuaGlnaGxpZ2h0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixudWxsKX0sX25vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oYil7dGhpcy5fbm9kZVNlbGVjdGVkKGIpO2I9Yi5kZXRhaWwubmFtZTt2YXIgZD10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpO2Qubm9kZS50eXBlIT09dGYuZ3JhcGguTm9kZVR5cGUuT1AmJih0aGlzLnJlbmRlckhpZXJhcmNoeS5idWlsZFN1YmhpZXJhcmNoeShiKSxkLmV4cGFuZGVkPSFkLmV4cGFuZGVkLHRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKGQpfSw3NSkpfSxfbm9kZVRvZ2dsZUV4dHJhY3Q6ZnVuY3Rpb24oYil7dGhpcy5ub2RlVG9nZ2xlRXh0cmFjdChiLmRldGFpbC5uYW1lKX0sCm5vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGIpe2I9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKTtiLm5vZGUuaW5jbHVkZT1iLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTpiLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0aGlzLnJlbmRlckhpZXJhcmNoeS5pc05vZGVBdXhpbGlhcnkoYik/dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0sX25vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihiKXt0aGlzLm5vZGVUb2dnbGVTZXJpZXNHcm91cChiLmRldGFpbC5uYW1lKX0sbm9kZVRvZ2dsZVNlcmllc0dyb3VwOmZ1bmN0aW9uKGIpe3RmLmdyYXBoLnRvZ2dsZU5vZGVTZXJpZXNHcm91cCh0aGlzLmhpZXJhcmNoeVBhcmFtcy5zZXJpZXNNYXAsCmIpO3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dGYuZ3JhcGguaGllcmFyY2h5LmJ1aWxkKHRoaXMuYmFzaWNHcmFwaCx0aGlzLmhpZXJhcmNoeVBhcmFtcyx0Zi5ncmFwaC51dGlsLmdldFN1YnRhc2tUcmFja2VyKHRmLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSwxMDAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKSkudGhlbihmdW5jdGlvbihkKXt0aGlzLnNldCgiZ3JhcGhIaWVyYXJjaHkiLGQpO3RoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpfS5iaW5kKHRoaXMpKX0sX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCl7ZDMuc2VsZWN0KCIuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVEKS5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITEpLmVhY2goYj0+e2lmKGIubGFiZWwpe2NvbnN0IGQ9ZDMuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpO2IubGFiZWwuc3RhcnRNYXJrZXJJZCYmCmQuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtiLmxhYmVsLnN0YXJ0TWFya2VySWR9KWApO2IubGFiZWwuZW5kTWFya2VySWQmJmQuc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7Yi5sYWJlbC5lbmRNYXJrZXJJZH0pYCl9fSl9LF91cGRhdGVNYXJrZXJPZlNlbGVjdGVkRWRnZShiKXtpZihiLmxhYmVsKXt2YXIgZD1iLmxhYmVsLnN0YXJ0TWFya2VySWR8fGIubGFiZWwuZW5kTWFya2VySWQ7aWYoZCl7Y29uc3QgZj1kLnJlcGxhY2UoImRhdGFmbG93LSIsInNlbGVjdGVkLSIpO2xldCBoPXRoaXMuJCQoIiMiK2YpO2h8fChkPXRoaXMuJC5zY2VuZS5xdWVyeVNlbGVjdG9yKCIjIitkKSxoPWQuY2xvbmVOb2RlKCEwKSxoLnNldEF0dHJpYnV0ZSgiaWQiLGYpLGguY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQtYXJyb3doZWFkIiksZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGgpKTtiPWIubGFiZWwuc3RhcnRNYXJrZXJJZD8ibWFya2VyLXN0YXJ0IjoibWFya2VyLWVuZCI7dGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpLnN0eWxlKGIsCmB1cmwoIyR7Zn0pYCl9fX0sbm90OmZ1bmN0aW9uKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWxvYWRlci90Zi1ncmFwaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxzZWxlY3RlZERhdGE6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0scHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0SGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfbG9hZERhdGEoZGF0YXNldHMsIHNlbGVjdGVkRGF0YSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsCiJfbG9hZEZpbGUoc2VsZWN0ZWRGaWxlLCBvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX2xvYWREYXRhKCl7dGhpcy5kZWJvdW5jZSgibG9hZCIsKCk9Pntjb25zdCBmPXRoaXMuZGF0YXNldHNbdGhpcy5zZWxlY3RlZERhdGFdO2YmJnRoaXMuX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZi5wYXRoKX0pfSxfcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmLGgpe2NvbnN0IGs9dGhpcy5vdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLHQ9dGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI7dGhpcy5wcm9ncmVzcz17dmFsdWU6MCxtc2c6IiJ9O2NvbnN0IGw9Yi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykscD1PYmplY3QuYXNzaWduKHt9LGIuZ3JhcGguaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMsayk7Yi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChsLApmLGgsdCxwKS50aGVuKCh7Z3JhcGg6bSxncmFwaEhpZXJhcmNoeTpufSk9Pnt0aGlzLl9zZXRPdXRIaWVyYXJjaHlQYXJhbXMocCk7dGhpcy5fc2V0T3V0R3JhcGgobSk7dGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkobil9KX0sX2xvYWRGaWxlKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL2hlYWx0aC1waWxscy5qcwp2YXIgVmk7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGssdCl7aWYobnVsbD09ayl0aHJvdyBFcnJvcihgTWlzc2luZyByZWZWYWx1ZSBmb3IgY29uZGl0aW9uICgke3R9KS5gKTt9ZnVuY3Rpb24gZihrKXtyZXR1cm4gbnVsbD09a3x8MD09ay5sZW5ndGh8fDEhPT1rWzBdfWNvbnN0IGg9e0lORl9PUl9OQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyArLy1cdTIyMWUgb3IgTmFOIixwcmVkaWNhdGU6az0+MDxrWzJdfHwwPGtbM118fDA8a1s3XX0sSU5GOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIixwcmVkaWNhdGU6az0+MDxrWzNdfHwwPGtbN119LE5BTjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zIE5hTiIscHJlZGljYXRlOms9PjA8a1syXX0sTUFYX0dUOntkZXNjcmlwdGlvbjoiTWF4IFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUFYX0dUIik7cmV0dXJuIGtbOV0+dH19LE1BWF9MVDp7ZGVzY3JpcHRpb246Ik1heCBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1BWF9MVCIpOwpyZXR1cm4ga1s5XTx0fX0sTUlOX0dUOntkZXNjcmlwdGlvbjoiTWluIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUlOX0dUIik7cmV0dXJuIGtbOF0+dH19LE1JTl9MVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1JTl9MVCIpO3JldHVybiBrWzhdPHR9fSxNRUFOX0dUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNlIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1FQU5fR1QiKTtyZXR1cm4ga1sxMF0+dH19LE1FQU5fTFQ6e2Rlc2NyaXB0aW9uOiJNZWFuIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUVBTl9MVCIpO3JldHVybiBrWzEwXTx0fX0sUkFOR0VfR1Q6e2Rlc2NyaXB0aW9uOiJNYXggLSBNaW4gXHgzZSIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJSQU5HRV9HVCIpO3JldHVybiBrWzldLWtbOF0+dH19LFJBTkdFX0xUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiUkFOR0VfTFQiKTsKcmV0dXJuIGtbOV0ta1s4XTx0fX0sU1REREVWX0dUOntkZXNjcmlwdGlvbjoiU3RhbmRhcmQgZGV2aWF0aW9uIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiU1REREVWX0dUIik7cmV0dXJuIE1hdGguc3FydChrWzExXSk+dH19LFNURERFVl9MVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIlNURERFVl9MVCIpO3JldHVybiBNYXRoLnNxcnQoa1sxMV0pPHR9fX07Yi50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXk9ZnVuY3Rpb24oayl7Zm9yKGNvbnN0IHQgaW4gaClpZihoLmhhc093blByb3BlcnR5KHQpJiZoW3RdLmRlc2NyaXB0aW9uPT09aylyZXR1cm4gdDtyZXR1cm4gbnVsbH07Yi5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5PWZ1bmN0aW9uKGssdCxsKXtpZihmKHQpKXJldHVybiExO2s9aFtrXS5wcmVkaWNhdGU7cmV0dXJuIGsodCxsKX19KShWaXx8KFZpPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2ciLHByb3BlcnRpZXM6e2NvbnRpbnVlTnVtOnt0eXBlOk51bWJlcix2YWx1ZTo1fSxzZXNzaW9uUnVuR286RnVuY3Rpb24sdGVuc29yQ29uZGl0aW9uR286RnVuY3Rpb24sZm9yY2VDb250aW51YXRpb25TdG9wOkZ1bmN0aW9uLF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LF9jb250aW51ZUJ1dHRvbkNvbnRpbnVlVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIixyZWFkb25seTohMH0sX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJTdG9wIENvbnRpbnVhdGlvbiIscmVhZG9ubHk6ITB9LF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbjpTdHJpbmcsX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sX2lzUmVmVmFsdWVJbnB1dEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLApub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKSJdLG5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKXt0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMSl9LF9vcGVuRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm9wZW4oKX0sX2Nsb3NlRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLmNsb3NlKCl9LF9jb250aW51ZUJ1dHRvbkNhbGxiYWNrKCl7dGhpcy5fY29udGludWVCdXR0b25UZXh0PT09dGhpcy5fY29udGludWVCdXR0b25TdG9wVGV4dD90aGlzLmZvcmNlQ29udGludWF0aW9uU3RvcCgpOnRoaXMuX29wZW5EaWFsb2coKX0sdXBkYXRlQ29udGludWVCdXR0b25UZXh0KGIpe3RoaXMuc2V0KCJfY29udGludWVCdXR0b25UZXh0IixiP3RoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6dGhpcy5fY29udGludWVCdXR0b25Db250aW51ZVRleHQpfSxfc2Vzc2lvblJ1bkdvQnV0dG9uQ2FsbGJhY2soKXswPAp0aGlzLmNvbnRpbnVlTnVtPyh0aGlzLnNlc3Npb25SdW5Hbyh0aGlzLmNvbnRpbnVlTnVtKSx0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCksdGhpcy5fY2xvc2VEaWFsb2coKSk6dGhpcy5zZXQoImNvbnRpbnVlTnVtIiwxKX0sX3RlbnNvckNvbnRpbnVlR29CdXR0b25DYWxsYmFjaygpe2lmKG51bGwhPXRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKXt2YXIgYj1WaS50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkodGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO251bGw9PWImJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgVGVuc29yIENvbmRpdGlvbiBuYW1lOiIrdGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO3ZhciBkPU51bWJlcih0aGlzLl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSk7TnVtYmVyLmlzRmluaXRlKGQpPyh0aGlzLnRlbnNvckNvbmRpdGlvbkdvKGIsZCksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOgp0aGlzLnNldCgiX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlIiwwKX19LF9vblNlbGVjdGVkVGVuc29yQ29uZGl0aW9uQ2hhbmdlZChiKXtiPVZpLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleShiKTt0aGlzLnNldCgiX2lzUmVmVmFsdWVJbnB1dEhpZGRlbiIsLTEhPT1bIklORl9PUl9OQU4iLCJJTkYiLCJOQU4iXS5pbmRleE9mKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9oYXNDdXN0b21NZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShfY3VzdG9tTWVzc2FnZSkifSxfaG9zdDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3BvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvcGVuRGlhbG9nKGIsZCl7dGhpcy5zZXQoIl90aXRsZSIsIkRlYnVnZ2VyIGlzIHdhaXRpbmcgZm9yIFNlc3Npb24ucnVuKCkgY29ubmVjdGlvbnMuLi4iKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLG51bGwpO3RoaXMuJC5kaWFsb2cub3BlbigpOwpudWxsIT1iJiZudWxsIT1kJiYodGhpcy5zZXQoIl9ob3N0IixiKSx0aGlzLnNldCgiX3BvcnQiLGQpKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LG9wZW5EaXNhYmxlZERpYWxvZygpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyBub3QgZW5hYmxlZCBpbiB0aGlzIFRlbnNvckJvYXJkIGluc3RhbmNlIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIiwiVG8gZW5hYmxlIHRoZSBkZWJ1Z2dlciBpbiBUZW5zb3JCb2FyZCwgdXNlIHRoZSBmbGFnOiAtLWRlYnVnZ2VyX3BvcnQgXHgzY3BvcnRfbnVtYmVyXHgzZSIpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxfY29tcHV0ZUhpZGRlbihiKXtyZXR1cm4hYn0sX2NvbXB1dGVIYXNDdXN0b21NZXNzYWdlKGIpe3JldHVybiFfLmlzRW1wdHkoYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLXJlc2l6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItcmVzaXplciIscHJvcGVydGllczp7Y3VycmVudExlbmd0aDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxtaW5MZW5ndGg6TnVtYmVyLG1heExlbmd0aDpOdW1iZXIsaXNIb3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcmVzaXplcklkZW50aWZpZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9pc1ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNWZXJ0aWNhbChpc0hvcml6b250YWwpIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9LF9kcmFnU3RhcnRQb3NpdGlvbjpOdW1iZXIsX2RyYWdTdGFydExlbmd0aDpOdW1iZXIsX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s6T2JqZWN0LF9wcmV2aW91c01vdXNlVXBDYWxsYmFjazpPYmplY3R9LGxpc3RlbmVyczp7bW91c2Vkb3duOiJfaGFuZGxlTW91c2VEb3duIn0sCl9oYW5kbGVNb3VzZURvd24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKTt0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrPWQ9PntkLnByZXZlbnREZWZhdWx0KCk7ZD10aGlzLl9kcmFnU3RhcnRMZW5ndGgrKHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGQpLXRoaXMuX2RyYWdTdGFydFBvc2l0aW9uKTtkPU1hdGgubWF4KGQsdGhpcy5taW5MZW5ndGgpO2Q9TWF0aC5taW4oZCx0aGlzLm1heExlbmd0aCk7dGhpcy5zZXQoImN1cnJlbnRMZW5ndGgiLGQpfTt0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaz1kPT57ZC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKX07dGhpcy5zZXQoIl9kcmFnU3RhcnRQb3NpdGlvbiIsdGhpcy5fZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYikpO3RoaXMuc2V0KCJfZHJhZ1N0YXJ0TGVuZ3RoIix0aGlzLmN1cnJlbnRMZW5ndGgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwKdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpfSxfZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYil7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsP2IuY2xpZW50WTpiLmNsaWVudFh9LF9lbmREcmFnKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1udWxsO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9bnVsbH0sX2NvbXB1dGVJc1ZlcnRpY2FsKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9zZWxlY3Rpb24tdHJlZS1ub2RlLmpzCihmdW5jdGlvbihiKXtiLk5PREVfTkFNRV9TRVBBUkFUT1I9Ii8iO2IuREVWSUNFX05BTUVfUEFUVEVSTj0vXlwvam9iOltBLVphLXowLTlfXStcL3JlcGxpY2E6WzAtOV9dK1wvdGFzazpbMC05XStcL2RldmljZTpbQS1aYS16MC05X10rOlswLTldKy87bGV0IGQ7KGZ1bmN0aW9uKGspe2tbay5FTVBUWT0wXT0iRU1QVFkiO2tbay5DSEVDS0VEPTFdPSJDSEVDS0VEIjtrW2suUEFSVElBTD0yXT0iUEFSVElBTCJ9KShkPWIuQ2hlY2tib3hTdGF0ZXx8KGIuQ2hlY2tib3hTdGF0ZT17fSkpO2Iuc3BsaXROb2RlTmFtZT1mdW5jdGlvbihrKXtsZXQgdD1bXTtjb25zdCBsPWsubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKTtudWxsIT1sJiYodC5wdXNoKGxbMF0pLCIvIiE9PWtbbFswXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxrKSxrPWsuc2xpY2UobFswXS5sZW5ndGgrMSkpO3JldHVybiB0LmNvbmNhdChrLnNwbGl0KGIuTk9ERV9OQU1FX1NFUEFSQVRPUikpfTsKYi5nZXRDbGVhbk5vZGVOYW1lPWZ1bmN0aW9uKGspe2xldCB0PWs7Y29uc3QgbD1rLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9bD8odC5sZW5ndGg+bFswXS5sZW5ndGgmJiIvIiE9dFtsWzBdLmxlbmd0aF0mJmNvbnNvbGUuZXJyb3IoJ05vIHNsYXNoICgiLyIpIGFmdGVyIGRldmljZSBuYW1lIGluIG5vZGUgbmFtZTonLGspLHQ9dC5zbGljZShsWzBdLmxlbmd0aCsxKSk6Ii8iPT09dFswXSYmKHQ9dC5zbGljZSgxKSk7dC5pbmRleE9mKCIpIik9PT10Lmxlbmd0aC0xJiYodD10LnNsaWNlKDAsdC5pbmRleE9mKCIvKCIpKSk7cmV0dXJuIHR9O2Iuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oayl7ay5zb3J0KChsLHApPT5sLm5vZGVfbmFtZTxwLm5vZGVfbmFtZT8tMTpsLm5vZGVfbmFtZT5wLm5vZGVfbmFtZT8xOmwub3V0cHV0X3Nsb3QtcC5vdXRwdXRfc2xvdCk7Zm9yKGxldCBsPTA7bDxrLmxlbmd0aDsrK2wpe3ZhciB0PWtbbF0ubm9kZV9uYW1lKwoiLyI7bGV0IHA9ITE7Zm9yKGxldCBtPWwrMTttPGsubGVuZ3RoOysrbSlpZigwPT09a1ttXS5ub2RlX25hbWUuaW5kZXhPZih0KSl7cD0hMDticmVha31wJiYodD1rW2xdLm5vZGVfbmFtZS5zcGxpdCgiLyIpLGtbbF0ubm9kZV9uYW1lKz0iLygiK3RbdC5sZW5ndGgtMV0rIikiKX19O2IucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uPWZ1bmN0aW9uKGspe3JldHVybiBrLmVuZHNXaXRoKCIpIik/ay5zbGljZSgwLGsubGFzdEluZGV4T2YoIi8oIikpOmt9O2IuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXM9ZnVuY3Rpb24oayl7Y29uc3QgdD1bbnVsbCxudWxsXTtpZihrWzBdLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTikpe2xldCBsPWtbMF07Ii8iPT09bFtsLmxlbmd0aC0xXSYmKGw9bC5zbGljZSgwLGwubGVuZ3RoLTEpKTt0WzBdPWw7dFsxXT1rLnNsaWNlKDEpLmpvaW4oIi8iKX1lbHNlIHRbMV09ay5qb2luKCIvIik7cmV0dXJuIHR9O2xldCBmOyhmdW5jdGlvbihrKXtrW2suTm9kZU5hbWU9CjBdPSJOb2RlTmFtZSI7a1trLk9wVHlwZT0xXT0iT3BUeXBlIn0pKGY9Yi5EZWJ1Z1dhdGNoRmlsdGVyTW9kZXx8KGIuRGVidWdXYXRjaEZpbHRlck1vZGU9e30pKTtiLmZpbHRlckRlYnVnV2F0Y2hlcz1mdW5jdGlvbihrLHQsbCl7aWYodD09PWYuTm9kZU5hbWUpcmV0dXJuIGsuZmlsdGVyKHA9PnAubm9kZV9uYW1lLm1hdGNoKGwpKTtpZih0PT09Zi5PcFR5cGUpcmV0dXJuIGsuZmlsdGVyKHA9PnAub3BfdHlwZS5tYXRjaChsKSl9O2NsYXNzIGh7Y29uc3RydWN0b3Ioayx0LGwscCl7dGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlPXQ7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5uYW1lPWs7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5jaGVja2JveFN0YXRlPWQuRU1QVFk7dGhpcy5wYXJlbnQ9bDt0aGlzLmNoaWxkcmVuPXt9O3RoaXMuY2hlY2tib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItY2hlY2tib3giKTt0aGlzLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKCk9Pgp7dGhpcy5faGFuZGxlQ2hhbmdlKCl9LCExKX1faGFuZGxlQ2hhbmdlKCl7aWYodGhpcy5hdm9pZFByb3BhZ2F0aW9uKXRoaXMuZGVidWdXYXRjaCYmdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5kZWJ1Z1dhdGNoKXRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/ZC5DSEVDS0VEOmQuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT90aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKTp0aGlzLnNldE5vZGVzQWJvdmVUb0VtcHR5KCksdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5zZXRDaGVja2JveFN0YXRlKHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT9kLkNIRUNLRUQ6ZC5FTVBUWSwhMCksdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKXtjb25zdCB0PV8udmFsdWVzKHRoaXMuY2hpbGRyZW4pOwpmb3IoO3QubGVuZ3RoOyl7dmFyIGs9dC5wb3AoKTtfLmZvckVhY2goay5jaGlsZHJlbixsPT50LnB1c2gobCkpO2suc2V0Q2hlY2tib3hTdGF0ZShkLkNIRUNLRUQsITApfXRoaXMuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpfWVsc2V7Y29uc3QgdD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTtmb3IoO3QubGVuZ3RoOylrPXQucG9wKCksXy5mb3JFYWNoKGsuY2hpbGRyZW4sbD0+dC5wdXNoKGwpKSxrLnNldENoZWNrYm94U3RhdGUoZC5FTVBUWSwhMCk7dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpfX1pc0xlYWYoKXtyZXR1cm4hIXRoaXMuZGVidWdXYXRjaH1zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCl7dGhpcy5zZXRDaGVja2JveFN0YXRlKGQuQ0hFQ0tFRCk7dGhpcy5faGFuZGxlQ2hhbmdlKCl9c2V0Q2hlY2tib3hTdGF0ZShrLHQpe3RoaXMuYXZvaWRQcm9wYWdhdGlvbj10O3RoaXMuY2hlY2tib3hTdGF0ZT1rO3RoaXMuY2hlY2tib3guY2xhc3NMaXN0LnRvZ2dsZSgicGFydGlhbC1jaGVja2JveCIsCms9PT1kLlBBUlRJQUwpO2s9PT1kLkNIRUNLRUQ/dGhpcy5jaGVja2JveC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik6dGhpcy5jaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTt0aGlzLmF2b2lkUHJvcGFnYXRpb249ITF9aXNDaGVja2JveENoZWNrZWQoKXtyZXR1cm4gdGhpcy5jaGVja2JveC5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKX1zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwhMCk6KHQ9LTEhPT1fLmZpbmRJbmRleChfLnZhbHVlcyhrLmNoaWxkcmVuKSxsPT5sLmNoZWNrYm94U3RhdGUhPT1kLkNIRUNLRUQpLGsuc2V0Q2hlY2tib3hTdGF0ZSh0P2QuUEFSVElBTDpkLkNIRUNLRUQsITApKSxrPWsucGFyZW50fXNldE5vZGVzQWJvdmVUb0VtcHR5KCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwKITApOih0PS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoay5jaGlsZHJlbiksbD0+bC5jaGVja2JveFN0YXRlIT09ZC5FTVBUWSksay5zZXRDaGVja2JveFN0YXRlKHQ/ZC5QQVJUSUFMOmQuRU1QVFksITApKSxrPWsucGFyZW50fXNldExldmVsRG9tKGspe3RoaXMubGV2ZWxEb209a319Yi5TZWxlY3Rpb25UcmVlTm9kZT1ofSkoVml8fChWaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1vcC1zZWxlY3Rvci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC1zZWxlY3RvciIscHJvcGVydGllczp7ZGVidWdXYXRjaGVzOkFycmF5LGRlYnVnV2F0Y2hDaGFuZ2U6T2JqZWN0LG5vZGVDbGlja2VkOkZ1bmN0aW9uLGZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZm9yY2VFeHBhbmROb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfbGV2ZWxOYW1lMkNvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2xldmVsTmFtZTJOb2RlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfd2F0Y2hIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVdhdGNoSGllcmFyY2h5KGRlYnVnV2F0Y2hlcywgZGVidWdXYXRjaENoYW5nZSwgX2ZpbHRlck1vZGUsIF9maWx0ZXJJbnB1dCkifSxfZmlsdGVyTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vZGUgTmFtZSIsCm5vdGlmeTohMH0sX2ZpbHRlcklucHV0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LF9pc0xvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2hpZ2hsaWdodGVkTGV2ZWxEb206e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoX3dhdGNoSGllcmFyY2h5LCBkZWJ1Z1dhdGNoQ2hhbmdlKSIsIl9oYW5kbGVGb3JjZU5vZGVFeHBhbmRBbmRDaGVjayhmb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUpIiwiX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChmb3JjZUV4cGFuZE5vZGVOYW1lKSJdLF9jb21wdXRlV2F0Y2hIaWVyYXJjaHkoYixkLGYsaCl7aD1oLnRyaW0oKTtsZXQgaz1iO251bGwhPWYmJjA8aC5sZW5ndGgmJihrPVZpLmZpbHRlckRlYnVnV2F0Y2hlcyhiLFZpLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlW2YucmVwbGFjZSgvXHMvZywiIildLG5ldyBSZWdFeHAoaCkpKTtjb25zdCB0PW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZSgiIiwKZCk7dC5pc1Jvb3Q9ITA7Xy5mb3JFYWNoKGssbD0+e2NvbnN0IHA9Vmkuc3BsaXROb2RlTmFtZShsLmRldmljZV9uYW1lKyIvIitsLm5vZGVfbmFtZSk7bGV0IG09dDtfLmZvckVhY2gocCwobixxKT0+e3E9PT1wLmxlbmd0aC0xPyhxPW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZShuLGQsbSxsKSxtLmNoaWxkcmVuW25dPXEpOihtLmNoaWxkcmVuW25dfHwobS5jaGlsZHJlbltuXT1uZXcgVmkuU2VsZWN0aW9uVHJlZU5vZGUobixkLG0pKSxtPW0uY2hpbGRyZW5bbl0pfSl9KTtyZXR1cm4gdH0sX2NsZWFyU2VsZWN0b3JIaWVyYXJjaHkoKXtjb25zdCBiPXRoaXMuJCQoIiNzZWxlY3Rvci1oaWVyYXJjaHkiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoYixkLGYsaCl7dGhpcy5faXNMb2FkaW5nfHwodGhpcy5zZXQoIl9pc0xvYWRpbmciLCEwKSx0aGlzLl9jbGVhclNlbGVjdG9ySGllcmFyY2h5KCksCnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9yZW5kZXJIaWVyYXJjaHkoYixkLGYsaCl9LDEwKSl9LF9yZW5kZXJIaWVyYXJjaHkoYixkKXt0aGlzLnNldCgiX2xldmVsTmFtZTJDb250YWluZXIiLHt9KTt0aGlzLnNldCgiX2xldmVsTmFtZTJOb2RlIix7fSk7Yj10aGlzLl9yZW5kZXJMZXZlbChudWxsLG51bGwsYixkKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2VsZWN0b3ItaGllcmFyY2h5IikpLmFwcGVuZENoaWxkKGIpO3RoaXMuc2V0KCJfaXNMb2FkaW5nIiwhMSl9LF9yZW5kZXJMZXZlbChiLGQsZixoKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO251bGwhPWImJmsuc2V0QXR0cmlidXRlKCJsZXZlbC1uYW1lIixiKTtsZXQgdDt0PW51bGw9PWQ/YjpkKyIvIitiO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImxldmVsLWNvbnRhaW5lciIpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1jb2xsYXBzZSIpO2lmKGIpe3RoaXMuX2xldmVsTmFtZTJDb250YWluZXJbdF09Cmw7bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImluZGVudGVkLWxldmVsLWNvbnRhaW5lciIpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UG9seW1lci5kb20oZCkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUiKTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7UG9seW1lci5kb20obikuY2xhc3NMaXN0LmFkZCgibm9kZS1leHBhbmQtYnV0dG9uIik7Y29uc3QgcT0oKT0+e24uc2V0QXR0cmlidXRlKCJpY29uIixsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUiKX07bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpOmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtxKCl9LCExKTtxKCk7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQobik7ClBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKGYuY2hlY2tib3gpO2Yuc2V0TGV2ZWxEb20oZCk7Y29uc3QgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7UG9seW1lci5kb20odSkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUtdGV4dCIpO3UudGV4dENvbnRlbnQ9YjtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZCh1KTtQb2x5bWVyLmRvbShrKS5hcHBlbmRDaGlsZChkKTsoYi5tYXRjaChWaS5ERVZJQ0VfTkFNRV9QQVRURVJOKXx8MT09PU9iamVjdC5rZXlzKGYuY2hpbGRyZW4pLmxlbmd0aCkmJmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKX1lbHNlIGwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtjb25zdCBwPVtdLG09W107UG9seW1lci5kb20obCkuY2xhc3NMaXN0LmFkZCgiY29udGVudC1jb250YWluZXIiKTtfLmZvckVhY2goZi5jaGlsZHJlbiwobixxKT0+e2NvbnN0IHU9bi5kZWJ1Z1dhdGNoO3ZhciB4PXQ7bnVsbD09dCYmKHg9IiIpO3grPSIvIitxOwp0aGlzLl9sZXZlbE5hbWUyTm9kZVt4XT1uO251bGwhPXRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbeF0mJihuLnNldENoZWNrYm94U3RhdGUoVmkuQ2hlY2tib3hTdGF0ZS5DSEVDS0VEKSxuLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKSk7aWYodSl7eD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJvcC1kZXNjcmlwdGlvbiIpO24uY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix5PT57dGhpcy5faGFuZGxlTGVhZk5vZGVTZWxlY3RlZChoLHUseS50YXJnZXQuY2hlY2tlZCl9LCExKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChuLmNoZWNrYm94KTtuLnNldExldmVsRG9tKHgpO3ZhciBBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtBLnRleHRDb250ZW50PSJbIit1Lm9wX3R5cGUrIl0iO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXR5cGUiKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChBKTsKQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7QS50ZXh0Q29udGVudD1xO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXRpdGxlLWxlYWYiKTtBLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2NvbnN0IHk9dGhpcy5fZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKHEsayk7dGhpcy5ub2RlQ2xpY2tlZCh5WzBdLHlbMV0pfSwhMSk7UG9seW1lci5kb20oeCkuYXBwZW5kQ2hpbGQoQSk7bS5wdXNoKHgpfWVsc2Ugbi5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHk9Pnt0aGlzLl9oYW5kbGVNZXRhTm9kZUNoYW5nZShuLGgseS50YXJnZXQuY2hlY2tlZCl9KSxwLnB1c2godGhpcy5fcmVuZGVyTGV2ZWwocSx0LG4saCkpfSk7Yj1uPT57UG9seW1lci5kb20obCkuYXBwZW5kQ2hpbGQobil9O18uZm9yRWFjaChtLGIpO18uZm9yRWFjaChwLGIpO1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGwpO3JldHVybiBrfSxfZ2V0TGVhZkRlYnVnV2F0Y2hlcyhiLGQpe2IuZGVidWdXYXRjaD8KZC5wdXNoKGIuZGVidWdXYXRjaCk6Xy5mb3JFYWNoKGIuY2hpbGRyZW4sZj0+e3RoaXMuX2dldExlYWZEZWJ1Z1dhdGNoZXMoZixkKX0pfSxfZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKGIsZCl7Zm9yKGI9W2JdOzspe2NvbnN0IGY9ZC5nZXRBdHRyaWJ1dGUoImxldmVsLW5hbWUiKTtpZihudWxsPT1mKWJyZWFrO2Vsc2UgYi5wdXNoKGYpO2Q9UG9seW1lci5kb20oZCkucGFyZW50Tm9kZS5wYXJlbnROb2RlfWIucmV2ZXJzZSgpO3JldHVybiBWaS5hc3NlbWJsZURldmljZUFuZE5vZGVOYW1lcyhiKX0sX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKGIsZCxmKXtsZXQgaD1bXTt0aGlzLl9nZXRMZWFmRGVidWdXYXRjaGVzKGIsaCk7Xy5mb3JFYWNoKGgsaz0+e3RoaXMuX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoZCxrLGYpfSl9LF9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGIsZCxmKXtjb25zdCBoPWQuZGV2aWNlX25hbWUrIi8iK2Qubm9kZV9uYW1lO2Y/dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXT0KZDpkZWxldGUgdGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXTtiKGQsZil9LF9oYW5kbGVGb3JjZU5vZGUoYixkKXt0aGlzLnNldCgiX2ZpbHRlcklucHV0IiwiIik7c2V0VGltZW91dCgoKT0+e2lmKG51bGwhPWImJm51bGwhPXRoaXMuX2xldmVsTmFtZTJDb250YWluZXIpe3ZhciBmPVZpLnNwbGl0Tm9kZU5hbWUoYik7Zm9yKGxldCBrPTE7azw9Zi5sZW5ndGg7KytrKXt2YXIgaD1mLnNsaWNlKDAsaykuam9pbigiLyIpO2NvbnN0IHQ9dGhpcy5fbGV2ZWxOYW1lMk5vZGVbaF07bnVsbCE9dCYmbnVsbCE9dC5sZXZlbERvbSYmdC5sZXZlbERvbS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSk7azxmLmxlbmd0aD9udWxsIT10aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdJiZ0aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk6KHQuZGVidWdXYXRjaHx8dGhpcy5faGFuZGxlTWV0YU5vZGVDaGFuZ2UodCwKdC5kZWJ1Z1dhdGNoQ2hhbmdlLCEwKSxkJiYodC5zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCksKGg9dC5kZWJ1Z1dhdGNoKSYmbnVsbD09dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toLm5vZGVfbmFtZV0mJih0aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2JdPWgpKSxudWxsIT10aGlzLl9oaWdobGlnaHRlZExldmVsRG9tJiZ0aGlzLl9oaWdobGlnaHRlZExldmVsRG9tLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIiksdC5sZXZlbERvbS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLHRoaXMuc2V0KCJfaGlnaGxpZ2h0ZWRMZXZlbERvbSIsdC5sZXZlbERvbSkpfX19LDIwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZEFuZENoZWNrKGIpe3RoaXMuX2hhbmRsZUZvcmNlTm9kZShiLCEwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChiKXt0aGlzLl9oYW5kbGVGb3JjZU5vZGUoYiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXNlc3Npb24tcnVucy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNlc3Npb24tcnVucy12aWV3Iixwcm9wZXJ0aWVzOntsYXRlc3RTZXNzaW9uUnVuOk9iamVjdCxzZXNzaW9uUnVuS2V5VG9EZXZpY2VOYW1lczpPYmplY3Qsc29sZUFjdGl2ZTpCb29sZWFuLG5vZGVPclRlbnNvckNsaWNrZWQ6RnVuY3Rpb24sX3J1bktleTJDb3VudDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9ydW5LZXkyTnVtRGV2aWNlczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9hY3RpdmVSdW5LZXk6U3RyaW5nfSxvYnNlcnZlcnM6WyJyZW5kZXJMYXRlc3QobGF0ZXN0U2Vzc2lvblJ1bikiLCJzZXRTb2xlQWN0aXZlU3RhdHVzKHNvbGVBY3RpdmUpIl0scmVuZGVyTGF0ZXN0KGIpe2I9SlNPTi5zdHJpbmdpZnkoYik7dGhpcy5fcnVuS2V5MkNvdW50W2JdPXZvaWQgMD09PXRoaXMuX3J1bktleTJDb3VudFtiXT8xOnRoaXMuX3J1bktleTJDb3VudFtiXSsxO3ZvaWQgMD09PXRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2JdJiYodGhpcy5fcnVuS2V5Mk51bURldmljZXNbYl09CjApO3RoaXMuX2FjdGl2ZVJ1bktleT1iO3RoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpfSx1cGRhdGVOdW1EZXZpY2VzKGIpe251bGwhPXRoaXMuX2FjdGl2ZVJ1bktleSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW3RoaXMuX2FjdGl2ZVJ1bktleV09Yix0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKSl9LHNldFNvbGVBY3RpdmVTdGF0dXMoKXt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpe3RoaXMuX2NsZWFyVGFibGUoKTt0aGlzLl9yZW5kZXJIZWFkZXIoKTtsZXQgYjtmb3IoY29uc3QgZiBpbiB0aGlzLl9ydW5LZXkyQ291bnQpaWYodGhpcy5fcnVuS2V5MkNvdW50Lmhhc093blByb3BlcnR5KGYpKXt2YXIgZD1KU09OLnBhcnNlKGYpOyhkPXRoaXMuX3JlbmRlclJvdyhkLHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2ZdLHRoaXMuX3J1bktleTJDb3VudFtmXSx0aGlzLl9hY3RpdmVSdW5LZXk9PT1mLHRoaXMuc29sZUFjdGl2ZSkpJiYKKGI9ZCl9YiYmKFBvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnNjcm9sbFRvcD1iLm9mZnNldFRvcCl9LF9jbGVhclRhYmxlKCl7Y29uc3QgYj10aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIik7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sX3JlbmRlckhlYWRlcigpe2NvbnN0IGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ZC50ZXh0Q29udGVudD0iRmVlZHMiO2NvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtmLnRleHRDb250ZW50PSJGZXRjaGVzIjtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7aC50ZXh0Q29udGVudD0iVGFyZ2V0cyI7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2sudGV4dENvbnRlbnQ9IiMoRGV2aWNlcykiO2NvbnN0IHQ9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7dC50ZXh0Q29udGVudD0iQ291bnQiO2IuYXBwZW5kQ2hpbGQoZCk7Yi5hcHBlbmRDaGlsZChmKTtiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoayk7Yi5hcHBlbmRDaGlsZCh0KTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKGIpfSxfcmVuZGVyUm93KGIsZCxmLGgsayl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGw9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLmZlZWRzKSxwPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi5mZXRjaGVzKTtiPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi50YXJnZXRzKTtjb25zdCBtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bS50ZXh0Q29udGVudD1kO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtkLnRleHRDb250ZW50PWY7dC5hcHBlbmRDaGlsZChsKTt0LmFwcGVuZENoaWxkKHApOwp0LmFwcGVuZENoaWxkKGIpO3QuYXBwZW5kQ2hpbGQobSk7dC5hcHBlbmRDaGlsZChkKTtoJiYoaz90LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb2xlLWFjdGl2ZS1zZXNzaW9uLXJ1biIpOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsImFjdGl2ZS1zZXNzaW9uLXJ1biIpKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKHQpO2lmKGgpcmV0dXJuIHR9LF9yZW5kZXJHcmFwaEVsZW1lbnRzKGIpe2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtfLmZvckVhY2goYixmPT57Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnRleHRDb250ZW50PWY7aC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibm9kZS1vci10ZW5zb3ItZWxlbWVudCIpO2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5ub2RlT3JUZW5zb3JDbGlja2VkKGYpfSk7ZC5hcHBlbmRDaGlsZChoKX0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1zb3VyY2UtY29kZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNvdXJjZS1jb2RlLXZpZXciLHByb3BlcnRpZXM6e3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxmb2N1c05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb2xkRm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVidWdXYXRjaGVzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxub2RlQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxjb250aW51ZVRvTm9kZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxfaGlnaGxpZ2h0ZWRFbGVtZW50czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2ZpbGVQYXRoU2VsZWN0ZWQ6TnVtYmVyLF9mdWxsRmlsZVBhdGhzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9zaG9ydEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfZmlsZUxpbmVzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJEZXZpY2VOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSwKX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyTm9kZUVsZW1lbnRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2Z1bGxTdGFja1Nob3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9mdWxsU3RhY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlbmRlckRlbGF5TWlsbGlzOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJGaWxlKF9maWxlUGF0aFNlbGVjdGVkKSIsIl9mb2N1c09uTm9kZShmb2N1c05vZGVOYW1lKSJdLHJlbmRlcihiKXtudWxsIT1iJiZ0aGlzLnNldCgiX2RlYnVnV2F0Y2hlcyIsYik7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6InBhdGhzIn0pLnRoZW4oZD0+Cnt0aGlzLnNldCgiX2Z1bGxGaWxlUGF0aHMiLGQucGF0aHMpO2NvbnN0IGY9ZC5wYXRocy5tYXAoaD0+KHtpZDpoLG5hbWU6dGhpcy5fc2hvcnRlblBhdGgoaCxkLnBhdGhzKX0pKTt0aGlzLnNldCgiX3Nob3J0RmlsZVBhdGhzIixmKTswPGYubGVuZ3RoJiZ0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLDApfSl9LF9zaG9ydGVuUGF0aChiKXtiPWIucmVwbGFjZSgvXFwvZywiLyIpO2I9Yi5zcGxpdCgiLyIpO3JldHVybiBiW2IubGVuZ3RoLTFdfSxfcmVuZGVyRmlsZShiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLl9zaG9ydEZpbGVQYXRoc1tiXS5pZDt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToiY29udGVudCIsZmlsZV9wYXRoOmR9KS50aGVuKGY9Pntjb25zdCBoPVtdLGs9Zi5jb250ZW50W2RdLHQ9Zi5saW5lbm9fdG9fb3BfbmFtZV9hbmRfc3RhY2tfcG9zO2Y9e307Zm9yKHZhciBsIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShsKSYmKGZbbF09dFtsXS5sZW5ndGgpOwp0aGlzLl9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKHQpO2ZvcihsPTA7bDxrLmxlbmd0aDsrK2wpe2NvbnN0IG09bCsxO2gucHVzaCh7bGluZW5vOm0sbnVtTm9kZXM6bnVsbCE9dFttXT9TdHJpbmcodFttXS5sZW5ndGgpKyIvIitTdHJpbmcoZlttXSkrIiBcdTI1YmMiOiIiLHRleHQ6dGhpcy5faHRtbEVzY2FwZShrW2xdKX0pfXRoaXMuc2V0KCJfZmlsZUxpbmVzIixoKTtjb25zdCBwPXRoaXM7c2V0VGltZW91dCgoKT0+e2NvbnN0IG09e30sbj17fTtmb3IoY29uc3QgdSBpbiB0KXtpZighdC5oYXNPd25Qcm9wZXJ0eSh1KSljb250aW51ZTtmb3IodmFyIHE9cC4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrdSk7cS5maXJzdENoaWxkOylxLnJlbW92ZUNoaWxkKHEuZmlyc3RDaGlsZCk7Y29uc3QgeD10W3VdO3guc29ydChmdW5jdGlvbihBLHkpe3JldHVybiBBWzBdPHlbMF0/LTE6QVswXT55WzBdPzE6MH0pO2ZvcihsZXQgQT0wO0E8eC5sZW5ndGg7KytBKXtjb25zdCB5PQp4W0FdWzBdLHc9eFtBXVsxXSxDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0cuc2V0QXR0cmlidXRlKCJjbGFzcyIsInNvdXJjZS1saW5lLW5vZGUtZW50dHJ5Iik7Ry5zZXRBdHRyaWJ1dGUoInNvdXJjZUxpbmVubyIsdSk7Ry50ZXh0Q29udGVudD15O0cuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCl9KTtjb25zdCBEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7RC5zZXRBdHRyaWJ1dGUoImljb24iLCJmaWx0ZXItbGlzdCIpO0Quc2V0QXR0cmlidXRlKCJ0aXRsZSIsIlNob3cgc3RhY2siKTtELmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoeSk7dGhpcy5zZXQoIl9mdWxsU3RhY2tOb2RlTmFtZSIsCnkpO3RoaXMuc2V0KCJfZnVsbFN0YWNrU2hvd24iLCEwKTt0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayh5LHRoaXMuX2Z1bGxGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0sTnVtYmVyKHUpKX0pO2NvbnN0IEI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtCLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTtCLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO0IuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCk7Y29uc3QgST10aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLE49dGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV07dGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLEcpO3RoaXMuY29udGludWVUb05vZGUoSSwKTil9KTtDLmFwcGVuZENoaWxkKEQpO0MuYXBwZW5kQ2hpbGQoQik7Qy5hcHBlbmRDaGlsZChHKTtxLmFwcGVuZENoaWxkKEMpO20uaGFzT3duUHJvcGVydHkoeSl8fChtW3ldPVtdKTttW3ldLnB1c2goRyk7bi5oYXNPd25Qcm9wZXJ0eSh5KXx8KG5beV09W0csd10pO3c+blt5XVsxXSYmKG5beV09W0csd10pfXEuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTtxPXAuJCQoIiNzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZS0iK3UpO251bGw9PXEuZ2V0QXR0cmlidXRlKCJ0YXBDYWxsYmFja1NldCIpJiYocS5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57cC5fdG9nZ2xlTGluZU5vZGVzKE51bWJlcih1KSl9KSxxLnNldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiLCEwKSl9cC5zZXQoIl9ub2RlTmFtZTJOb2RlRWxlbWVudHMiLG0pO2Zvcihjb25zdCB1IGluIG4pbi5oYXNPd25Qcm9wZXJ0eSh1KSYmKG5bdV09blt1XVswXSk7cC5zZXQoIl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50IiwKbil9LHRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pfX0sX3RvZ2dsZUxpbmVOb2RlcyhiLGQ9ITEpe2I9dGhpcy4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrYik7bnVsbD09Yi5nZXRBdHRyaWJ1dGUoImhpZGRlbiIpJiYhMCE9PWQ/Yi5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsITApOmIucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX0sX2ZpbHRlckZpbGVUcmFjZWJhY2tzQnlEZWJ1Z1dhdGNoZXMoYil7Y29uc3QgZD10aGlzLmRlYnVnV2F0Y2hlcy5tYXAoaz0+VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGsubm9kZV9uYW1lKSksZj17fSxoPXt9O2Zvcihjb25zdCBrIG9mIHRoaXMuZGVidWdXYXRjaGVzKXtjb25zdCB0PVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihrLm5vZGVfbmFtZSk7Zlt0XT1rLmRldmljZV9uYW1lO2hbdF09ay5ub2RlX25hbWV9dGhpcy5zZXQoIl9ub2RlTmFtZTJEZXZpY2VOYW1lIixmKTt0aGlzLnNldCgiX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lIiwKaCk7Zm9yKGNvbnN0IGsgaW4gYiliLmhhc093blByb3BlcnR5KGspJiYoYltrXT1iW2tdLmZpbHRlcih0PT5fLmluY2x1ZGVzKGQsdFswXSkpKX0sX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3NvdXJjZV9jb2RlIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpfSxfaHRtbEVzY2FwZShiKXtyZXR1cm4gYi5yZXBsYWNlKC8gL2csIlx1MDBhMCIpfSxfZm9jdXNPbk5vZGUoYil7aWYobnVsbCE9Yil7dmFyIGQ9dGhpcy5fc2hvcnRGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0uaWQsZj10aGlzO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9aC5vcF90cmFjZWJhY2tbYl07aD1bXTtmb3IobGV0IGw9MDtsPGsubGVuZ3RoOysrbCl7Y29uc3QgcD0Ka1tsXVsxXTtrW2xdWzBdPT09ZCYmaC5wdXNoKHApfWZvcih2YXIgdCBvZiBmLl9oaWdobGlnaHRlZEVsZW1lbnRzKXQuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKTt0PVtdO2Zvcihjb25zdCBsIG9mIGgpaD10aGlzLiQkKCIjc291cmNlLWxpbmUtIitsKSx0LnB1c2goaCksaC5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZC1zb3VyY2UtbGluZSIpLGYuX3RvZ2dsZUxpbmVOb2RlcyhsLCEwKTtmLnNldCgiX2hpZ2hsaWdodGVkRWxlbWVudHMiLHQpO3RoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKX0pfX0sX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKXtpZihudWxsIT10aGlzLl9vbGRGb2N1c05vZGVOYW1lKWZvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1t0aGlzLl9vbGRGb2N1c05vZGVOYW1lXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPSJub3JtYWwiO2Zvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1tiXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPQoiYm9sZCI7bnVsbD09dGhpcy5fc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50P3RoaXMuX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnRbYl0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pOnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixudWxsKTt0aGlzLnNldCgiX29sZEZvY3VzTm9kZU5hbWUiLGIpfSxfcG9wdWxhdGVGdWxsU3RhY2soYixkLGYpe3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9dGhpcy4kJCgiI2Z1bGwtc3RhY2stY29udGVudCIpO2Zvcig7ay5maXJzdENoaWxkOylrLnJlbW92ZUNoaWxkKGsuZmlyc3RDaGlsZCk7Zm9yKGNvbnN0IHQgb2YgaC5vcF90cmFjZWJhY2tbYl0pe2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxwPXRbMF0sbT1OdW1iZXIodFsxXSk7bC50ZXh0Q29udGVudD0KcCsiOiAiK1N0cmluZyhtKTtfLmluY2x1ZGVzKHRoaXMuX2Z1bGxGaWxlUGF0aHMscCk/KGwuY2xhc3NMaXN0LmFkZCgic3RhY2stZnJhbWUtY2xpY2thYmxlIiksbC5zdHlsZS5jb2xvcj0iYmx1ZSIsbC5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHA9PT1kJiZtPT09ZiYmKGwuc3R5bGVbImZvbnQtd2VpZ2h0Il09ImJvbGQiKSxsLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLHRoaXMuX2Z1bGxGaWxlUGF0aHMuaW5kZXhPZihwKSk7c2V0VGltZW91dCgoKT0+e3RoaXMuX3RvZ2dsZUxpbmVOb2RlcyhtLCEwKTtmb3IoY29uc3QgbiBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYl0pTnVtYmVyKG4uZ2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iKSk9PT1OdW1iZXIobSkmJihuLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KSwKdGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLGwpLHRoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKSxkPT09cCYmZj09PW18fHRoaXMuX3BvcHVsYXRlRnVsbFN0YWNrKGIscCxtKSl9LDIqdGhpcy5fcmVuZGVyRGVsYXlNaWxsaXMpfSkpOihsLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLW5vbmNsaWNrYWJsZSIpLGwuc3R5bGUuY29sb3I9IiM1NTUiKTtrLmFwcGVuZENoaWxkKGwpfX0pfSxfY2xvc2VGdWxsU3RhY2tEaWFsb2coKXt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci1kYXRhLXN1bW1hcnkuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLWRhdGEtc3VtbWFyeSIscHJvcGVydGllczp7bGF0ZXN0VGVuc29yRGF0YTpPYmplY3QsZXhwYW5kSGFuZGxlcjpPYmplY3QsY29udGludWVUb0NhbGxiYWNrOkZ1bmN0aW9uLGhpZ2hsaWdodGVkTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHRlbnNvck5hbWVDbGlja2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LGdldEhlYWx0aFBpbGw6RnVuY3Rpb24sX2hlYWx0aFBpbGxzRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMH0sX3dhdGNoS2V5czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX3dhdGNoS2V5MkRhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyQ291bnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJWYWx1ZVNob3J0Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MlJvdzp7dHlwZTpPYmplY3QsCnZhbHVlOnt9fSxfYWN0aXZlV2F0Y2hLZXk6U3RyaW5nLF9oZWFsdGhQaWxsV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjIwMCxyZWFkb25seTohMH0sX2hlYWx0aFBpbGxIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjMyLHJlYWRvbmx5OiEwfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckxhdGVzdChsYXRlc3RUZW5zb3JEYXRhLCBleHBhbmRIYW5kbGVyKSIsIl9oaWdobGlnaHQoaGlnaGxpZ2h0ZWROb2RlTmFtZSkiXSxsaXN0ZW5lcnM6eyJzaG93LWhlYWx0aC1waWxscy5jaGFuZ2UiOiJfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCJ9LHJlYWR5KCl7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxlbmFibGVIZWFsdGhQaWxscygpe3RoaXMuc2V0KCJfaGVhbHRoUGlsbHNFbmFibGVkIiwhMCk7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCgpe3RoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCk6CnRoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO3RoaXMuX3JlbmRlckFsbCgpfSxfcmVuZGVyQWxsKCl7dGhpcy5fY2xlYXJUZW5zb3JEYXRhVGFibGUoKTtmb3IoY29uc3QgYiBvZiB0aGlzLl93YXRjaEtleXMpdGhpcy5fcmVuZGVyTGF0ZXN0KHRoaXMuX3dhdGNoS2V5MkRhdGFbYl0sdGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcltiXSl9LF90ZW5zb3JEYXRhMldhdGNoS2V5KGIpe3JldHVybiBiLmRldmljZU5hbWUrIi8iK2IudGVuc29yTmFtZSsiOiIrYi5kZWJ1Z09wfSxfcmVuZGVyTGF0ZXN0KGIsZCl7aWYoYil7dmFyIGY9dGhpcy5fdGVuc29yRGF0YTJXYXRjaEtleShiKSxoPW51bGw7IlVuaW5pdGlhbGl6ZWQiIT09Yi5kdHlwZSYmIlVuc3VwcG9ydGVkIiE9PWIuZHR5cGUmJihoPSgpPT5kKGIpKTt2YXIgaz1udWxsIT1iLnZhbHVlP0pTT04uc3RyaW5naWZ5KGIudmFsdWUsKHQsbCk9PmwudG9GaXhlZD9OdW1iZXIobC50b0ZpeGVkKDMpKTpsKToiKENsaWNrIHRvIHZpZXcpIjsKdGhpcy5fd2F0Y2hLZXkyRGF0YVtmXT1iOy0xPT09dGhpcy5fd2F0Y2hLZXlzLmluZGV4T2YoZik/KHRoaXMuX3dhdGNoS2V5cy5wdXNoKGYpLHRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdPTEpOnRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdKz0xO3RoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbZl09aDt0aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2ZdPWs7dGhpcy5fYWN0aXZlV2F0Y2hLZXk9Zjt0aGlzLl9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpO3RoaXMuX3JlbmRlclJvdyhmKX19LF9jbGVhclRlbnNvckRhdGFUYWJsZSgpe2Zvcihjb25zdCBiIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoYikmJih0aGlzLl93YXRjaEtleTJSb3dbYl0ucmVtb3ZlKCksZGVsZXRlIHRoaXMuX3dhdGNoS2V5MlJvd1tiXSl9LF9jbGVhclRlbnNvckRhdGFSb3coYil7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sCl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKXtjb25zdCBiPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpe3RoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO2NvbnN0IGI9dGhpcy4kJCgiI2hlYWx0aC1waWxsLWxlZ2VuZCIpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QudGV4dENvbnRlbnQ9IkxlZ2VuZDoiO2IuYXBwZW5kQ2hpbGQoZCk7ZC5zdHlsZVsibWFyZ2luLXJpZ2h0Il09IjAuNWVtIjtkLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Zm9yKGQ9MDtkPHRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLmxlbmd0aDsrK2Qpe2NvbnN0IGY9dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXNbZF0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Cmguc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjI1ZW0iO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2sudGV4dENvbnRlbnQ9Ilx1MjVhMCI7ay5zdHlsZS5jb2xvcj1mLmJhY2tncm91bmRfY29sb3I7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dC50ZXh0Q29udGVudD1mLmxhYmVsO3Quc3R5bGUuY29sb3I9Zi5iYWNrZ3JvdW5kX2NvbG9yO2guYXBwZW5kQ2hpbGQoayk7aC5hcHBlbmRDaGlsZCh0KTtiLmFwcGVuZENoaWxkKGgpfX0sX3JlbW92ZUFjdGl2ZVN0YXR1c0Zyb21BbGxSb3dzKCl7Zm9yKGNvbnN0IGIgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGIpKWNvbnRpbnVlO2NvbnN0IGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdO1BvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZS10ZW5zb3IiKTtQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpfX0sCl9yZW5kZXJSb3coYil7bGV0IGQsZj0hMTtudWxsIT10aGlzLl93YXRjaEtleTJSb3dbYl0/KGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdLHRoaXMuX2NsZWFyVGVuc29yRGF0YVJvdyhkKSxmPSExKTooZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGY9ITApO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5kZXZpY2VOYW1lLGs9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLHQ9aCsiLyIrazt2YXIgbD10aGlzLl93YXRjaEtleTJDb3VudFtiXSxwPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0udGVuc29yTmFtZSxtPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uZGVidWdPcCxuPXRoaXMuX3dhdGNoS2V5MlZhbHVlU2hvcnRbYl07Y29uc3QgcT10aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2JdLHU9Yj09PXRoaXMuX2FjdGl2ZVdhdGNoS2V5LHg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItbmFtZSIpOwp4LnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIjt4LnN0eWxlLmN1cnNvcj0icG9pbnRlciI7eC50ZXh0Q29udGVudD1wO3guYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e251bGwhPXRoaXMudGVuc29yTmFtZUNsaWNrZWQmJnRoaXMudGVuc29yTmFtZUNsaWNrZWQoaCxrKX0pO2NvbnN0IEE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtBLnRleHRDb250ZW50PWw7Y29uc3QgeT10aGlzLl93YXRjaEtleTJEYXRhW2JdLmR0eXBlO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtjb25zdCB3PXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uc2hhcGU7bC50ZXh0Q29udGVudD15O2NvbnN0IEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtDLnRleHRDb250ZW50PUpTT04uc3RyaW5naWZ5KHcpO2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtHLnRleHRDb250ZW50PW47UG9seW1lci5kb20oRykuY2xhc3NMaXN0LmFkZCgidmFsdWUtZXhwYW5zaW9uLWxpbmsiKTsKbnVsbCE9cSYmKEcuYWRkRXZlbnRMaXN0ZW5lcigidGFwIixxLCExKSxHLnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIixHLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO249bnVsbDtuPXRoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsKHArIjoiK20se2RldmljZV9uYW1lOmgsbm9kZV9uYW1lOmssZHR5cGU6eSxzaGFwZTp3LHZhbHVlOm51bGx9LHEpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTttLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTttLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO20uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soaCxrKX0pO3AuYXBwZW5kQ2hpbGQobSk7ZC5hcHBlbmRDaGlsZCh4KTsKZC5hcHBlbmRDaGlsZChBKTtkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoQyk7ZC5hcHBlbmRDaGlsZChHKTtkLmFwcGVuZENoaWxkKG4pO2QuYXBwZW5kQ2hpbGQocCk7ZC5zZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIsdCk7dSYmKFBvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZW5zb3IiKSxQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpKTt0aGlzLl93YXRjaEtleTJSb3dbYl09ZDtmJiZQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGVuc29yLWRhdGEtdGFibGUgdGJvZHkiKSkuYXBwZW5kQ2hpbGQoZCk7ZC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX0sX3JlbmRlckhlYWx0aFBpbGwoYixkLGYpe2NvbnN0IGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbShoKS5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpOwpudWxsIT1mJiZoLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsZiwhMSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGYuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwic3ZnIik7Zi5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9oZWFsdGhQaWxsV2lkdGgpO2Yuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQpO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsImciKTtmLmFwcGVuZENoaWxkKGspO2guYXBwZW5kQ2hpbGQoZik7Y29uc3QgdD0idGRwLyIrYjt0aGlzLmdldEhlYWx0aFBpbGwoYixkLmRldmljZV9uYW1lLGQubm9kZV9uYW1lLGw9PntudWxsPT1sPyhoLnRleHRDb250ZW50PSJOL0EiLGguc3R5bGUuY29sb3I9ImdyYXkiKTooZC52YWx1ZT1sLHRmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGwoayxkLG51bGwsdCx0aGlzLl9oZWFsdGhQaWxsV2lkdGgsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8KMix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0LzIsMCkpfSk7cmV0dXJuIGh9LF9oaWdobGlnaHQoYil7UG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIikpO2NvbnN0IGQ9W107Zm9yKGNvbnN0IGYgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGYpKWNvbnRpbnVlO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyUm93W2ZdO251bGwhPWguZ2V0QXR0cmlidXRlJiYoaC5nZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIpPT09Yj9kLnB1c2goaCk6UG9seW1lci5kb20oaCkuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKSl9aWYobnVsbCE9Yilmb3IoYj0wO2I8ZC5sZW5ndGg7KytiKVBvbHltZXIuZG9tKGRbYl0pLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIiksZFtiXS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90ZW5zb3Itd2lkZ2V0L3RlbnNvcl93aWRnZXRfYmluYXJ5LmpzCnZhciBXaT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQsZil7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oaCxrKXtoLl9fcHJvdG9fXz1rfXx8ZnVuY3Rpb24oaCxrKXtmb3IodmFyIHQgaW4gaylrLmhhc093blByb3BlcnR5KHQpJiYoaFt0XT1rW3RdKX07cmV0dXJuIGIoZCxmKX1yZXR1cm4gZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKCl7dGhpcy5jb25zdHJ1Y3Rvcj1kfWIoZCxmKTtkLnByb3RvdHlwZT1udWxsPT09Zj9PYmplY3QuY3JlYXRlKGYpOihoLnByb3RvdHlwZT1mLnByb3RvdHlwZSxuZXcgaCl9fSgpLFhpPXRoaXMmJnRoaXMuX19nZW5lcmF0b3J8fGZ1bmN0aW9uKGIsZCl7ZnVuY3Rpb24gZihuKXtyZXR1cm4gZnVuY3Rpb24ocSl7cmV0dXJuIGgoW24scV0pfX1mdW5jdGlvbiBoKG4pe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOwpmb3IoO2s7KXRyeXtpZih0PTEsbCYmKHA9blswXSYyP2xbInJldHVybiJdOm5bMF0/bFsidGhyb3ciXXx8KChwPWxbInJldHVybiJdKSYmcC5jYWxsKGwpLDApOmwubmV4dCkmJiEocD1wLmNhbGwobCxuWzFdKSkuZG9uZSlyZXR1cm4gcDtpZihsPTAscCluPVtuWzBdJjIscC52YWx1ZV07c3dpdGNoKG5bMF0pe2Nhc2UgMDpjYXNlIDE6cD1uO2JyZWFrO2Nhc2UgNDpyZXR1cm4gay5sYWJlbCsrLHt2YWx1ZTpuWzFdLGRvbmU6ITF9O2Nhc2UgNTprLmxhYmVsKys7bD1uWzFdO249WzBdO2NvbnRpbnVlO2Nhc2UgNzpuPWsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocD1rLnRyeXMscD0wPHAubGVuZ3RoJiZwW3AubGVuZ3RoLTFdKSYmKDY9PT1uWzBdfHwyPT09blswXSkpe2s9MDtjb250aW51ZX1pZigzPT09blswXSYmKCFwfHxuWzFdPnBbMF0mJm5bMV08cFszXSkpay5sYWJlbD1uWzFdO2Vsc2UgaWYoNj09PW5bMF0mJmsubGFiZWw8cFsxXSlrLmxhYmVsPQpwWzFdLHA9bjtlbHNlIGlmKHAmJmsubGFiZWw8cFsyXSlrLmxhYmVsPXBbMl0say5vcHMucHVzaChuKTtlbHNle3BbMl0mJmsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZX19bj1kLmNhbGwoYixrKX1jYXRjaChxKXtuPVs2LHFdLGw9MH1maW5hbGx5e3Q9cD0wfWlmKG5bMF0mNSl0aHJvdyBuWzFdO3JldHVybnt2YWx1ZTpuWzBdP25bMV06dm9pZCAwLGRvbmU6ITB9fXZhciBrPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZihwWzBdJjEpdGhyb3cgcFsxXTtyZXR1cm4gcFsxXX0sdHJ5czpbXSxvcHM6W119LHQsbCxwLG07cmV0dXJuIG09e25leHQ6ZigwKSwidGhyb3ciOmYoMSksInJldHVybiI6ZigyKX0sImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJihtW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLG19LFlpPXRoaXMmJnRoaXMuX19yZWFkfHxmdW5jdGlvbihiLGQpe3ZhciBmPSJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZiW1N5bWJvbC5pdGVyYXRvcl07CmlmKCFmKXJldHVybiBiO2I9Zi5jYWxsKGIpO3ZhciBoLGs9W107dHJ5e2Zvcig7KHZvaWQgMD09PWR8fDA8ZC0tKSYmIShoPWIubmV4dCgpKS5kb25lOylrLnB1c2goaC52YWx1ZSl9Y2F0Y2gobCl7dmFyIHQ9e2Vycm9yOmx9fWZpbmFsbHl7dHJ5e2gmJiFoLmRvbmUmJihmPWJbInJldHVybiJdKSYmZi5jYWxsKGIpfWZpbmFsbHl7aWYodCl0aHJvdyB0LmVycm9yO319cmV0dXJuIGt9OwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKEgsSyxNLEwpe3JldHVybiBuZXcgKE18fChNPVByb21pc2UpKShmdW5jdGlvbihRLFQpe2Z1bmN0aW9uIFgoWil7dHJ5e2xhKEwubmV4dChaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBhYShaKXt0cnl7bGEoTFsidGhyb3ciXShaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBsYShaKXtaLmRvbmU/UShaLnZhbHVlKToobmV3IE0oZnVuY3Rpb24oYmEpe2JhKFoudmFsdWUpfSkpLnRoZW4oWCxhYSl9bGEoKEw9TC5hcHBseShILEt8fFtdKSkubmV4dCgpKX0pfWZ1bmN0aW9uIGQoSCl7cmV0dXJuIG51bGwhPT1ILm1hdGNoKC9eaW50WzAtOV0rJC8pfHxudWxsIT09SC5tYXRjaCgvXnVpbnRbMC05XSskLyl9ZnVuY3Rpb24gZihIKXtyZXR1cm4gbnVsbCE9PUgubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PUgubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gaChIKXtyZXR1cm4iYm9vbCI9PT1ILnRvTG93ZXJDYXNlKCl8fAoiYm9vbGVhbiI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gayhIKXtyZXR1cm4ic3RyIj09PUgudG9Mb3dlckNhc2UoKXx8InN0cmluZyI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdChIKXt2YXIgSz0xO0guZm9yRWFjaChmdW5jdGlvbihNKXtLKj1NfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChIKXtyZXR1cm4gMD09PUgubGVuZ3RoPyJzY2FsYXIiOiJbIitIKyJdIn1mdW5jdGlvbiBwKEgpe3ZhciBLPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfSxNPUgubGVuZ3RoO2lmKDE9PT1NKUsudmlld2luZ0RpbXM9WzBdO2Vsc2UgaWYoMTxNKXtpZigyPE0pZm9yKHZhciBMPTA7TDxNLTI7KytMKUsuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLnB1c2goe2RpbTpMLGluZGV4OjA9PT1IW0xdP251bGw6MH0pO2ZvcihMPUgubGVuZ3RoLTI7TDxILmxlbmd0aDsrK0wpSy52aWV3aW5nRGltcy5wdXNoKEwpfXJldHVybiBLfQpmdW5jdGlvbiBtKEgsSyl7aWYoSC52aWV3aW5nRGltc1swXSE9PUsudmlld2luZ0RpbXNbMF18fEgudmlld2luZ0RpbXNbMV0hPT1LLnZpZXdpbmdEaW1zWzFdKXJldHVybiExO0s9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0suc29ydCgpO0g9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0guc29ydCgpO3JldHVybiBKU09OLnN0cmluZ2lmeShLKT09PUpTT04uc3RyaW5naWZ5KEgpfWZ1bmN0aW9uIG4oSCl7cmV0dXJuIDIwPj1ILmxlbmd0aD9IOkguc2xpY2UoMCwxMCkrIi4uLiIrSC5zbGljZShILmxlbmd0aC03LEgubGVuZ3RoKX1mdW5jdGlvbiBxKEgsSyxNLEwpe3ZvaWQgMD09PU0mJihNPTIpO2lmKGlzTmFOKEgpKXJldHVybiJOYU4iO2lmKC1JbmZpbml0eT09PUgpcmV0dXJuIi1cdTIyMWUiO2lmKEluZmluaXR5PT09SClyZXR1cm4iK1x1MjIxZSI7bnVsbD09TCYmKEw9Ck1hdGguYWJzKEgpLEw9MUUzPkwmJi4wMTw9THx8MD09PUw/ImZpeGVkIjoiZXhwb25lbnRpYWwiKTtyZXR1cm4gbnVsbD09THx8ImZpeGVkIj09PUw/Sz8iIitIOkgudG9GaXhlZChNKTpILnRvRXhwb25lbnRpYWwoTSl9ZnVuY3Rpb24gdShILEspe3ZvaWQgMD09PUsmJihLPSEwKTtyZXR1cm4gSD9LPyJUIjoiVHJ1ZSI6Sz8iRiI6IkZhbHNlIn1mdW5jdGlvbiB4KEgsSyl7dm9pZCAwPT09SyYmKEs9NCk7cmV0dXJuIG51bGw9PT1LfHxILmxlbmd0aDw9Sz9IOkguc2xpY2UoMCxLLTEpKyJcdTIwMjYifXZhciBBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0KIm5vbmUiO0suYXBwZW5kQ2hpbGQodGhpcy5kcm9wZG93bil9SC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihLLE0sTCl7dmFyIFE9dGhpcztMLmZvckVhY2goZnVuY3Rpb24oWCl7dmFyIGFhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2FhLnRleHRDb250ZW50PVguY2FwdGlvbjtRLmRyb3Bkb3duLmFwcGVuZENoaWxkKGFhKTtYLmRpc2FibGVkP2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCIpOihhYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24obGEpe2xhLnN0b3BQcm9wYWdhdGlvbigpO1EuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09WC5vbkNsaWNrKVgub25DbGljayhsYSk7US5oaWRlKCl9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbihsYSl7aWYobnVsbCE9PQpYLm9uSG92ZXIpWC5vbkhvdmVyKGxhKTthYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIil9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2FhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtpZihudWxsIT09WC5vbkhvdmVyKXtmb3IodmFyIGxhPVtdLFo9MDtaPGFhLmNoaWxkcmVuLmxlbmd0aDsrK1ope3ZhciBiYT1hYS5jaGlsZHJlbltaXTtiYS5jbGFzc0xpc3QuY29udGFpbnMoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIikmJmxhLnB1c2goYmEpfWxhLmZvckVhY2goZnVuY3Rpb24oZWEpe3JldHVybiBhYS5yZW1vdmVDaGlsZChlYSl9KX19KSl9KTt0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcD1LKyJweCI7dGhpcy5kcm9wZG93bi5zdHlsZS5sZWZ0PQpNKyJweCI7TD10aGlzLmRyb3Bkb3duLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBUPUwubGVmdC1NO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPShLLShMLnRvcC1LKSkudG9GaXhlZCgxKSsicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0oTS1UKS50b0ZpeGVkKDEpKyJweCI7dGhpcy5pc1Nob3duPSEwO3RoaXMuYmx1ckhpZGVGdW5jdGlvbj1mdW5jdGlvbigpe1EuaGlkZSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsUS5ibHVySGlkZUZ1bmN0aW9uKX0sNTApfTtILnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7Zm9yKHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kcm9wZG93bi5maXJzdENoaWxkOyl0aGlzLmRyb3Bkb3duLnJlbW92ZUNoaWxkKHRoaXMuZHJvcGRvd24uZmlyc3RDaGlsZCk7dGhpcy5pc1Nob3duPSExO251bGwhPXRoaXMuYmx1ckhpZGVGdW5jdGlvbiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5ibHVySGlkZUZ1bmN0aW9uKX07SC5wcm90b3R5cGUuc2hvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1Nob3dufTtyZXR1cm4gSH0oKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0pe3ZhciBMPXRoaXM7dGhpcy5jb25maWc9Szt0aGlzLnBhcmVudEVsZW1lbnQ9TTt0aGlzLmJhc2VGbGF0TWVudT1uZXcgQSh0aGlzLnBhcmVudEVsZW1lbnQpO3RoaXMuY3VycmVudENob2ljZVNlbGVjdGlvbnM9e307dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihRLFQpe251bGwhPVEub3B0aW9ucyYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbVF09US5kZWZhdWx0U2VsZWN0aW9uKX0pfUgucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oSyxNKXt2YXIgTD10aGlzLFE9W107dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihULFgpe3ZhciBhYT17Y2FwdGlvbjpULmNhcHRpb24sb25DbGljazpudWxsLG9uSG92ZXI6bnVsbH07aWYobnVsbCE9VC5vcHRpb25zKXt2YXIgbGE9CkwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF07YWEub25Ib3Zlcj1mdW5jdGlvbihaKXt2YXIgYmE9Wi50YXJnZXQsZWE9W107VC5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24oY2Esa2Epe2VhLnB1c2goe2NhcHRpb246a2E9PT1sYT9jYSsiIChcdTI3MTMpIjpjYSxvbkNsaWNrOmZ1bmN0aW9uKCl7bGEhPT1rYSYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF09a2EsVC5jYWxsYmFjayhrYSkpfSxvbkhvdmVyOm51bGx9KX0pO1o9bmV3IEEoYmEpO2JhPWJhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1ouc2hvdyhiYS50b3AsYmEucmlnaHQsZWEpfX1lbHNlIGFhLm9uQ2xpY2s9VC5jYWxsYmFjaztudWxsPT1ULmlzRW5hYmxlZHx8VC5pc0VuYWJsZWQoKXx8KGFhLmRpc2FibGVkPSEwKTtRLnB1c2goYWEpfSk7dGhpcy5iYXNlRmxhdE1lbnUuc2hvdyhLLE0sUSl9O0gucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmJhc2VGbGF0TWVudS5oaWRlKCl9O0gucHJvdG90eXBlLnNob3duPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJhc2VGbGF0TWVudS5zaG93bigpfTtyZXR1cm4gSH0oKSx3OyhmdW5jdGlvbihIKXtIW0guVVA9MV09IlVQIjtIW0guRE9XTj0yXT0iRE9XTiI7SFtILkxFRlQ9M109IkxFRlQiO0hbSC5SSUdIVD00XT0iUklHSFQifSkod3x8KHc9e30pKTt2YXIgQz1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNLEwsUSxULFgpe3RoaXMuc2hhcGU9Szt0aGlzLnNsaWNlRGltcz1bXTt0aGlzLnNsaWNlSW5kaWNlcz1bXTtpZigwPT09dCh0aGlzLnNoYXBlKSl0aHJvdyBFcnJvcigiVGVuc29yRWxlbWVudFNlbGVjdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGVuc29yIHdpdGggemVybyBlbGVtZW50cy4iKTtmb3IoSz0wO0s8TS5zbGljaW5nRGltc0FuZEluZGljZXMubGVuZ3RoOysrSyl7dGhpcy5zbGljZURpbXMucHVzaChNLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5kaW0pO3ZhciBhYT1NLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5pbmRleDtpZihudWxsPT09CmFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFRlbnNvckVsZW1lbnRTZWxlY3Rpb24gZHVlIHRvIHVuZGV0ZXJtaW5lZCBzbGljaW5nIGluZGV4IGF0IGRpbWVuc2lvbiAiK0spO3RoaXMuc2xpY2VJbmRpY2VzLnB1c2goYWEpfXRoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigwPHRoaXMucmFuayYmdGhpcy5zbGljZURpbXMubGVuZ3RoPj10aGlzLnJhbmspdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHNsaWNlRGltcyB0byBoYXZlIGEgbGVuZ3RoIGxlc3MgdGhhbiByYW5rICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgbGVuZ3RoICIrdGhpcy5zbGljZURpbXMubGVuZ3RoKTt0aGlzLnZpZXdEaW1zPVtdO2ZvcihLPTA7Szx0aGlzLnJhbms7KytLKS0xPT09dGhpcy5zbGljZURpbXMuaW5kZXhPZihLKSYmdGhpcy52aWV3RGltcy5wdXNoKEspO2lmKDI8dGhpcy52aWV3RGltcy5sZW5ndGgpdGhyb3cgRXJyb3IoIk9ubHkgc2VsZWN0aW9ucyBpbiAxRCBhbmQgMkQgYXJlIHN1cHBvcnRlZC4iKTsKdGhpcy5yb3dTdGFydD1udWxsPT1MPzA6TDt0aGlzLmNvbFN0YXJ0PW51bGw9PVE/MDpRO3RoaXMucm93Q291bnQ9bnVsbD09VD8xOlQ7dGhpcy5jb2xDb3VudD1udWxsPT1YPzE6WH1ILnByb3RvdHlwZS5nZXRFbGVtZW50U3RhdHVzPWZ1bmN0aW9uKEspe2lmKEsubGVuZ3RoIT09dGhpcy5yYW5rKXRocm93IEVycm9yKCJFeHBlY3RlZCBpbmRpY2VzIHRvIGhhdmUgYSByYW5rIG9mICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgIisoSy5sZW5ndGgrIiAoWyIrSysiXSkiKSk7Zm9yKHZhciBNPTA7TTxLLmxlbmd0aDsrK00paWYoLTEhPT10aGlzLnNsaWNlRGltcy5pbmRleE9mKE0pJiZLW01dIT09dGhpcy5zbGljZUluZGljZXNbdGhpcy5zbGljZURpbXMuaW5kZXhPZihNKV0pcmV0dXJuIG51bGw7TT1udWxsO3ZhciBMPXRoaXMucm93U3RhcnQrdGhpcy5yb3dDb3VudCxRPXRoaXMuY29sU3RhcnQrdGhpcy5jb2xDb3VudDtpZigwPT09dGhpcy52aWV3RGltcy5sZW5ndGgpMD09PUsubGVuZ3RoJiYKKE09e3RvcEVkZ2U6ITAsYm90dG9tRWRnZTohMCxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KTtlbHNlIGlmKDE9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7dmFyIFQ9dGhpcy52aWV3RGltc1swXTtLW1RdPj10aGlzLnJvd1N0YXJ0JiZLW1RdPEwmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KX1lbHNlIGlmKDI9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7VD10aGlzLnZpZXdEaW1zWzBdO3ZhciBYPXRoaXMudmlld0RpbXNbMV07S1tUXT49dGhpcy5yb3dTdGFydCYmS1tUXTxMJiZLW1hdPj10aGlzLmNvbFN0YXJ0JiZLW1hdPFEmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTpLW1hdPT09dGhpcy5jb2xTdGFydCxyaWdodEVkZ2U6S1tYXT09PVEtMX0pfWVsc2UgdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgbGVuZ3RoIG9mIHZpZXdEaW1zOiAiKwp0aGlzLnZpZXdEaW1zKTtyZXR1cm4gTX07SC5wcm90b3R5cGUubW92ZT1mdW5jdGlvbihLLE0pe3ZhciBMPW51bGw7aWYoMD09PXRoaXMucmFua3x8MT09PXRoaXMucmFuayYmKEs9PT13LkxFRlR8fEs9PT13LlJJR0hUKSlyZXR1cm4gbnVsbDtpZihudWxsPT09TS52ZXJ0aWNhbFJhbmdlfHxudWxsPT09TS52ZXJ0aWNhbFJhbmdlWzFdKXRocm93IEVycm9yKCJGYWlsZWQgdG8gbW92ZSBkdWUgdG8gdW5kZXRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0s9PT13LlVQPzA8dGhpcy5yb3dTdGFydCYmKHRoaXMucm93U3RhcnQtLSxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJnRoaXMucm93U3RhcnQ8TS52ZXJ0aWNhbFJhbmdlWzBdJiYoTD13LlVQKSk6Sz09PXcuRE9XTj9udWxsIT1NLnZpZXdpbmdEaW1zJiZudWxsIT1NLnZpZXdpbmdEaW1zWzBdJiZ0aGlzLnJvd1N0YXJ0PHRoaXMuc2hhcGVbTS52aWV3aW5nRGltc1swXV0tMSYmKHRoaXMucm93U3RhcnQrKyxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJgp0aGlzLnJvd1N0YXJ0Pj1NLnZlcnRpY2FsUmFuZ2VbMV0mJihMPXcuRE9XTikpOks9PT13LkxFRlQ/MDx0aGlzLmNvbFN0YXJ0JiYodGhpcy5jb2xTdGFydC0tLG51bGwhPU0uaG9yaXpvbnRhbFJhbmdlJiZ0aGlzLmNvbFN0YXJ0PE0uaG9yaXpvbnRhbFJhbmdlWzBdJiYoTD13LkxFRlQpKTpLPT09dy5SSUdIVCYmbnVsbCE9TS52aWV3aW5nRGltcyYmbnVsbCE9TS52aWV3aW5nRGltc1sxXSYmdGhpcy5jb2xTdGFydDx0aGlzLnNoYXBlW00udmlld2luZ0RpbXNbMV1dLTEmJih0aGlzLmNvbFN0YXJ0KyssbnVsbCE9TS5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ+PU0uaG9yaXpvbnRhbFJhbmdlWzFdJiYoTD13LlJJR0hUKSk7dGhpcy5jb2xDb3VudD10aGlzLnJvd0NvdW50PTE7cmV0dXJuIEx9O0gucHJvdG90eXBlLmdldFJvd1N0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93U3RhcnR9O0gucHJvdG90eXBlLmdldFJvd0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93Q291bnR9OwpILnByb3RvdHlwZS5nZXRDb2xTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbFN0YXJ0fTtILnByb3RvdHlwZS5nZXRDb2xDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbENvdW50fTtyZXR1cm4gSH0oKSxHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0sTCl7dm9pZCAwPT09TCYmKEw9ZnVuY3Rpb24oKXt9KTt0aGlzLnJvb3REaXY9Szt0aGlzLnNoYXBlPU07dGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlPUw7dGhpcy5kaW1Db250cm9scz1bXTt0aGlzLmRpbUlucHV0cz1bXTt0aGlzLmNvbW1hcz1bXTt0aGlzLmRyb3Bkb3ducz1bXTt0aGlzLmJyYWNrZXREaXZzPVtudWxsLG51bGxdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigzPnRoaXMucmFuayl0aHJvdyBFcnJvcigiRGltZW5zaW9uIGNvbnRyb2wgaXMgbm90IGFwcGxpY2FibGUgdG8gdGVuc29yIHNoYXBlcyBsZXNzIHRoYW4gM0Q6IHJlY2VpdmVkICIrCih0aGlzLnJhbmsrIkQgdGVuc29yIHNoYXBlOiAiKSsoSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFwZSkrIi4iKSk7dGhpcy5jcmVhdGVDb21wb25lbnRzKCk7dGhpcy5zbGljaW5nU3BlYz1wKE0pfUgucHJvdG90eXBlLmNyZWF0ZUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtmb3IodmFyIEs9dGhpczt0aGlzLnJvb3REaXYuZmlyc3RDaGlsZDspdGhpcy5yb290RGl2LnJlbW92ZUNoaWxkKHRoaXMucm9vdERpdi5maXJzdENoaWxkKTt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMuYnJhY2tldERpdnNbMF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1swXS50ZXh0Q29udGVudD0iU2xpY2luZzogWyI7dGhpcy5icmFja2V0RGl2c1swXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpOwp0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQodGhpcy5icmFja2V0RGl2c1swXSk7Zm9yKHZhciBNPTA7TTx0aGlzLnJhbms7KytNKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC50aXRsZT0iRGltZW5zaW9uICIrTSsiOiBzaXplXHgzZCIrdGhpcy5zaGFwZVtNXTt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1Db250cm9scy5wdXNoKEwpO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkLnB1c2goITEpO0w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1JbnB1dHMucHVzaChMKTtNPHRoaXMucmFuay0xJiYoTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWNvbW1hIiksCkwudGV4dENvbnRlbnQ9IiwiLHRoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKSx0aGlzLmNvbW1hcy5wdXNoKEwpKTtMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24iKTtMLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRyb3Bkb3ducy5wdXNoKEwpfXRoaXMuYnJhY2tldERpdnNbMV09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1sxXS50ZXh0Q29udGVudD0iXSI7dGhpcy5icmFja2V0RGl2c1sxXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzFdKTt0aGlzLnJvb3REaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLmNsZWFyQWxsRHJvcGRvd25zKCl9KX07SC5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbihLKXtmdW5jdGlvbiBNKGFhKXt2YXIgbGE9WC5kaW1Db250cm9sc1thYV0sWj1YLmRpbUlucHV0c1thYV0sYmE9WC5kcm9wZG93bnNbYWFdO2lmKCJub25lIiE9PVouc3R5bGUuZGlzcGxheSlyZXR1cm4iY29udGludWUiO3ZhciBlYT1YLnNoYXBlW2FhXTtpZigtMSE9PVEuaW5kZXhPZihhYSkpe3ZhciBjYT1UW1EuaW5kZXhPZihhYSldO2xhLnRleHRDb250ZW50PVN0cmluZyhjYSk7Wi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO1oudHlwZT0ibnVtYmVyIjtaLm1pbj0iMCI7Wi5tYXg9U3RyaW5nKGVhLTEpO1oudmFsdWU9U3RyaW5nKGNhKTtYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV18fChsYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtMLmNsZWFyQWxsRHJvcGRvd25zKCk7bGEuc3R5bGUuZGlzcGxheT0ibm9uZSI7Wi5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2sifSksWi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLApmdW5jdGlvbigpe2lmKG51bGw9PT1MLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgY2hhbmdlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzcGVjLiIpO3ZhciBrYT1wYXJzZUludChaLnZhbHVlLDEwKTshaXNGaW5pdGUoa2EpfHwwPmthfHxrYT49ZWF8fE1hdGguZmxvb3IoZWEpIT1lYT9aLnZhbHVlPVN0cmluZyhMLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tRLmluZGV4T2YoYWEpXS5pbmRleCk6KEwuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW1EuaW5kZXhPZihhYSldLmluZGV4PWthLGxhLnRleHRDb250ZW50PVN0cmluZyhrYSksTC5vblNsaWNpbmdTcGVjQ2hhbmdlKEwuc2xpY2luZ1NwZWMpKX0pLFouYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsZnVuY3Rpb24oKXtaLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2xhLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9KSxYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV09CiEwKX1lbHNle2lmKFguc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1hYSl7aWYobnVsbD09PVguc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk1ICIrWC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKyI6IitYLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV19ZWxzZXtpZihudWxsPT09WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk0ICIrWC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rIjoiK1guc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdfWxhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7WC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYWFdfHwobGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPQpsYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtMLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKGJhLGthLmJvdHRvbSxrYS5sZWZ0LGFhKX0pLFguZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2FhXT0hMCl9fXZhciBMPXRoaXM7bnVsbCE9SyYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7dmFyIFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGFhKXtyZXR1cm4gYWEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oYWEpe3JldHVybiBhYS5pbmRleH0pLFg9dGhpcztmb3IoSz0wO0s8dGhpcy5yYW5rOysrSylNKEspfTtILnByb3RvdHlwZS5yZW5kZXJEcm9wZG93bk1lbnVJdGVtcz0KZnVuY3Rpb24oSyxNLEwsUSl7ZnVuY3Rpb24gVChlYSl7aWYoLTE9PT1hYS5pbmRleE9mKGVhKXx8UT09PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdJiZlYTw9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF18fFE9PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdJiZlYT49bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pcmV0dXJuImNvbnRpbnVlIjt2YXIgY2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y2EuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtIik7Y2EudGV4dENvbnRlbnQ9IlN3YXAgd2l0aCBkaW1lbnNpb24gIitlYTtLLmFwcGVuZENoaWxkKGNhKTtjYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe2NhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtYLmRpbUNvbnRyb2xzW2VhXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7CmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Y2EuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO1guZGltQ29udHJvbHNbZWFdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTt2YXIga2E9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1RO2NhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKG51bGw9PT1YLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJEaW1lbnNpb24gc3dhcHBpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNsaWNpbmcgc3BlYyIpO3ZhciBZPWFhLmluZGV4T2YoZWEpO1guc2xpY2luZ1NwZWMudmlld2luZ0RpbXNba2E/MDoxXT1lYTtYLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tZXT17ZGltOlEsaW5kZXg6MH07WC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9Cm51bGw7aWYoWC5vblNsaWNpbmdTcGVjQ2hhbmdlKVgub25TbGljaW5nU3BlY0NoYW5nZShYLnNsaWNpbmdTcGVjKX0pfXZhciBYPXRoaXM7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtmb3IodmFyIGFhPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihlYSl7cmV0dXJuIGVhLmRpbX0pLGxhPXRoaXMsWj0wO1o8dGhpcy5yYW5rOysrWilUKFopO0suYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7aWYoSy5maXJzdENoaWxkKXtLLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Sy5zdHlsZS50b3A9TSsicHgiO0suc3R5bGUubGVmdD1MKyJweCI7Sy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siO1o9Sy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgYmE9Wi5sZWZ0LUw7Sy5zdHlsZS50b3A9KE0tKFoudG9wLU0pKS50b0ZpeGVkKDEpKyJweCI7Sy5zdHlsZS5sZWZ0PShMLWJhKS50b0ZpeGVkKDEpKyJweCJ9fTtILnByb3RvdHlwZS5zZXRTbGljaW5nU3BlYz1mdW5jdGlvbihLKXt0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSykpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJDYW5ub3Qgc2V0IHNsaWNpbmcgc3BlYyB0byBudWxsLiIpO3RoaXMucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpfTtILnByb3RvdHlwZS5jbGVhckFsbERyb3Bkb3ducz1mdW5jdGlvbigpe3RoaXMuZHJvcGRvd25zLmZvckVhY2goZnVuY3Rpb24oSyl7aWYobnVsbCE9Syl7Zm9yKDtLLmZpcnN0Q2hpbGQ7KUsucmVtb3ZlQ2hpbGQoSy5maXJzdENoaWxkKTtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0pfTtyZXR1cm4gSH0oKSxEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmNvbmZpZz0KSztpZighaXNGaW5pdGUoSy5taW4pKXRocm93IEVycm9yKCJtaW4gdmFsdWUgKCIrSy5taW4rIikgaXMgbm90IGZpbml0ZSIpO2lmKCFpc0Zpbml0ZShLLm1heCkpdGhyb3cgRXJyb3IoIm1heCB2YWx1ZSAoIitLLm1heCsiKSBpcyBub3QgZmluaXRlIik7aWYoSy5tYXg8Sy5taW4pdGhyb3cgRXJyb3IoIm1heCAoIitLLm1heCsiKSBpcyBceDNjIG1pbiAoIitLLm1pbisiKSIpO31ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oSyxNKXtpZih0aGlzLmNvbmZpZy5taW4hPT10aGlzLmNvbmZpZy5tYXgpe3ZhciBMPUsuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1MKXtmb3IodmFyIFE9Sy53aWR0aC8xMDAsVD1LLmhlaWdodCxYPS42KlQsYWE9MDsxMDA+YWE7KythYSl7dmFyIGxhPVEqYWEsWj0uMipULGJhPVlpKHRoaXMuZ2V0UkdCKGFhLzEwMCoodGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikrdGhpcy5jb25maWcubWluKSwzKSxlYT1iYVswXSxjYT1iYVsxXTtiYT1iYVsyXTsKTC5iZWdpblBhdGgoKTtMLmZpbGxTdHlsZT0icmdiYSgiK2VhKyIsICIrY2ErIiwgIitiYSsiLCAxKSI7TC5maWxsUmVjdChsYSxaLFEsWCk7TC5zdHJva2UoKX1udWxsIT1NJiZNPj10aGlzLmNvbmZpZy5taW4mJk08PXRoaXMuY29uZmlnLm1heCYmKEs9KE0tdGhpcy5jb25maWcubWluKS8odGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikqSy53aWR0aCxMLmJlZ2luUGF0aCgpLEwuZmlsbFN0eWxlPSJyZ2JhKDAsIDAsIDAsIDEpIixMLm1vdmVUbyhLLC4yKlQpLEwubGluZVRvKEstNCwwKSxMLmxpbmVUbyhLKzQsMCksTC5maWxsKCksTC5iZWdpblBhdGgoKSxMLm1vdmVUbyhLLC44KlQpLEwubGluZVRvKEstNCxUKSxMLmxpbmVUbyhLKzQsVCksTC5maWxsKCkpfX19O3JldHVybiBIfSgpLEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzI1NSwKMCwwXTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA8TT9bMCwwLDI1NV06WzI1NSwxMjcuNSwwXTtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7cmV0dXJuWzI1NSpNLDI1NSpNLDI1NSpNXX07cmV0dXJuIEt9KEQpO0Q9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA+TT9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07dmFyIEw9MCxRPTAsVD0wO009dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihNLXRoaXMuY29uZmlnLm1pbikvCih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7LjM1Pj1NPyhRPU0vLjM1LFQ9MSk6LjM1PE0mJi42NT49TT8oTD0oTS0uMzUpLyguNjUtLjM1KSxRPTEsVD0oLjY1LU0pLyguNjUtLjM1KSk6LjY1PE0mJihMPTEsUT0oMS1NKS8uMzUpO3JldHVyblsyNTUqTCwyNTUqUSwyNTUqVF19O3JldHVybiBLfShEKTt2YXIgSTsoZnVuY3Rpb24oSCl7SFtILlRFWFQ9MV09IlRFWFQiO0hbSC5JTUFHRT0yXT0iSU1BR0UifSkoSXx8KEk9e30pKTt2YXIgTj17R3JheXNjYWxlOkIsSmV0OkR9LE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt0aGlzLnJvb3RFbGVtZW50PUs7dGhpcy50ZW5zb3JWaWV3PU07dGhpcy5iYXNlUnVsZXJUaWNrPXRoaXMudG9wUnVsZXI9dGhpcy52YWx1ZVNlY3Rpb249dGhpcy5zbGljaW5nU3BlY1Jvb3Q9dGhpcy5tZW51VGh1bWI9dGhpcy5pbmZvU3Vic2VjdGlvbj10aGlzLmhlYWRlclNlY3Rpb249bnVsbDsKdGhpcy50b3BSdWxlclRpY2tzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107dGhpcy52YWx1ZVJvd3M9W107dGhpcy52YWx1ZURpdnM9W107dGhpcy5zbGljaW5nQ29udHJvbD10aGlzLnZhbHVlVG9vbHRpcD1udWxsO3RoaXMuY29sc0N1dG9mZj10aGlzLnJvd3NDdXRvZmY9ITE7dGhpcy5tZW51PXRoaXMubWVudUNvbmZpZz10aGlzLnNlbGVjdGlvbj1udWxsO3RoaXMuY29sb3JNYXBOYW1lPSJHcmF5c2NhbGUiO3RoaXMuY29sb3JNYXA9bnVsbDt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMTt0aGlzLmltYWdlQ2VsbFNpemU9MTY7dGhpcy5taW5JbWFnZUNlbGxTaXplPTQ7dGhpcy5tYXhJbWFnZUNlbGxTaXplPTQwO3RoaXMuem9vbVN0ZXBSYXRpbz0xLjI7dGhpcy5udW1lcmljU3VtbWFyeT1udWxsO3RoaXMub3B0aW9ucz1MfHx7fTt0aGlzLnNsaWNpbmdTcGVjPXAodGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpO3RoaXMucmFuaz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZS5sZW5ndGg7CnRoaXMudmFsdWVSZW5kZXJNb2RlPUkuVEVYVH1ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShkKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8Zih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGgodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxrKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSkpdGhyb3cgRXJyb3IoIlJlbmRlcmluZyBkdHlwZSAiK3RoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKyIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7cmV0dXJuWzQsdGhpcy5yZW5kZXJWYWx1ZXMoKV07Y2FzZSAxOnJldHVybiBLLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUucmVuZGVySGVhZGVyPQpmdW5jdGlvbigpe251bGw9PXRoaXMuaGVhZGVyU2VjdGlvbiYmKHRoaXMuaGVhZGVyU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmhlYWRlclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1oZWFkZXIiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5jcmVhdGVNZW51KCkpO3RoaXMucmVuZGVySW5mbygpfTtILnByb3RvdHlwZS5yZW5kZXJJbmZvPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbmZvU3Vic2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWluZm8iKSwKdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9O0gucHJvdG90eXBlLnJlbmRlck5hbWU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIG5hbWUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtpZihudWxsIT10aGlzLm9wdGlvbnMubmFtZSYmMCE9PXRoaXMub3B0aW9ucy5uYW1lLmxlbmd0aCl7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIik7Sy50ZXh0Q29udGVudD0Kbih0aGlzLm9wdGlvbnMubmFtZSk7Sy50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEspfX07SC5wcm90b3R5cGUucmVuZGVyRFR5cGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIGR0eXBlIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWR0eXBlIik7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9ImR0eXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtNLnRleHRDb250ZW50PXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO0suYXBwZW5kQ2hpbGQoTSk7CnRoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoSyl9O0gucHJvdG90eXBlLnJlbmRlclNoYXBlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZSIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9InNoYXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS12YWx1ZSIpO00udGV4dENvbnRlbnQ9bCh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7Sy5hcHBlbmRDaGlsZChNKTsKdGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChLKX07SC5wcm90b3R5cGUuY3JlYXRlTWVudT1mdW5jdGlvbigpe3ZhciBLPXRoaXM7dGhpcy5tZW51Q29uZmlnPXtpdGVtczpbXX07aWYoZih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGQodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxoKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXswPT09TT8oSy52YWx1ZVJlbmRlck1vZGU9SS5URVhULEsucmVuZGVyVmFsdWVzKCkpOihLLnZhbHVlUmVuZGVyTW9kZT1JLklNQUdFLEsudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZnVuY3Rpb24oTCl7Sy5udW1lcmljU3VtbWFyeT1MO0sucmVuZGVyVmFsdWVzKCl9KSl9fSksdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246IlNlbGVjdCBjb2xvciBtYXAuLi4iLApvcHRpb25zOk9iamVjdC5rZXlzKE4pLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXtLLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhOKVtNXTtLLnJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gSy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJab29tIGluIChJbWFnZSBtb2RlKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtLLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRX19KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazpmdW5jdGlvbigpe0suem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09CkkuSU1BR0V9fSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyB5KHRoaXMubWVudUNvbmZpZyx0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMucmVuZGVyTWVudVRodW1iKCkpfTtILnByb3RvdHlwZS56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplKnRoaXMuem9vbVN0ZXBSYXRpbzw9dGhpcy5tYXhJbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplKj10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnJlbmRlck1lbnVUaHVtYj0KZnVuY3Rpb24oKXt2YXIgSz10aGlzO2lmKG51bGw9PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIG1lbnUgdGh1bWIgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhlYWRlciBzZWN0aW9uLiIpO3RoaXMubWVudVRodW1iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYobnVsbCE9PUsubWVudSlpZihLLm1lbnUuc2hvd24oKSlLLm1lbnUuaGlkZSgpO2Vsc2V7dmFyIE09Sy5tZW51VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Sy5tZW51LnNob3coTS5ib3R0b20sTS5sZWZ0KX19KX07SC5wcm90b3R5cGUucmVuZGVyVmFsdWVzPQpmdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLPXRoaXM7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oTSl7c3dpdGNoKE0ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gMjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zbGljaW5nU3BlY1Jvb3QpKSxudWxsPT10aGlzLnZhbHVlU2VjdGlvbiYmKHRoaXMudmFsdWVTZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24pLAp0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZnVuY3Rpb24oTCl7cmV0dXJuIGIoSyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIFE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oVCl7c3dpdGNoKFQubGFiZWwpe2Nhc2UgMDpRPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/UT1MLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P1E9TC5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihRPUwuc2hpZnRLZXkpO2lmKFEmJnRoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSlyZXR1cm4gTC5zdG9wUHJvcGFnYXRpb24oKSxMLnByZXZlbnREZWZhdWx0KCksMDxMLmRlbHRhWT90aGlzLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCk6dGhpcy56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCksWzJdO2lmKG51bGw9PQp0aGlzLnNlbGVjdGlvbilyZXR1cm5bMl07TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7dGhpcy5oaWRlVmFsdWVUb29sdGlwKCk7cmV0dXJuWzQsdGhpcy5zY3JvbGxVcE9yRG93bigwPEwuZGVsdGFZP3cuRE9XTjp3LlVQKV07Y2FzZSAxOnJldHVybiBULnNlbnQoKSxbMl19fSl9KX0pLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oTCl7dmFyIFE9WzM4LDQwLDM3LDM5XTtpZihudWxsIT1LLnNlbGVjdGlvbiYmLTEhPT1RLmluZGV4T2YoTC5rZXlDb2RlKSl7TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7Sy5oaWRlVmFsdWVUb29sdGlwKCk7dmFyIFQ9UT1udWxsOzM4PT09TC5rZXlDb2RlP1Q9dy5VUDo0MD09PUwua2V5Q29kZT9UPXcuRE9XTjozNz09PUwua2V5Q29kZT9UPXcuTEVGVDozOT09PUwua2V5Q29kZSYmKFQ9dy5SSUdIVCk7Cm51bGwhPT1UJiYoUT1LLnNlbGVjdGlvbi5tb3ZlKFQsSy5zbGljaW5nU3BlYykpO251bGw9PT1RP0sucmVuZGVyU2VsZWN0aW9uKCk6UT09PXcuVVB8fFE9PT13LkRPV04/Sy5zY3JvbGxVcE9yRG93bihRKTooUT09PXcuTEVGVHx8UT09PXcuUklHSFQpJiZLLnNjcm9sbExlZnRPclJpZ2h0KFEpfX0pKSx0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCksdGhpcy5jcmVhdGVUb3BSdWxlcigpLHRoaXMuY3JlYXRlTGVmdFJ1bGVyKCksdGhpcy5jcmVhdGVWYWx1ZURpdnMoKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIE0uc2VudCgpLDI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgRyh0aGlzLnNsaWNpbmdTcGVjUm9vdCx0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxmdW5jdGlvbihMKXtyZXR1cm4gYihLLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihRKXtzd2l0Y2goUS5sYWJlbCl7Y2FzZSAwOmlmKG0odGhpcy5zbGljaW5nU3BlYywKTCkpcmV0dXJuWzMsMl07dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKTtyZXR1cm5bNCx0aGlzLnJlbmRlcigpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFszLDRdO2Nhc2UgMjpyZXR1cm4gdGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDM6US5zZW50KCksUS5sYWJlbD00O2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0pLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2xlYXJWYWx1ZVNlY3Rpb249ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy52YWx1ZVNlY3Rpb24pe2Zvcig7dGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy52YWx1ZVNlY3Rpb24ucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZCk7dGhpcy50b3BSdWxlcj1udWxsOwp0aGlzLnZhbHVlUm93cz1bXX19O0gucHJvdG90eXBlLmNyZWF0ZVRvcFJ1bGVyPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7bnVsbD09dGhpcy50b3BSdWxlciYmKHRoaXMudG9wUnVsZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy50b3BSdWxlci5jbGFzc0xpc3QuYWRkKCJ0ZW5lc29yLXdpZGdldC10b3AtcnVsZXIiKSx0aGlzLnRvcFJ1bGVyLnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCIsdGhpcy52YWx1ZVNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy50b3BSdWxlciksdGhpcy50b3BSdWxlclRpY2tzPVtdLHRoaXMudG9wUnVsZXIuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKFgpe3JldHVybiBiKEssdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKGFhKXtzd2l0Y2goYWEubGFiZWwpe2Nhc2UgMDppZihudWxsPT0KdGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO1guc3RvcFByb3BhZ2F0aW9uKCk7WC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsTGVmdE9yUmlnaHQoMDxYLmRlbHRhWT93LlJJR0hUOncuTEVGVCldO2Nhc2UgMTpyZXR1cm4gYWEuc2VudCgpLFsyXX19KX0pfSkpO2Zvcig7dGhpcy50b3BSdWxlci5maXJzdENoaWxkOyl0aGlzLnRvcFJ1bGVyLnJlbW92ZUNoaWxkKHRoaXMudG9wUnVsZXIuZmlyc3RDaGlsZCk7dGhpcy5iYXNlUnVsZXJUaWNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYmFzZVJ1bGVyVGljay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZCh0aGlzLmJhc2VSdWxlclRpY2spOzI8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlPVswLG51bGxdKTt2YXIgTT0xPj10aGlzLnJhbms/CjE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dmFyIEw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDt0aGlzLmNvbHNDdXRvZmY9ITE7Zm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoVC5zdHlsZS53aWR0aD10aGlzLmltYWdlQ2VsbFNpemUrInB4Iik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZChUKTt0aGlzLnRvcFJ1bGVyVGlja3MucHVzaChUKTtpZihULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Pj1MKXtpZigyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPVErMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1NfX07SC5wcm90b3R5cGUuY3JlYXRlTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxlZnQgcnVsZXIgZHVlIHRvIG1pc3NpbmcgdmFsdWUgc2VjdGlvbi4iKTt0aGlzLnZhbHVlUm93cz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdOzE8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZT0KWzAsbnVsbF0pO3ZhciBLPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Zm9yKHZhciBNPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLEw9MDtMPEs7KytMKXt2YXIgUT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtRLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtcm93Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoUS5zdHlsZS5oZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIsUS5zdHlsZS5saW5lSGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiKTt0aGlzLnZhbHVlU2VjdGlvbi5hcHBlbmRDaGlsZChRKTt0aGlzLnZhbHVlUm93cy5wdXNoKFEpO3ZhciBUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1QuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UmJihULnN0eWxlLmhlaWdodD10aGlzLmltYWdlQ2VsbFNpemUrInB4IixULnN0eWxlLmxpbmVIZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIpO1EuYXBwZW5kQ2hpbGQoVCk7dGhpcy5sZWZ0UnVsZXJUaWNrcy5wdXNoKFQpO2lmKFQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tPj1NKXtpZigxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09TCsxO3RoaXMucm93c0N1dG9mZj0hMH1icmVha319aWYoIXRoaXMucm93c0N1dG9mZiYmMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LfX07SC5wcm90b3R5cGUuY3JlYXRlVmFsdWVEaXZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhhYSl7ZnVuY3Rpb24gbGEoYmEpe3ZhciBlYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdiIpO1QudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKGVhLnN0eWxlLndpZHRoPVQuaW1hZ2VDZWxsU2l6ZSsicHgiLGVhLnN0eWxlLmhlaWdodD1ULmltYWdlQ2VsbFNpemUrInB4IixlYS5zdHlsZS5saW5lSGVpZ2h0PVQuaW1hZ2VDZWxsU2l6ZSsicHgiKTtULnZhbHVlUm93c1thYV0uYXBwZW5kQ2hpbGQoZWEpO1QudmFsdWVEaXZzW2FhXS5wdXNoKGVhKTtlYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtNLnNlbGVjdGlvbj1uZXcgQyhNLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxNLnNsaWNpbmdTcGVjLApudWxsPT1NLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PU0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT8wOk0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSthYSxudWxsPT1NLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0/MDpNLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStiYSwxLDEpO00ucmVuZGVyU2VsZWN0aW9uKCl9KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3ZhciBjYT1lYS5nZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIik7aWYobnVsbCE9PWNhKXt2YXIga2E9TS5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxZPWVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEVhPVkuYm90dG9tLVkudG9wLHZhPVkucmlnaHQtWS5sZWZ0LHhhPU0uY2FsY3VsYXRlSW5kaWNlcyhhYSxiYSk7TS5kcmF3VmFsdWVUb29sdGlwKHhhLApjYSxZLnRvcC1rYS50b3ArLjgqRWEsWS5sZWZ0LWthLmxlZnQrLjc1KnZhKX19KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe00uaGlkZVZhbHVlVG9vbHRpcCgpfSl9VC52YWx1ZURpdnNbYWFdPVtdO2Zvcih2YXIgWj0wO1o8TDsrK1opbGEoWil9dmFyIE09dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZhbHVlIHJvd3MgYXJlIHVuZXhwZWN0ZWRseSB1bmluaXRpYWxpemVkLiIpO3RoaXMudmFsdWVEaXZzPVtdO2Zvcih2YXIgTD10aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoLFE9dGhpcy52YWx1ZVJvd3MubGVuZ3RoLFQ9dGhpcyxYPTA7WDxROysrWClLKFgpfTtILnByb3RvdHlwZS5yZW5kZXJUb3BSdWxlcj1mdW5jdGlvbigpe2lmKDI8PXRoaXMucmFuaylmb3IodmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0sTT0wO008dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT0KdGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3ZhciBMPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK007dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLnRvcFJ1bGVyVGlja3NbTV0udGV4dENvbnRlbnQ9TDxLPyIiK0w6IiIpfX07SC5wcm90b3R5cGUucmVuZGVyTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYoMTw9dGhpcy5yYW5rKWZvcih2YXIgSz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXSxNPTA7TTx0aGlzLmxlZnRSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGNpYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt2YXIgTD10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rCk07dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLmxlZnRSdWxlclRpY2tzW01dLnRleHRDb250ZW50PUw8Sz8iIitMOiIiKX19O0gucHJvdG90eXBlLnJlbmRlclZhbHVlRGl2cz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLLE0sTCxRLFQsWCxhYSxsYSxaLGJhLGVhLGNhLGthLFksRWEsdmEseGE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oQWEpe3N3aXRjaChBYS5sYWJlbCl7Y2FzZSAwOnJldHVybiBLPXRoaXMudmFsdWVEaXZzLmxlbmd0aCxNPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aCxbNCx0aGlzLnRlbnNvclZpZXcudmlldyh0aGlzLnNsaWNpbmdTcGVjKV07Y2FzZSAxOkw9QWEuc2VudCgpOzA9PT10aGlzLnJhbms/TD1bW0xdXToxPT09dGhpcy5yYW5rJiYoTD1MLm1hcChmdW5jdGlvbihGYSl7cmV0dXJuW0ZhXX0pKTtRPXRoaXMuZ2V0VmFsdWVDbGFzcygpO1Q9dGhpcy52YWx1ZVJlbmRlck1vZGU7aWYoVD09PQpJLklNQUdFKXtpZihudWxsPT10aGlzLm51bWVyaWNTdW1tYXJ5KXRocm93IEVycm9yKCJGYWlsZWQgdG8gcmVuZGVyIGltYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRlbnNvciBkdWUgdG8gbWlzc2luZyBudW1lcmljIHN1bW1hcnkiKTtYPXRoaXMubnVtZXJpY1N1bW1hcnk7YWE9WC5taW5pbXVtO2xhPVgubWF4aW11bTtpZihudWxsPT1hYXx8bnVsbD09bGEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG1pbmltdW0gb3IgbWF4aW11bSB2YWx1ZXMgaW4gbnVtZXJpYyBzdW1tYXJ5Iik7Wj17bWluOmFhLG1heDpsYX07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBOP25ldyBOW3RoaXMuY29sb3JNYXBOYW1lXShaKTpuZXcgQihaKX1mb3IoYmE9MDtiYTxLOysrYmEpZm9yKGVhPTA7ZWE8TTsrK2VhKWNhPXRoaXMudmFsdWVEaXZzW2JhXVtlYV0sYmE8TC5sZW5ndGgmJmVhPExbYmFdLmxlbmd0aD8KKGthPUxbYmFdW2VhXSxUPT09SS5JTUFHRT8oWT1ZaSh0aGlzLmNvbG9yTWFwLmdldFJHQihrYSksMyksRWE9WVswXSx2YT1ZWzFdLHhhPVlbMl0sY2Euc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2IoIitFYSsiLCAiK3ZhKyIsICIreGErIikiKToibnVtZXJpYyI9PT1RP2NhLnRleHRDb250ZW50PXEoa2EsZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpOiJib29sZWFuIj09PVE/Y2EudGV4dENvbnRlbnQ9dShrYSk6InN0cmluZyI9PT1RJiYoY2EudGV4dENvbnRlbnQ9eChrYSkpLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLHRoaXMuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcoa2EpKSk6KGNhLnRleHRDb250ZW50PSIiLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLCIiKSk7dGhpcy5yZW5kZXJTZWxlY3Rpb24oKTtyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmc9ZnVuY3Rpb24oSyl7cmV0dXJuImJvb2xlYW4iPT09CnRoaXMuZ2V0VmFsdWVDbGFzcygpP3UoSywhMSk6InN0cmluZyI9PT10aGlzLmdldFZhbHVlQ2xhc3MoKT8iTGVuZ3RoLSIrSy5sZW5ndGgrJyBzdHJpbmc6ICInK3goSyw1MDApKyciJzpTdHJpbmcoSyl9O0gucHJvdG90eXBlLnJlbmRlclNlbGVjdGlvbj1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuc2VsZWN0aW9uKWZvcih2YXIgSz10aGlzLnZhbHVlRGl2cy5sZW5ndGgsTT10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGgsTD0wO0w8SzsrK0wpZm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9dGhpcy52YWx1ZURpdnNbTF1bUV07VC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi10b3AiKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0Iik7ClQuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0Iik7dmFyIFg9dGhpcy5jYWxjdWxhdGVJbmRpY2VzKEwsUSk7WD10aGlzLnNlbGVjdGlvbi5nZXRFbGVtZW50U3RhdHVzKFgpO251bGwhPT1YJiYoVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKSxYLnRvcEVkZ2UmJlQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpLFguYm90dG9tRWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIiksWC5sZWZ0RWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tbGVmdCIpLFgucmlnaHRFZGdlJiZULmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpKX19O0gucHJvdG90eXBlLmNhbGN1bGF0ZUluZGljZXM9CmZ1bmN0aW9uKEssTSl7Zm9yKHZhciBMPVtdLFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGxhKXtyZXR1cm4gbGEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24obGEpe3JldHVybiBsYS5pbmRleH0pLFg9MDtYPHRoaXMucmFuazsrK1gpaWYoLTEhPT1RLmluZGV4T2YoWCkpe3ZhciBhYT1UW1EuaW5kZXhPZihYKV07aWYobnVsbD09PWFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGluZGljZXM6IFVuZGV0ZXJtaW5lZCBpbmRleCBhdCBkaW1lbnNpb24gIitYKTtMLnB1c2goYWEpfWVsc2UgaWYoWD09PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF0pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKTC5wdXNoKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStLKX1lbHNlIGlmKFg9PT10aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0wucHVzaCh0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStNKX1yZXR1cm4gTH07SC5wcm90b3R5cGUuZHJhd1ZhbHVlVG9vbHRpcD1mdW5jdGlvbihLLE0sTCxRKXtudWxsPT09dGhpcy52YWx1ZVRvb2x0aXAmJih0aGlzLnZhbHVlVG9vbHRpcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlVG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVUb29sdGlwKSk7CmZvcig7dGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZDspdGhpcy52YWx1ZVRvb2x0aXAucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZCk7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtaW5kaWNlcyIpO1QudGV4dENvbnRlbnQ9IkluZGljZXM6ICIrSlNPTi5zdHJpbmdpZnkoSyk7dGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoVCk7Sz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtLLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSIpO0sudGV4dENvbnRlbnQ9TTt0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChLKTt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS50b3A9TCsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmxlZnQ9USsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjsKdGhpcy52YWx1ZVJlbmRlck1vZGU9PUkuSU1BR0UmJm51bGwhPXRoaXMuY29sb3JNYXAmJihMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLEwuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIiksdGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoTCksdGhpcy5jb2xvck1hcC5yZW5kZXIoTCxwYXJzZUZsb2F0KE0pKSl9O0gucHJvdG90eXBlLmhpZGVWYWx1ZVRvb2x0aXA9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX07SC5wcm90b3R5cGUucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzPWZ1bmN0aW9uKCl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oSyl7c3dpdGNoKEsubGFiZWwpe2Nhc2UgMDpyZXR1cm4gbnVsbCE9dGhpcy5zbGljaW5nQ29udHJvbCYmdGhpcy5zbGljaW5nQ29udHJvbC5zZXRTbGljaW5nU3BlYyh0aGlzLnNsaWNpbmdTcGVjKSwKdGhpcy5jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpLHRoaXMucmVuZGVyVG9wUnVsZXIoKSx0aGlzLnJlbmRlckxlZnRSdWxlcigpLFs0LHRoaXMucmVuZGVyVmFsdWVEaXZzKCldO2Nhc2UgMTpyZXR1cm4gSy5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLmNhbGN1bGF0ZVNob3dJbmRpY2VzT25SdWxlclRpY2tzPWZ1bmN0aW9uKCl7aWYoMjw9dGhpcy5yYW5rKXt2YXIgSz10aGlzLnRvcFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5zaG93SW5kaWNlc09uVGlja3M9Sy5yaWdodC1LLmxlZnQ+OSpNYXRoLmNlaWwoTWF0aC5sb2codGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0pL01hdGguTE4xMCl9ZWxzZSAxPT09dGhpcy5yYW5rPyhLPXRoaXMubGVmdFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5zaG93SW5kaWNlc09uVGlja3M9MTY8Sy5ib3R0b20tCksudG9wKTp0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMX07SC5wcm90b3R5cGUuc2Nyb2xsSG9yaXpvbnRhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigxPj10aGlzLnJhbmspcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7TT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXTtpZigwPkt8fEs+PU0pdGhyb3cgRXJyb3IoIkluZGV4IG91dCBvZiBib3VuZDogIitLKyIgaXMgb3V0c2lkZSBbMCwgIitNKyJdKSIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPUs7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09CksrdGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDtMPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPkwmJih0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxWZXJ0aWNhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigwPT09dGhpcy5yYW5rKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysKIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07aWYoMD5LfHxLPj1NKXRocm93IEVycm9yKCJJbmRleCBvdXQgb2YgYm91bmQ6ICIrSysiIGlzIG91dHNpZGUgWzAsICIrTSsiXSkiKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF09Szt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09Syt0aGlzLnZhbHVlUm93cy5sZW5ndGg7TD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV0+TCYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTsKY2FzZSAxOnJldHVybiBRLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsVXBPckRvd249ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMD09PXRoaXMucmFua3x8IXRoaXMucm93c0N1dG9mZilyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdO2lmKEshPT13LkRPV04pcmV0dXJuWzMsM107TD10aGlzLnZhbHVlUm93cy5sZW5ndGgtCjE7UT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXS1MO3JldHVybiBNPFE/WzQsdGhpcy5zY3JvbGxWZXJ0aWNhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsVmVydGljYWxseShNLTEpXTpbMyw1XTtjYXNlIDQ6VC5zZW50KCksVC5sYWJlbD01O2Nhc2UgNTpyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsTGVmdE9yUmlnaHQ9ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMT49dGhpcy5yYW5rfHwhdGhpcy5jb2xzQ3V0b2ZmKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIkhvcml6b250YWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBob3Jpem9udGFsIHJhbmdlLiIpOwpNPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdO2lmKEshPT13LlJJR0hUKXJldHVyblszLDNdO0w9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aC0xO1E9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0tTDtyZXR1cm4gTTxRP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0tMSldOlszLDVdO2Nhc2UgNDpULnNlbnQoKSxULmxhYmVsPTU7Y2FzZSA1OnJldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5uYXZpZ2F0ZVRvSW5kaWNlcz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIm5hdmlnYXRlVG9JbmRpY2VzKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4iKTsKfSl9KX07SC5wcm90b3R5cGUuZ2V0VmFsdWVDbGFzcz1mdW5jdGlvbigpe3ZhciBLPXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO3JldHVybiBkKEspfHxmKEspPyJudW1lcmljIjpoKEspPyJib29sZWFuIjoic3RyaW5nIn07cmV0dXJuIEh9KCk7RD1PYmplY3QuZnJlZXplKHt0ZW5zb3JXaWRnZXQ6ZnVuY3Rpb24oSCxLLE0pe3JldHVybiBuZXcgTyhILEssTSl9LFZFUlNJT046IjAuMC4wIn0pO3dpbmRvdy50ZW5zb3Jfd2lkZ2V0PUR9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9kZWZhdWx0U2VyaWVzTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6Il9fZGVidWdnZXJfZGF0YV9fIixyZWFkb25seTohMH0sX2xpbmVDaGFydFhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT4oKT0+e2NvbnN0IGI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpiLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYiwiYm90dG9tIiksYWNjZXNzb3I6ZD0+ZC5zdGVwfX19LF9saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIuc2NhbGFyfSxfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Plt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmI9Pgoic3RlcFx4M2QiK2IuZGF0dW0uc3RlcCsiOyBzY2FsYXJceDNkICIrYi5kYXR1bS5zY2FsYXJ9XX0sX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbmRlcihkYXRhKSJdLHJlbmRlcihiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLiQkKCJ2ei1saW5lLWNoYXJ0MiIpO2Quc2V0VmlzaWJsZVNlcmllcyhbdGhpcy5fZGVmYXVsdFNlcmllc05hbWVdKTt2YXIgZj1bXSxoPWIueDtiPWIueTtmb3IobGV0IGs9MDtrPGgubGVuZ3RoOysraylmLnB1c2goe3N0ZXA6aFtrXSxzY2FsYXI6YltrXX0pO2Quc2V0U2VyaWVzRGF0YSh0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZSxmKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS12aWV3Iixwcm9wZXJ0aWVzOnt2aWV3SWQ6U3RyaW5nLHRlbnNvck5hbWU6U3RyaW5nLGRlYnVnT3A6U3RyaW5nLGRldmljZU5hbWU6U3RyaW5nLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6U3RyaW5nLHNsaWNpbmc6U3RyaW5nLHRpbWVJbmRpY2VzOlN0cmluZyxkdHlwZTpTdHJpbmcsc2hhcGU6QXJyYXksY29udGludWVUb0J1dHRvbkNhbGxiYWNrOk9iamVjdCxjbG9zZUJ1dHRvbkNhbGxiYWNrOk9iamVjdCx0ZW5zb3JOYW1lQ2FsbGJhY2s6T2JqZWN0LHRlbnNvcldpZGdldDpPYmplY3QsZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaXNUZW5zb3JWYWx1ZVNjYWxhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUxpbmVDaGFydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9kYXRhU2NhbGFyOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfSwKX2xpbmVDaGFydERhdGE6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2RhdGFJbWFnZVNyYzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwKX19LG9ic2VydmVyczpbIl91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZSh0aW1lSW5kaWNlcykiXSxyZW5kZXJUZW5zb3JWYWx1ZSgpe2lmKHRoaXMudGVuc29yTmFtZSlpZihudWxsPT10aGlzLnNsaWNpbmcpe3RoaXMuc2V0KCJfdXNlVGVuc29yV2lkZ2V0IiwhMCk7Y29uc3QgZD17c3BlYzp7ZHR5cGU6dGhpcy5kdHlwZSxzaGFwZTp0aGlzLnNoYXBlfSxnZXQ6KCk9Pnt0aHJvdyBFcnJvcigidGVuc29yVmlldy5nZXQoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpO30sdmlldzpmPT57Y29uc3QgaD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBrPWguc2hhcGUubGVuZ3RoLHQ9Zi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKG09PgptLmRpbSksbD1mLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAobT0+bS5pbmRleCk7bGV0IHA9IlsiO2ZvcihsZXQgbT0wO208azsrK20pLTEhPT10LmluZGV4T2YobSk/cCs9YCR7bFt0LmluZGV4T2YobSldfWA6Zi52aWV3aW5nRGltc1swXT09PW0/cCs9YCR7Zi52ZXJ0aWNhbFJhbmdlWzBdfToke2YudmVydGljYWxSYW5nZVsxXX1gOmYudmlld2luZ0RpbXNbMV09PT1tJiYocCs9YCR7Zi5ob3Jpem9udGFsUmFuZ2VbMF19OiR7Zi5ob3Jpem9udGFsUmFuZ2VbMV19YCksbTxrLTEmJihwKz0iLCIpO3ArPSJdIjtyZXR1cm4gbmV3IFByb21pc2UoKG0sbik9Pntjb25zdCBxPWguX2dldFRlbnNvckRhdGFVUkwoe3dhdGNoX2tleTpoLnRlbnNvck5hbWUrIjoiK2guZGVidWdPcCxzbGljaW5nOnAsdGltZV9pbmRpY2VzOmgudGltZUluZGljZXMsbWFwcGluZzoibm9uZSJ9KTtoLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHEpLnRoZW4odT0+e251bGw9PXUuZXJyb3I/bSh1LnRlbnNvcl9kYXRhW3UudGVuc29yX2RhdGEubGVuZ3RoLQoxXSk6bih1LmVycm9yKX0pLmNhdGNoKHU9Pm4odSkpfSl9KX0sZ2V0TnVtZXJpY1N1bW1hcnk6KCk9Pntjb25zdCBmPXRoaXM7cmV0dXJuIGhjKGZ1bmN0aW9uKigpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxrKT0+e2NvbnN0IHQ9Zi50ZW5zb3JOYW1lKyI6IitmLmRlYnVnT3A7Zi5nZXRIZWFsdGhQaWxsKHQsZi5kZXZpY2VOYW1lLGYubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPT57bnVsbD09bD9rKGBGYWlsZWQgdG8gZ2V0IGhlYWx0aCBwaWxsIGZvciB3YXRjaCBrZXkgJHt0fWApOmgoe2VsZW1lbnRDb3VudDpsWzFdLG1pbmltdW06bFs4XSxtYXhpbXVtOmxbOV19KX0pfSl9KX19O3NldFRpbWVvdXQoKCk9PntudWxsPT10aGlzLnRlbnNvcldpZGdldCYmKHRoaXMudGVuc29yV2lkZ2V0PXRlbnNvcl93aWRnZXQudGVuc29yV2lkZ2V0KHRoaXMuJCQoIiN0ZW5zb3Itd2lkZ2V0IiksZCx7d2hlZWxab29tS2V5OiJhbHQifSkpO3RoaXMudGVuc29yV2lkZ2V0LnJlbmRlcigpfSwKMTApfWVsc2V7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCExKTt2YXIgYj10aGlzLl9yYW5rRnJvbVNsaWNpbmcodGhpcy5zbGljaW5nLnRyaW0oKSk7Y29uc3QgZD10aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcCh0aGlzLnRpbWVJbmRpY2VzKTtsZXQgZj1iO2lmKCFkKXtpZigxPGIpe3RoaXMuX3Nob3dUb2FzdCgiSGlzdG9yeSBmb3IgdGVuc29ycyBceDNlIDFEIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpO3JldHVybn1mKz0xfWI9dGhpcy5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OnRoaXMudGVuc29yTmFtZSsiOiIrdGhpcy5kZWJ1Z09wLHNsaWNpbmc6dGhpcy5zbGljaW5nLHRpbWVfaW5kaWNlczp0aGlzLnRpbWVJbmRpY2VzLG1hcHBpbmc6Mjw9Zj8iaW1hZ2UvcG5nIjoibm9uZSJ9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaD0+e3RoaXMuJCQoIiNkZWJ1Zy1vcCIpLnRleHRDb250ZW50PXRoaXMuX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKTsKaWYobnVsbCE9aC5lcnJvcil0aGlzLl9zaG93VG9hc3QoaC5lcnJvci50eXBlKyI6ICIraC5lcnJvci5tZXNzYWdlKTtlbHNlIGlmKGg9ZD9oLnRlbnNvcl9kYXRhWzBdOmgudGVuc29yX2RhdGEsMD09PWYpdGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoInNjYWxhciIpLHRoaXMuc2V0KCJfZGF0YVNjYWxhciIsaCk7ZWxzZSBpZigxPT09Zil7dGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImxpbmVDaGFydCIpO2xldCBrPXt4OltdLHk6aH07Zm9yKGxldCB0PTA7dDxoLmxlbmd0aDsrK3Qpay54LnB1c2godCsxKTt0aGlzLnNldCgiX2xpbmVDaGFydERhdGEiLGspfWVsc2UgMjw9Zj8odGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImltYWdlIiksdGhpcy5zZXQoIl9kYXRhSW1hZ2VTcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitoKSk6dGhpcy5fc2hvd1RvYXN0KCJWaXN1YWxpemF0aW9uIG9mIHJhbmstIitmKyIgdGVuc29ycyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKX0pfX0sCnJlZnJlc2goKXt0aGlzLnRlbnNvck5hbWUudHJpbSgpJiZ0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF9nZXRUZW5zb3JEYXRhVVJMKGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3RlbnNvcl9kYXRhIik7cmV0dXJuIHZjLmFkZFBhcmFtcyhkLGIpfSxfcmFua0Zyb21TbGljaW5nKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gMDt7Yj1iLnNwbGl0KCIsIik7bGV0IGQ9Yi5sZW5ndGg7Zm9yKGNvbnN0IGYgb2YgYilpc05hTihOdW1iZXIoZikpfHxkLS07cmV0dXJuIGR9fSxfc2V0VmlzdWFsaXphdGlvblR5cGUoYil7InNjYWxhciI9PT1iPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToibGluZUNoYXJ0Ij09PWI/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsCiExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToiaW1hZ2UiPT09Yj8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCEwKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCB2aXN1YWxpemF0aW9uVHlwZToiLGIpfSxfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjaygpeyJmdWxsIGhpc3RvcnkiPT09UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCk/dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiOiIpOnRoaXMuc2V0KCJ0aW1lSW5kaWNlcyIsIi0xIik7dGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfdXBkYXRlVGltZUluZGljZXNUb2dnbGUoYil7dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYik/UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PQoiRnVsbCBIaXN0b3J5IjpQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9IkxhdGVzdCBUaW1lIFBvaW50In0sX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO3JldHVybiFpc05hTihOdW1iZXIoYikpfSxfY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpe3JldHVybiJEZWJ1Z0lkZW50aXR5Ij09PXRoaXMuZGVidWdPcD8iIjp0aGlzLmRlYnVnT3B9LF9zaG93VG9hc3QoYil7dGhpcy4kLnRlbnNvclZhbHVlVG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5vcGVuKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Iixwcm9wZXJ0aWVzOntjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24sdGVuc29yTmFtZUNsaWNrZWQ6RnVuY3Rpb24sX3RlbnNvclZpZXdDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9ufSxhZGRWaWV3KGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtdGVuc29yLXZhbHVlLXZpZXciKTtmLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJkZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2Yudmlld0lkPWIudmlld0lkO2YudGVuc29yTmFtZT1iLnRlbnNvck5hbWU7Zi5kZWJ1Z09wPWIuZGVidWdPcDtmLmRldmljZU5hbWU9Yi5kZXZpY2VOYW1lO2YubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZT1iLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU7Zi5kdHlwZT1iLmR0eXBlO2Yuc2hhcGU9Yi5zaGFwZTsKZi5zbGljaW5nPWIuc2xpY2luZztmLnRpbWVJbmRpY2VzPWIudGltZUluZGljZXM7Zi5jbG9zZUJ1dHRvbkNhbGxiYWNrPXRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYi52aWV3SWQpO2YuY29udGludWVUb0J1dHRvbkNhbGxiYWNrPSgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soYi5kZXZpY2VOYW1lLGIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2YudGVuc29yTmFtZUNhbGxiYWNrPSgpPT57dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChiLmRldmljZU5hbWUsYi5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07Zi5nZXRIZWFsdGhQaWxsPXRoaXMuZ2V0SGVhbHRoUGlsbDtkLmFwcGVuZENoaWxkKGYpO2YucmVmcmVzaCgpfSxnZXRWaWV3cygpe2NvbnN0IGI9W107Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yi5wdXNoKHt2aWV3SWQ6ZC52aWV3SWQsdGVuc29yTmFtZTpkLnRlbnNvck5hbWUsCmRlYnVnT3A6ZC5kZWJ1Z09wLHNsaWNpbmc6ZC5zbGljaW5nLHRpbWVJbmRpY2VzOmQudGltZUluZGljZXN9KX0pO3JldHVybiBifSxyZW5kZXJUZW5zb3JWYWx1ZXMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGI9PntiLnJlbmRlclRlbnNvclZhbHVlKCl9KX0sX3JlZHJhd1ZpZXdzKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpO18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksZj0+e2QucmVtb3ZlQ2hpbGQoZil9KTtfLmZvckVhY2goYixmPT57dGhpcy5hZGRWaWV3KGYpfSl9LF9jcmVhdGVDbG9zZUJ1dHRvbkNhbGxiYWNrKGIpe3JldHVybigpPT57Y29uc3QgZD1bXSxmPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKTtmb3IobGV0IGg9MDtoPGYubGVuZ3RoOysraCl7Y29uc3Qgaz0KZltoXTtrLnZpZXdJZCE9PWImJmQucHVzaCh7dmlld0lkOmsudmlld0lkLHRlbnNvck5hbWU6ay50ZW5zb3JOYW1lLGRlYnVnT3A6ay5kZWJ1Z09wLGR0eXBlOmsuZHR5cGUsc2hhcGU6ay5zaGFwZSxzbGljaW5nOmsuc2xpY2luZyx0aW1lSW5kaWNlczprLnRpbWVJbmRpY2VzfSl9dGhpcy5fcmVkcmF3Vmlld3MoZCl9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90ZW5zb3Itc2hhcGUtaGVscGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCl7cmV0dXJuIGY8PWg/Ijo6IjoiOjoiK01hdGguY2VpbChmL2gpfWIuZ2V0RGVmYXVsdFNsaWNpbmc9ZnVuY3Rpb24oZil7cmV0dXJuIDA9PT1mLmxlbmd0aD8iIjoxPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwxRTMpKyJdIjoyPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwyNTApKyIsICIrZChmWzFdLDI1MCkrIl0iOm51bGx9O2IucmFua0Zyb21TbGljaW5nPWZ1bmN0aW9uKGYpe2Yuc3RhcnRzV2l0aCgiWyIpJiYoZj1mLnNsaWNlKDEsZi5sZW5ndGgtMSkpO2lmKDA9PT1mLmxlbmd0aClyZXR1cm4gMDt7Zj1mLnNwbGl0KCIsIik7bGV0IGg9Zi5sZW5ndGg7Zm9yKGNvbnN0IGsgb2YgZilpc05hTihOdW1iZXIoaykpfHxoLS07cmV0dXJuIGh9fX0pKFZpfHwoVmk9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgWmk9KCk9PndpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsSGs9KCk9PndpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsSWs9KFppKCktNzApLzI7ClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190b3BSaWdodFRhYnM6e3R5cGU6QXJyYXksdmFsdWU6W3tpZDoidGFiLXJ1bnRpbWUtZ3JhcGhzIixuYW1lOiJSdW50aW1lIEdyYXBocyJ9LHtpZDoidGFiLXRlbnNvci12YWx1ZXMiLG5hbWU6IlRlbnNvciBWYWx1ZXMifV0scmVhZG9ubHk6ITB9LF9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdG9wUmlnaHRTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6IjAiLG9ic2VydmVyOiJfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQifSxfbG9uZ1BvbGxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3N0ZXBCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RlcCJ9LF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LApfdGVuc29yVmlld0lkQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saXNSZWxvYWREaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSxhbHJlYWR5U3RhcnRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3VycmVudFNlc3Npb25SdW5JbmZvOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2Vzc2lvblJ1blRvdGFsQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3Nlc3Npb25SdW5Db3VudGVyczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVNlc3Npb25SdW5LZXk6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2FjdGl2ZVNlc3Npb25SdW5OdW1EZXZpY2VzOnt0eXBlOk51bWJlcix2YWx1ZTotMX0sX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWU6e3R5cGU6U3RyaW5nLAp2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hpZ2hsaWdodE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY29udGludWVUb1R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jb250aW51ZVN0b3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvbnRpbnVlVG9UYXJnZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXJUYXJnZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOlN0cmluZyxfZm9yY2VFeHBhbmROb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUZvY3VzTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VDb2RlU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCJ9LF9ncmFwaFByb2dyZXNzOnt0eXBlOk9iamVjdH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Cm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9idXN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksb2JzZXJ2ZXI6Il9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXIifSxfbWlubGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NDUwLHJlYWRPbmx5OiEwfSxfbWF4bGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChfd2luZG93V2lkdGgsIF9tYXhNYWluQ29udGVudFdpZHRoLCBfcmVzaXplcldpZHRoKSJ9LF9tYXhNYWluQ29udGVudFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozNTAscmVhZE9ubHk6ITB9LF90b3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOklrfSksb2JzZXJ2ZXI6Il90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXIifSxfbWluVG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRPbmx5OiEwfSxfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChfd2luZG93SGVpZ2h0LCBfcmVzaXplcldpZHRoKSJ9LF9yZXNpemVyV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjMwLHJlYWRPbmx5OiEwfSxfd2luZG93V2lkdGg6TnVtYmVyLF93aW5kb3dIZWlnaHQ6TnVtYmVyLF9kZWJ1Z1dhdGNoZXM6QXJyYXksX2xhdGVzdFNlc3Npb25SdW46T2JqZWN0fSxvYnNlcnZlcnM6WyJfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKF9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKSIsIl9zaXplRGFzaGJvYXJkUmVnaW9ucyhfbGVmdFBhbmVXaWR0aCwgX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQsIF93aW5kb3dXaWR0aCkiLAoiX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKF9ncmFwaFByb2dyZXNzKSJdLHJlYWR5KCl7dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKCk9Pnt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKX0sITEpO3RoaXMucmVsb2FkKCl9LGxvbmdfcG9sbCgpe2NvbnN0IGI9e3BvczorK3RoaXMuX2xvbmdQb2xsQ291bnR9O2xldCBkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9jb21tIik7ZD12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oZj0+e2NvbnN0IGg9Zi50eXBlO2Y9Zi5kYXRhO2lmKCJtZXRhIj09PWgpe3ZhciBrPWYucnVuX2tleSx0PWtbMF0uc3BsaXQoIiwiKSxsPWtbMV0uc3BsaXQoIiwiKTtjb25zdCBtPWtbMl0uc3BsaXQoIiwiKTt2YXIgcD10aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5O3RoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bktleSIsCmspO3RoaXMuc2V0KCJfbGF0ZXN0U2Vzc2lvblJ1biIse2ZlZWRzOnQsZmV0Y2hlczpsLHRhcmdldHM6bX0pO3RoaXMuc2V0KCJfc2Vzc2lvblJ1blNvbGVBY3RpdmUiLCEwKTt2b2lkIDA9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPyh0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPVtdLHRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLFtdKSk6dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXSk7dGhpcy5fY3VycmVudFNlc3Npb25SdW5JbmZvPXQ9IkZlZWRzOiAiK3QrIjsgRmV0Y2hlczogIitsKyI7IFRhcmdldHM6ICIrbTt0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnMuaGFzT3duUHJvcGVydHkodCk/dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzW3RdKz0xOnRoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1t0XT0xO3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrKzsKdGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKTt0aGlzLl9jb250aW51ZVRvVHlwZSYmXy5pc0VxdWFsKHAsayl8fCh0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoaywhMSksdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCkpfWVsc2UidGVuc29yIj09PWg/KGs9Zi5kZXZpY2VfbmFtZSxwPWYubm9kZV9uYW1lLHQ9Zi5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZSx0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIT1rP3RoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsayk6IXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZ0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmKHRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoayx0KSx0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGsrIi8iK3QpKSx0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMSksbD1wKyI6IitmLm91dHB1dF9zbG90LHRoaXMuc2V0KCJfbGF0ZXN0VGVuc29yRGF0YSIsCntkZXZpY2VOYW1lOmssdGVuc29yTmFtZTpsLG5vZGVOYW1lOnAsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTp0LGRlYnVnT3A6Zi5kZWJ1Z19vcCxkdHlwZTpmLmR0eXBlLHNoYXBlOmYuc2hhcGUsdmFsdWU6Zi52YWx1ZXN9KSx0aGlzLl9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MobCxmLmRlYnVnX29wKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBsb25nLXBvbGxpbmcgcmVzcG9uc2UgdHlwZTogIixoKTtudWxsIT10aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG8oaCxmKTt0aGlzLmxvbmdfcG9sbCgpfSl9LF9wcm9jZXNzQ29udGludWVUbyhiLGQpe3RoaXMuX2NvbnRpbnVlU3RvcD90aGlzLl9jbGVhckNvbnRpbnVlVG8oKToiU2Vzc2lvblJ1biI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb1Nlc3Npb25SdW4oIm1ldGEiPT09Yik6IlRlbnNvckNvbmRpdGlvbiI9PT0KdGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fc3RlcCgpOiJvcCI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb09wKCJtZXRhIj09PWIsZCk6bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJiIiIT09dGhpcy5fY29udGludWVUb1R5cGUmJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgX2NvbnRpbnVlVG9UeXBlOiIsdGhpcy5fY29udGludWVUb1R5cGUpfSxfcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKGIpe2ImJnRoaXMuc2V0KCJfY29udGludWVUb0NvdW50ZXIiLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyKzEpO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0P3RoaXMuX3N0ZXAoKTp0aGlzLl9jbGVhckNvbnRpbnVlVG8oKX0sX3Byb2Nlc3NDb250aW51ZVRvT3AoYixkKXtiJiZ0aGlzLl9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKTtiPWQuZGV2aWNlX25hbWU7ZD1kLm1heWJlX2Jhc2VfZXhwYW5kZWRfbm9kZV9uYW1lOwpjb25zdCBmPW51bGw9PWQ/bnVsbDpWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCk7YisiLyIrZD09PXRoaXMuX2NvbnRpbnVlVG9UYXJnZXR8fGIrIi8iK2Y9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0Pyh0aGlzLl9jbGVhckNvbnRpbnVlVG8oKSx0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsZikpOnRoaXMuX3N0ZXAoKX0sX21heWJlVXBkYXRlVGVuc29yVmFsdWVWaWV3cyhiLGQpe2NvbnN0IGY9dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3Iik7aWYobnVsbCE9Zil7dmFyIGg9ITE7Xy5mb3JFYWNoKGYuZ2V0Vmlld3MoKSxrPT57aWYoay50ZW5zb3JOYW1lPT09YiYmay5kZWJ1Z09wPT09ZClyZXR1cm4gaD0hMCwhMX0pO2gmJmYucmVuZGVyVGVuc29yVmFsdWVzKCl9fSxyZWxvYWQoKXtpZighdGhpcy5hbHJlYWR5U3RhcnRlZCl7dGhpcy5zZXQoImFscmVhZHlTdGFydGVkIiwhMCk7dmFyIGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi9kZWJ1Z2dlcl9ncnBjX2hvc3RfcG9ydCIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57MDxkLnBvcnQ/KHRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaWFsb2coZC5ob3N0LGQucG9ydCksdGhpcy5sb25nX3BvbGwoKSk6dGhpcy4kLmluaXRpYWxEaWFsb2cub3BlbkRpc2FibGVkRGlhbG9nKCl9KX19LF9zaG93U291cmNlQ29kZUNoYW5nZWQoKXt0aGlzLl9zb3VyY2VDb2RlU2hvd24/KHRoaXMuJCQoIiNub2RlLWVudHJpZXMiKS5zdHlsZS5oZWlnaHQ9IjQwJSIsdGhpcy4kLnNvdXJjZUNvZGVWaWV3LnJlbmRlcigpKTp0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI4MCUifSxfc2hvd1RvYXN0KGIpe3RoaXMuJC50b2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGIpO3RoaXMuJC50b2FzdC5vcGVuKCl9LF9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKXt0aGlzLl9zaG93VG9hc3QoIlNlc3Npb24ucnVuKCkgIyIrdGhpcy5fc2Vzc2lvblJ1blRvdGFsQ291bnRlcisKIiBpcyBzdGFydGluZy4iKX0sX2Rpc3BsYXlHcmFwaChiLGQpe2I9e3J1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYiksZGV2aWNlX25hbWU6ZH07Yj12Yy5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi9kZWJ1Z2dlci9kZWJ1Z2dlcl9ncmFwaCIsYik7dGhpcy4kLmxvYWRlci5kYXRhc2V0cz1be25hbWU6Ii9kZWJ1Z2dlcl9ncmFwaCIscGF0aDpifV07dGhpcy4kLmxvYWRlci5zZXQoInNlbGVjdGVkRGF0YXNldCIsMCl9LF9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYixkKXtkP2NvbnNvbGUubG9nKCJQb2xsaW5nIGZvciBmaXJzdCBHcmFwaERlZiBmb3IgcnVuIGtleToiLGIpOnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbnVsbCk7dmFyIGY9e21vZGU6InJldHJpZXZlX2FsbCIscnVuX2tleTpKU09OLnN0cmluZ2lmeShiKX07Y29uc3QgaD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2Y9dmMuYWRkUGFyYW1zKGgsCmYpO2xldCBrPVtdO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbih0PT57aWYoMD09dC5kZXZpY2VfbmFtZXMubGVuZ3RoKWR8fHRoaXMuX3N0ZXAoKSx0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYiwhMCk7ZWxzZXt2YXIgbD1udWxsO2Zvcihjb25zdCBwIGluIHQuZ2F0ZWRfZ3JwY190ZW5zb3JzKWlmKHQuZ2F0ZWRfZ3JwY190ZW5zb3JzLmhhc093blByb3BlcnR5KHApKXstMT09PXRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0uaW5kZXhPZihwKSYmKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0ucHVzaChwKSx0aGlzLiQuc2Vzc2lvblJ1bnNWaWV3LnVwZGF0ZU51bURldmljZXModGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tiXS5sZW5ndGgpKTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIix0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLnNsaWNlKCkpO2w9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNbdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoLQoxXTtjb25zdCBtPXQuZ2F0ZWRfZ3JwY190ZW5zb3JzW3BdO2ZvcihsZXQgbj0wO248bS5sZW5ndGg7KytuKWsucHVzaCh7ZGV2aWNlX25hbWU6cCxub2RlX25hbWU6bVtuXVswXSxvcF90eXBlOm1bbl1bMV0sb3V0cHV0X3Nsb3Q6bVtuXVsyXSxkZWJ1Z19vcDptW25dWzNdfSl9bnVsbCE9bCYmKHRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbCksdD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSksbnVsbCE9dCYmdC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIixsKSk7Vmkuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXMoayk7dGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGspO3RoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoayl9fSl9LF9jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpe3JldHVybihiLGQpPT57ZD1kPyJicmVhayI6ImRpc2FibGUiO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoVmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLmRldmljZV9uYW1lKwoiLyIrYi5ub2RlX25hbWUpLGIub3V0cHV0X3Nsb3QsYi5kZWJ1Z19vcCxkKX19LF9mb2N1c09uR3JhcGhOb2RlKGIsZCl7bnVsbCE9YiYmdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9PWImJnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsYik7dGhpcy5fc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKTtjb25zdCBmPXRoaXMuJCQoIiNncmFwaCIpO2lmKGYuc2VsZWN0ZWROb2RlPT09ZClmLnBhblRvTm9kZShkKTtlbHNle2NvbnN0IGg9Zi5nZXQoInJlbmRlckhpZXJhcmNoeSIpLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7bnVsbD09aFtkXSYmKGQ9VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTtudWxsIT1oW2RdJiZmLnNldCgic2VsZWN0ZWROb2RlIixkKX10aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixiKyIvIitkKX0sX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpe3JldHVybihiLGQsZik9Pnt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJgohMCE9PWYmJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTt0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF9jcmVhdGVGZWVkRmV0Y2hUYXJnZXRDbGlja2VkSGFuZGxlcigpe3JldHVybiBiPT57bGV0IGQ9YjstMSE9PWQuaW5kZXhPZigiOiIpJiYoZD1kLnNsaWNlKDAsZC5pbmRleE9mKCI6IikpKTtiPV8uZmluZCh0aGlzLl9kZWJ1Z1dhdGNoZXMsZj0+Zi5ub2RlX25hbWU9PT1kfHwwPT09Zi5ub2RlX25hbWUuaW5kZXhPZihkKSYmIigiPT09Zi5ub2RlX25hbWVbZC5sZW5ndGhdKTtudWxsPT1iP3RoaXMuX3Nob3dUb2FzdCgiTm9kZSAnIitkKyInIGlzIG5vdCBpbiB0aGUgcnVudGltZSBncmFwaCBvZiB0aGUgY3VycmVudCBTZXNzaW9uLnJ1biBvciBkb2VzIG5vdCBoYXZlIGEgZGVidWcgb3AgYXR0YWNoZWQuIik6dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLmRldmljZV9uYW1lLApkKX19LF9jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpe3JldHVybiBiPT57dGhpcy5fc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLiQkKCIjdGVuc29yVmFsdWVNdWx0aVZpZXciKS5hZGRWaWV3KHt2aWV3SWQ6dGhpcy5fY3JlYXRlVGVuc29yVmlld0lkKCksZGV2aWNlTmFtZTpiLmRldmljZU5hbWUsdGVuc29yTmFtZTpiLnRlbnNvck5hbWUsbm9kZU5hbWU6Yi5ub2RlTmFtZSxtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOmIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxkZWJ1Z09wOmIuZGVidWdPcCxkdHlwZTpiLmR0eXBlLHNoYXBlOmIuc2hhcGUsc2xpY2luZzpWaS5nZXREZWZhdWx0U2xpY2luZyhiLnNoYXBlKSx0aW1lSW5kaWNlczoiLTEifSl9LDEwKX19LF9jcmVhdGVUZW5zb3JWaWV3SWQoKXtjb25zdCBiPSJkZWJ1Z2dlci10ZW5zb3Itdmlldy0iK3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXI7dGhpcy5fdGVuc29yVmlld0lkQ291bnRlcisrOwpyZXR1cm4gYn0sX2NyZWF0ZU5vZGVDb250ZXh0TWVudUl0ZW1zKCl7cmV0dXJuW3t0aXRsZTooKT0+IkV4cGFuZCBhbmQgaGlnaGxpZ2h0IixhY3Rpb246Yj0+e2NvbnN0IGQ9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLm5vZGUubmFtZSk7Yj10aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKyIvIitiLm5vZGUubmFtZTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGIpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGIpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCkpfX0se3RpdGxlOigpPT4iQWRkIGJyZWFrcG9pbnQiLGFjdGlvbjpiPT57Y29uc3QgZD1WaS5nZXRDbGVhbk5vZGVOYW1lKGIubm9kZS5uYW1lKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsKIi8iK2Iubm9kZS5uYW1lKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKX19LHt0aXRsZTooKT0+IkNvbnRpbnVlIHRvIixhY3Rpb246Yj0+ey0xIT09WyJfQXJnIiwiX1JldHZhbCJdLmluZGV4T2YoYi5ub2RlLm9wKT90aGlzLl9zaG93VG9hc3QoJ0Nhbm5vdCBjb250aW51ZSB0byBub2RlICInK2Iubm9kZS5uYW1lKyciLCBkdWUgdG8gb3AgdHlwZSAiJytiLm5vZGUub3ArJyIuJyk6dGhpcy5fY29udGludWVUb05vZGUodGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSxiLm5vZGUubmFtZSl9fV19LF9jcmVhdGVHZXRIZWFsdGhQaWxsKCl7cmV0dXJuKGIsZCxmLGgpPT57dmFyIGs9e3dhdGNoX2tleTpiLHRpbWVfaW5kaWNlczoiLTEiLG1hcHBpbmc6ImhlYWx0aC1waWxsIn07Y29uc3QgdD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLAoiL3RlbnNvcl9kYXRhIik7az12Yy5hZGRQYXJhbXModCxrKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGspLnRoZW4obD0+e2w9bC50ZW5zb3JfZGF0YVswXTtoKGwpO3RoaXMuX2NvbmRpdGlvbmFsSGVhbHRoUGlsbFN0b3AoYixkLGYsbCl9KX19LF9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGIsZCxmLGgpe2lmKCJUZW5zb3JDb25kaXRpb24iPT09dGhpcy5fY29udGludWVUb1R5cGUmJlZpLmNoZWNrSGVhbHRoUGlsbEFnYWluc3RUZW5zb3JDb25kaXRpb25LZXkodGhpcy5fY29udGludWVUb1RhcmdldCxoLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0KSl7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKTtoPVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihmKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsaCk7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShkLGYpO2NvbnN0IGs9ZCsiLyIrZjt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLAprKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsbnVsbCk7dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsayl9LDEwMCk7dGhpcy5fc2hvd1RvYXN0KCdUZW5zb3IgY29uZGl0aW9uICInK3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQrJyIgaXMgbWV0IGJ5IHdhdGNoIGtleTogIicrYisnIi5cblN0b3BwaW5nIGNvbnRpbnVhdGlvbi4nKX19LF9jb250aW51ZVRvTm9kZShiLGQpe2NvbnN0IGY9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShkKTtiPWIrIi8iK2Q7dGhpcy5fcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShmLDAsIkRlYnVnSWRlbnRpdHkiLCJicmVhayIpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lIixiKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGYpKTt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYik7CnRoaXMuJC5jb250aW51ZURpYWxvZy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApO3RoaXMuX3N0ZXAoKX0sX2NyZWF0ZUNvbnRpbnVlVG9Ob2RlSGFuZGxlcigpe3JldHVybihiLGQpPT57dGhpcy5fY29udGludWVUb05vZGUoYixkKX19LF9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoYil7Y29uc3QgZD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIpKTtpZigwPHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCl7bGV0IGY7Zj1iKygiIChkZXZpY2UgIisodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihiKSsxKSsiIG9mICIrdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoKyIpIik7dGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJm51bGwhPWQmJihkLnRleHRDb250ZW50PWYpfWVsc2UgdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJgpudWxsIT1kJiYoZC50ZXh0Q29udGVudD0iV2FpdGluZyBmb3IgZGV2aWNlLi4uIik7bnVsbCE9YiYmdGhpcy5fZGlzcGxheUdyYXBoKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksYil9LF9zdGVwKCl7aWYobnVsbCE9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl7dGhpcy5zZXQoIl9idXN5IiwhMCk7dmFyIGI9e21vZGU6InJldHJpZXZlX2RldmljZV9uYW1lcyIscnVuX2tleTpKU09OLnN0cmluZ2lmeSh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5KX0sZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2I9dmMuYWRkUGFyYW1zKGQsYik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGY9PntsZXQgaD0hMTtmb3IobGV0IGs9MDtrPGYuZGV2aWNlX25hbWVzLmxlbmd0aDsrK2spaWYoLTE9PT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5pbmRleE9mKGYuZGV2aWNlX25hbWVzW2tdKSl7aD0hMDticmVha31mPQp2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvYWNrIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKCgpPT57aCYmdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksITEpfSl9KX19LF9jcmVhdGVTZXNzaW9uUnVuR28oKXtyZXR1cm4gYj0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlNlc3Npb25SdW4iLHRoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbyxiKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlVGVuc29yQ29uZGl0aW9uR28oKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlRlbnNvckNvbmRpdGlvbiIsYixkKTt0aGlzLiQudGVuc29yRGF0YVN1bW1hcnkuZW5hYmxlSGVhbHRoUGlsbHMoKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlRm9yY2VDb250aW51YXRpb25TdG9wKCl7cmV0dXJuKCk9Pnt0aGlzLl9zaG93VG9hc3QoJ0NvbnRpbnVhdGlvbiBvZiB0eXBlICInK3RoaXMuX2NvbnRpbnVlVG9UeXBlKwonIiB3YXMgaW50ZXJydXB0ZWQgYnkgdXNlci4nKTt0aGlzLnNldCgiX2NvbnRpbnVlU3RvcCIsITApfX0sX3NldENvbnRpbnVlVG8oYixkLGY9LTEpe3RoaXMuX2NvbnRpbnVlVG9UeXBlPWI7dGhpcy5fY29udGludWVUb1RhcmdldD1kO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PWY7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITF9LF9jbGVhckNvbnRpbnVlVG8oKXt0aGlzLiQuY29udGludWVEaWFsb2cubm90aWZ5Q29udGludWF0aW9uU3RvcCgpO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9dGhpcy5fY29udGludWVUb1R5cGU9IiI7dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ9LTE7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITE7dGhpcy5zZXQoIl9idXN5IiwhMSl9LF9jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIm9wIixiKyIvIisKZCk7dGhpcy5fc3RlcCgpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZ0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF90b3BSaWdodFNlbGVjdGVkQ2hhbmdlZChiKXtiPXRoaXMuX3RvcFJpZ2h0VGFic1tiXS5pZDt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwidGFiLXJ1bnRpbWUtZ3JhcGhzIj09PWIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsInRhYi10ZW5zb3ItdmFsdWVzIj09PWIpfSxfc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLCIwIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITApO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITEpfSxfc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpe3RoaXMuc2V0KCJfdG9wUmlnaHRTZWxlY3RlZCIsCiIxIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITEpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITApfSxfcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShiLGQsZixoKXtiPXttb2RlOiJzZXRfc3RhdGUiLG5vZGVfbmFtZTpiLG91dHB1dF9zbG90OmQsZGVidWdfb3A6ZixzdGF0ZTpofTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLnNldCgiX2J1c3kiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaz0+e3RoaXMuc2V0KCJfYnVzeSIsITEpO2NvbnNvbGUubG9nKCJCcmVha3BvaW50IHNldF9zdGF0ZSByZXNwb25zZTogIixrKX0pfSxfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoYil7Y29uc3QgZD10aGlzLiQkKCIjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciIpO251bGw9PXRoaXMuX2xhdGVzdFNlc3Npb25SdW4/CihkLnNldEF0dHJpYnV0ZSgidmFsdWUiLDApLHRoaXMuc2V0KCJfYnVzeSIsITEpKTooZC5zZXRBdHRyaWJ1dGUoInZhbHVlIixiLnZhbHVlKSx0aGlzLnNldCgiX2J1c3kiLDEwMD5iLnZhbHVlKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLnNldCgiX3dpbmRvd1dpZHRoIixIaygpKTt0aGlzLnNldCgiX3dpbmRvd0hlaWdodCIsWmkoKSk7dGhpcy5fc2l6ZURhc2hib2FyZFJlZ2lvbnModGhpcy5fbGVmdFBhbmVXaWR0aCx0aGlzLl90b3BSaWdodFF1YWRyYW50SGVpZ2h0LHRoaXMuX3dpbmRvd1dpZHRoKX0sX2NvbXB1dGVNYXhsZWZ0UGFuZVdpZHRoKGIsZCxmKXtyZXR1cm4gYi1kLWZ9LF9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChiLGQpe3JldHVybiBiLWQtNzB9LF9zaXplRGFzaGJvYXJkUmVnaW9ucyhiLGQsZil7dGhpcy4kJCgiI2xlZnQtcGFuZSIpLnN0eWxlLndpZHRoPWIrInB4IjtiPWYtYi10aGlzLl9yZXNpemVyV2lkdGgtODt0aGlzLiQkKCIjY2VudGVyLWNvbnRlbnQiKS5zdHlsZS53aWR0aD0KYisicHgiO2I9ZC10aGlzLl9yZXNpemVyV2lkdGg7dGhpcy4kJCgiI3RvcC1yaWdodC1xdWFkcmFudCIpLnN0eWxlLmhlaWdodD1iKyJweCI7dGhpcy4kJCgiI3RlbnNvci1kYXRhIikuc3R5bGUudG9wPWQrInB4In0sX2xlZnRQYW5lV2lkdGhPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLHtkZWZhdWx0VmFsdWU6SWt9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLW1hdGVyaWFsL3BhcGVyLW1hdGVyaWFsLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1hdGVyaWFsIixwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZToxfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGhlYWx0aFBpbGxFbnRyaWVzOnt0eXBlOkFycmF5LHZhbHVlOnRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLHJlYWRPbmx5OiEwfSxoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlOnt0eXBlOkFycmF5LApjb21wdXRlZDoiX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZShub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4LCBzZWxlY3RlZE5vZGUsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifSxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfYmlnZ2VzdFN0ZXBFdmVyU2Vlbjp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2Vlbihub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9jdXJyZW50U3RlcERpc3BsYXlWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgc3BlY2lmaWNIZWFsdGhQaWxsU3RlcCwgYXJlSGVhbHRoUGlsbHNMb2FkaW5nKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUFsZXJ0c0xpc3QoZGVidWdnZXJOdW1lcmljQWxlcnRzKSJdLHJlYWR5OmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO2ImJmQmJihiLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZH0sX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZzpmdW5jdGlvbihiLGQpe3JldHVybiBiP2JbZF0udG9GaXhlZCgwKToiIn0sX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZTpmdW5jdGlvbihiLGQsZixoLGspe2lmKGt8fCFmKXJldHVybiBudWxsO2I9YltmXTtyZXR1cm4gYj8oZD1iW2g/MDpkXSk/ZC52YWx1ZS5zbGljZSgyLDgpOm51bGw6bnVsbH0sX2NvbXB1dGVDdXJyZW50U3RlcERpc3BsYXlWYWx1ZTpmdW5jdGlvbihiLApkLGYsaCxrKXtpZihmKXJldHVybiBoLnRvRml4ZWQoMCk7aWYoaylyZXR1cm4gMDtmb3IobGV0IHQgaW4gYilyZXR1cm4gYlt0XVtkXS5zdGVwLnRvRml4ZWQoMCk7cmV0dXJuIDB9LF9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2VlbjpmdW5jdGlvbihiKXtmb3IobGV0IGQgaW4gYilyZXR1cm4gYj1iW2RdLE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sYltiLmxlbmd0aC0xXS5zdGVwKTtyZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH0sX2NvbXB1dGVNYXhTdGVwSW5kZXg6ZnVuY3Rpb24oYil7Zm9yKGxldCBkIGluIGIpcmV0dXJuIGJbZF0ubGVuZ3RoLTE7cmV0dXJuIDB9LF9oYXNEZWJ1Z2dlck51bWVyaWNBbGVydHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIubGVuZ3RofSxfdXBkYXRlQWxlcnRzTGlzdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIjbnVtZXJpYy1hbGVydHMtYm9keSIpO2lmKGQpe2QuaW5uZXJIVE1MPSIiO2Zvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKyl7dmFyIGg9YltmXSxrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO3QuaW5uZXJIVE1MPXRmLmdyYXBoLnV0aWwuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lKGguZmlyc3RfdGltZXN0YW1wKTt0LmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTt0LmNsYXNzTGlzdC5hZGQoInRlbnNvci1kZXZpY2UtdGQiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSIpO2wuaW5uZXJIVE1MPWgudGVuc29yX25hbWU7dGhpcy5fYWRkT3BFeHBhbnNpb25MaXN0ZW5lcihsLGgudGVuc29yX25hbWUpO3QuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoImRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSIpOwpsLmlubmVySFRNTD0iKCIraC5kZXZpY2VfbmFtZSsiKSI7dC5hcHBlbmRDaGlsZChsKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJtaW5pLWhlYWx0aC1waWxsIik7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2wuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpO2wuYXBwZW5kQ2hpbGQodCk7ay5hcHBlbmRDaGlsZChsKTtoLm5lZ19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmVnX2luZl9ldmVudF9jb3VudCxsLnNldEF0dHJpYnV0ZSgidGl0bGUiLGgubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC1cdTIyMWUiKSx0LmFwcGVuZENoaWxkKGwpKTtoLnBvc19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLApsLmNsYXNzTGlzdC5hZGQoInBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVySFRNTD1oLnBvc19pbmZfZXZlbnRfY291bnQsbC5zZXRBdHRyaWJ1dGUoInRpdGxlIixoLnBvc19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCArXHUyMjFlIiksdC5hcHBlbmRDaGlsZChsKSk7aC5uYW5fZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmFuX2V2ZW50X2NvdW50LGwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaC5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSx0LmFwcGVuZENoaWxkKGwpKTtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChrKX19fSxfYWRkT3BFeHBhbnNpb25MaXN0ZW5lcjpmdW5jdGlvbihiLGQpe2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dmFyIGY9dGYuZ3JhcGgucmVuZGVyLmV4cGFuZFVudGlsTm9kZUlzU2hvd24odGhpcy5yZW5kZXJIaWVyYXJjaHksCmQpLGgsaz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1ncmFwaC1pbmZvI2dyYXBoLWluZm8iKTtrJiYoaD1rLnNjcm9sbEhlaWdodC1rLnNjcm9sbFRvcCk7dmFyIHQ9dGhpcy5zZWxlY3RlZE5vZGU7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsZik7Zj0oKT0+e2suc2Nyb2xsVG9wPWsuc2Nyb2xsSGVpZ2h0LWh9O2smJih0P2YoKTp3aW5kb3cuc2V0VGltZW91dChmLDIwKSl9KX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6SFRNTEVsZW1lbnQsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldH19fSxvYnNlcnZlcnM6WyJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZChzY3JvbGxUYXJnZXQsIGlzQXR0YWNoZWQpIl0sX3Nob3VsZEhhdmVMaXN0ZW5lcjohMCxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX29sZFNjcm9sbFRhcmdldCYmKHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKCExLHRoaXMuX29sZFNjcm9sbFRhcmdldCksdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PW51bGwpO2QmJigiZG9jdW1lbnQiPT09Yj90aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M6InN0cmluZyI9PT10eXBlb2YgYj90aGlzLnNjcm9sbFRhcmdldD0oZD10aGlzLmRvbUhvc3QpJiZkLiQ/ZC4kW2JdOlBvbHltZXIuZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrCmIpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD1iLHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcixiKSkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe30sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2RvY30sZ2V0IF9kb2MoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH0sZ2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWU9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A6MH0sZ2V0IF9zY3JvbGxMZWZ0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVhPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDoKMH0sc2V0IF9zY3JvbGxUb3AoYil7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCxiKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9Yil9LHNldCBfc2Nyb2xsTGVmdChiKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYix3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yil9LHNjcm9sbDpmdW5jdGlvbihiLGQpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhiLGQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9ZCl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpPwp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJXaWR0aDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aDowfSxnZXQgX3Njcm9sbFRhcmdldEhlaWdodCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDowfSxfaXNWYWxpZFNjcm9sbFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxfdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtkPWQ9PT10aGlzLl9kb2M/d2luZG93OmQ7Yj90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKToKdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyJiYoZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciksdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPW51bGwpfSx0b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXI9Yjt0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihiLHRoaXMuc2Nyb2xsVGFyZ2V0KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbGlzdC9pcm9uLWxpc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXSxmPW51bGwhPVBvbHltZXIuZmx1c2gsaD1mP1BvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWU6MCxrPWY/UG9seW1lci5Bc3luYy5pZGxlUGVyaW9kOjEsdD1mP1BvbHltZXIuQXN5bmMubWljcm9UYXNrOjI7UG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3J8fChQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcj17fSk7UG9seW1lcih7aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsCm9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JdLApfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCwKX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBQb2x5bWVyLmRvbShQb2x5bWVyLmRvbSh0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSwKZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXt2YXIgbD10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7cmV0dXJuIE1hdGgubWF4KDAsbC10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQobCl7bD10aGlzLl9jbGFtcChsLDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTt0aGlzLmdyaWQmJihsLT1sJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9bH0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQobCl7bCU9dGhpcy5fcGh5c2ljYWxDb3VudDswPmwmJihsPXRoaXMuX3BoeXNpY2FsQ291bnQrbCk7dGhpcy5ncmlkJiYobC09bCV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1sfSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kwp0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudChsKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWx9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/SW5maW5pdHk6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuISghdGhpcy5vZmZzZXRXaWR0aCYmIXRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIGw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7dmFyIHA9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPWw9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pOwppZihwPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiB0aGlzLmdyaWQ/bi1uJXRoaXMuX2l0ZW1zUGVyUm93Om47aWYodGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PW4pcmV0dXJuIG4tbiV0aGlzLl9pdGVtc1BlclJvd30pfHwwfXJldHVybiBsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciBsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7aWYodGhpcy5ncmlkKWw9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBwPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXtwPHRoaXMuX3Njcm9sbEJvdHRvbSYmKGw9bik7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pfSl9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1sfXJldHVybiBsfSwKZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsaCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIik7dGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbihsKXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPWw9PT10aGlzPyJ0b3VjaCI6IiI7dGhpcy5zdHlsZS5vdmVyZmxvd1k9bD09PXRoaXM/ImF1dG8iOiIiO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgbD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KGxbInBhZGRpbmctdG9wIl0sMTApO3RoaXMuX2lzUlRMPSJydGwiPT09bC5kaXJlY3Rpb247dGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgbD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxwPWwtdGhpcy5fc2Nyb2xsUG9zaXRpb24sbT0wPD1wO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWw7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO01hdGguYWJzKHApPnRoaXMuX3BoeXNpY2FsU2l6ZSYmMDx0aGlzLl9waHlzaWNhbFNpemU/KHAtPXRoaXMuX3Njcm9sbE9mZnNldCxtPU1hdGgucm91bmQocC8KdGhpcy5fcGh5c2ljYWxBdmVyYWdlKSp0aGlzLl9pdGVtc1BlclJvdyx0aGlzLl92aXJ0dWFsU3RhcnQrPW0sdGhpcy5fcGh5c2ljYWxTdGFydCs9bSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpKTowPHRoaXMuX3BoeXNpY2FsQ291bnQmJihsPXRoaXMuX2dldFJldXNhYmxlcyhtKSxtPyh0aGlzLl9waHlzaWNhbFRvcD1sLnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0LT1sLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQtPWwuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShsLmluZGV4ZXMsbT9udWxsOmwuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsCnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSx0KSl9LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24obCl7dmFyIHA9W10sbT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxuPXRoaXMuX3ZpcnR1YWxTdGFydCxxPXRoaXMuX3ZpcnR1YWxFbmQsdT10aGlzLl9waHlzaWNhbENvdW50LHg9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBBPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgeT10aGlzLl9zY3JvbGxUb3Asdz10aGlzLl9zY3JvbGxCb3R0b207aWYobCl7dmFyIEM9dGhpcy5fcGh5c2ljYWxTdGFydDtBPXkteH1lbHNlIEM9dGhpcy5fcGh5c2ljYWxFbmQsQS09dztmb3IoOzspe3ZhciBHPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChDKTtBLT1HO2lmKHAubGVuZ3RoPj11fHxBPD1tKWJyZWFrO2lmKGwpe2lmKHErcC5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrOwppZih4K0c+PXktdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO3AucHVzaChDKTt4Kz1HO0M9KEMrMSkldX1lbHNle2lmKDA+PW4tcC5sZW5ndGgpYnJlYWs7aWYoeCt0aGlzLl9waHlzaWNhbFNpemUtRzw9dylicmVhaztwLnB1c2goQyk7eC09RztDPTA9PT1DP3UtMTpDLTF9fXJldHVybntpbmRleGVzOnAscGh5c2ljYWxUb3A6eC10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKGwscCl7aWYoIShsJiYwPT09bC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMobCk7dGhpcy5fdXBkYXRlTWV0cmljcyhsKTtpZihwKWZvcig7cC5sZW5ndGg7KWw9cC5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGwpO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGwpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CnZhciBwLG09QXJyYXkobCk7Zm9yKHA9MDtwPGw7cCsrKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO21bcF09bi5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChuLnJvb3QpfXJldHVybiBtfSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbihsKXtsPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrbCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2w9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhsKTtpZih0aGlzLmdyaWQpe3ZhciBwPWwldGhpcy5faXRlbXNQZXJSb3c7cCYmbC1wPD10aGlzLl9waHlzaWNhbENvdW50JiYobCs9dGhpcy5faXRlbXNQZXJSb3cpOwpsLT1wfWwtPXRoaXMuX3BoeXNpY2FsQ291bnQ7cD1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoMD5sKSl7aWYoMDxsKXtwPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChsKSk7Zm9yKHZhciBtPTA7bTxsO20rKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudCs9bDt0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sKTt0aGlzLl91cGRhdGUoKTt0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1wKS9sO3A9TWF0aC5yb3VuZCguNSoKdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1wfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLHApKSxrKTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMscCksdCkpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXt2YXIgbD10aGlzLl9nZXRSZXVzYWJsZXMoITApO3RoaXMuX3BoeXNpY2FsVG9wPWwucGh5c2ljYWxUb3A7dGhpcy5fdmlydHVhbFN0YXJ0Kz0KbC5pbmRleGVzLmxlbmd0aDt0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3VwZGF0ZShsLmluZGV4ZXMpO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApfWVsc2UgMDx0aGlzLl92aXJ0dWFsQ291bnQmJih0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDMpKX0sX2Vuc3VyZVRlbXBsYXRpemVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3Rvcil7KHRoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIikpfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciBsPXtfX2tleV9fOiEwfTtsW3RoaXMuYXNdPSEwO2xbdGhpcy5pbmRleEFzXT0hMDtsW3RoaXMuc2VsZWN0ZWRBc109ITA7bC50YWJJbmRleD0hMDt0aGlzLl9pbnN0YW5jZVByb3BzPQpsO3RoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24obCxwKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBwJiYodGhpcy5ub3RpZnlSZXNpemUoKSxQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLGwmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGwpe2lmKCJpdGVtcyI9PT1sLnBhdGgpdGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9jb2xsZWN0aW9uPXRoaXMuaXRlbXMmJlBvbHltZXIuQ29sbGVjdGlvbj9Qb2x5bWVyLkNvbGxlY3Rpb24uZ2V0KHRoaXMuaXRlbXMpOm51bGwsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09bC5wYXRoKXt0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgobC52YWx1ZS5pbmRleFNwbGljZXMpO3RoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjA7aWYobC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gMDxtLmFkZGVkQ291bnR8fDA8bS5yZW1vdmVkLmxlbmd0aH0pKXt2YXIgcD0KdGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMocCkmJnAuYmx1cigpfWw9bC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gbS5pbmRleCttLmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmbS5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0sdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFsfHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfWVsc2UiaXRlbXMubGVuZ3RoIiE9PWwucGF0aCYmdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGwucGF0aCxsLnZhbHVlKX0sX2ZvcndhcmRJdGVtUGF0aDpmdW5jdGlvbihsLHApe2w9bC5zbGljZSg2KTt2YXIgbT1sLmluZGV4T2YoIi4iKTstMT09PW0mJihtPWwubGVuZ3RoKTt2YXIgbixxPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtpZihmKXt2YXIgdT1wYXJzZUludChsLnN1YnN0cmluZygwLG0pLDEwKTtpZihuPXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh1KSl7dmFyIHg9CnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodSk7dmFyIEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t4XSl9ZWxzZSBxJiYoQT1xKTtpZighQXx8QVt0aGlzLmluZGV4QXNdIT09dSlyZXR1cm59ZWxzZSBpZih1PWwuc3Vic3RyaW5nKDAsbSkscSYmcS5fX2tleV9fPT09dSlBPXE7ZWxzZSBpZih4PXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdV0sQT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3hdKSwhQXx8QS5fX2tleV9fIT09dSlyZXR1cm47bD1sLnN1YnN0cmluZyhtKzEpO2w9dGhpcy5hcysobD8iLiIrbDoiIik7Zj9BLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobCxwLCExLCEwKTpBLm5vdGlmeVBhdGgobCxwLCEwKTtBLl9mbHVzaFByb3BlcnRpZXMmJkEuX2ZsdXNoUHJvcGVydGllcyghMCk7biYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW3hdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpfSwKX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbihsKXtsLmZvckVhY2goZnVuY3Rpb24ocCl7cC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKTtwLmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCYmKHA9TWF0aC5tYXgocC5hZGRlZENvdW50LXAucmVtb3ZlZC5sZW5ndGgscC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydCs9cCwwPD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCs9cCkpfSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24obCl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGwpO3RoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT1sJiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGwscCl7dmFyIG0sbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmcClmb3Iobj0KMDtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTt2YXIgdT10aGlzLl9jb21wdXRlVmlkeChxKTtpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX1lbHNle3E9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IodT10aGlzLl92aXJ0dWFsU3RhcnQ7cTx0aGlzLl9waHlzaWNhbENvdW50O3ErKyx1KyspaWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG07Zm9yKHE9MDtxPHRoaXMuX3BoeXNpY2FsU3RhcnQ7cSsrLHUrKylpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX19LF9jb21wdXRlVmlkeDpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGwtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2x9LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24obCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHAsCm0pe3ZhciBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0scT10aGlzLml0ZW1zJiZ0aGlzLml0ZW1zW21dO2lmKG51bGwhPXEpe3ZhciB1PXRoaXMubW9kZWxGb3JFbGVtZW50KG4pO3UuX19rZXlfXz10aGlzLl9jb2xsZWN0aW9uP3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHEpOm51bGw7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsdGhpcy5hcyxxKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSx0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQocSkpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh1LHRoaXMuaW5kZXhBcyxtKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1tPzA6LTEpO3RoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdS5fX2tleV9fXT1wO3UuX2ZsdXNoUHJvcGVydGllcyYmdS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtuLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBuLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwKIiIpfSxsKX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24obCl7UG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKTt2YXIgcD0wLG09MCxuPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbih1KXttKz10aGlzLl9waHlzaWNhbFNpemVzW3VdO3RoaXMuX3BoeXNpY2FsU2l6ZXNbdV09dGhpcy5fcGh5c2ljYWxJdGVtc1t1XS5vZmZzZXRIZWlnaHQ7cCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XT8xOjB9LGwpO3RoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG09MT09PXRoaXMuX2l0ZW1zUGVyUm93P206Ck1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStwLW0sdGhpcy5faXRlbXNQZXJSb3c9MSk7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1uJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHEqbitwKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwO3RoaXMuX3Jvd0hlaWdodD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwO3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKToKdGhpcy5faXRlbXNQZXJSb3d9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgbD10aGlzLl9waHlzaWNhbFRvcDtpZih0aGlzLmdyaWQpe3ZhciBwPSh0aGlzLl92aWV3cG9ydFdpZHRoLXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCkvMjt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXt2YXIgcT1NYXRoLmZsb29yKG4ldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK3ApO3RoaXMuX2lzUlRMJiYocSo9LTEpO3RoaXMudHJhbnNsYXRlM2QocSsicHgiLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO3RoaXMuX3Nob3VsZFJlbmRlck5leHRSb3cobikmJihsKz10aGlzLl9yb3dIZWlnaHQpfSl9ZWxzZSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSl7dGhpcy50cmFuc2xhdGUzZCgwLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO2wrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV19KX0sCl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeChsKSV0aGlzLl9pdGVtc1BlclJvdyE9PXRoaXMuX2l0ZW1zUGVyUm93LTE/MDp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplc1tsXX0sX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24obCl7cmV0dXJuIGwldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgbD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT1sKXt0aGlzLl9waHlzaWNhbFRvcC09bDt2YXIgcD10aGlzLl9zY3JvbGxUb3A7IWQmJjA8cCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihwLWwpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24obCl7dGhpcy5zY3JvbGxUYXJnZXQmJgowPD1sJiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWwpfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGwpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChsPShsPShsPWx8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD0KdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihsKXtpZighKCJudW1iZXIiIT09dHlwZW9mIGx8fDA+bHx8bD50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtsPXRoaXMuX2NsYW1wKGwsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8bD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/bC0yKnRoaXMuX2l0ZW1zUGVyUm93OmwtMTt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIHA9dGhpcy5fcGh5c2ljYWxTdGFydCxtPXRoaXMuX3ZpcnR1YWxTdGFydCxuPTAscT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTttPGwmJm48PXE7KW4rPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChwKSxwPShwKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbSsrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K24pO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0KdGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLGZ1bmN0aW9uKCl7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9LGgpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpe2lmKCEoMD5sfHxsPj10aGlzLl92aXJ0dWFsQ291bnQpKXshdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKTtpZih0aGlzLl9pc0luZGV4UmVuZGVyZWQobCkpe3ZhciBwPQp0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTtwJiYocFt0aGlzLnNlbGVjdGVkQXNdPSEwKTt0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKX10aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXg/dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5zZWxlY3QodGhpcy5pdGVtc1tsXSl9fSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZGVzZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSxkZXNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpezA+bHx8bD49dGhpcy5fdmlydHVhbENvdW50fHwodGhpcy5faXNJbmRleFJlbmRlcmVkKGwpJiYodGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSlbdGhpcy5zZWxlY3RlZEFzXT0hMSx0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKSksdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXg/CnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdCh0aGlzLml0ZW1zW2xdKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6ZnVuY3Rpb24obCl7KHRoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQ/dGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChsKTp0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2xdKSk/dGhpcy5kZXNlbGVjdEluZGV4KGwpOnRoaXMuc2VsZWN0SW5kZXgobCl9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGwpe3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbbF0pW3RoaXMuc2VsZWN0ZWRBc109ITF9KTt0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sCl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZDpmdW5jdGlvbihsKXsobD90aGlzLmxpc3Rlbjp0aGlzLnVubGlzdGVuKS5jYWxsKHRoaXMsdGhpcywidGFwIiwiX3NlbGVjdGlvbkhhbmRsZXIiKX0sX3NlbGVjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7dmFyIHA9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO2lmKHApe3ZhciBtPVBvbHltZXIuZG9tKGwpLnBhdGhbMF07bD10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHBbdGhpcy5pbmRleEFzXSldO2lmKCJpbnB1dCIhPT1tLmxvY2FsTmFtZSYmImJ1dHRvbiIhPT1tLmxvY2FsTmFtZSYmInNlbGVjdCIhPT1tLmxvY2FsTmFtZSl7bT1wLnRhYkluZGV4O3AudGFiSW5kZXg9LTEwMDt2YXIgcT1sP2wudGFiSW5kZXg6LTE7cC50YWJJbmRleD1tO2wmJm4hPT1sJiZuLmNvbnRhaW5zKGwpJiYtMTAwIT09cXx8dGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKHBbdGhpcy5hc10pfX19LApfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKGwpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLiQuc2VsZWN0b3IubXVsdGk9bH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbihsKXtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGwpKXJldHVybiBudWxsO3RoaXMuX3VwZGF0ZU1ldHJpY3MoW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7cmV0dXJuIG51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7MDw9bCYmbDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKGwpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6MDx0aGlzLl92aXJ0dWFsQ291bnQmJgowPHRoaXMuX3BoeXNpY2FsQ291bnQmJih0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9waHlzaWNhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fdmlydHVhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fcGh5c2ljYWxTdGFydF0pfSxfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzpmdW5jdGlvbihsKXt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MTtyZXR1cm4gdGhpcy5ncmlkP01hdGguY2VpbChsL3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9pdGVtc1BlclJvdzpsfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGwpe3JldHVybiBsPj10aGlzLl92aXJ0dWFsU3RhcnQmJmw8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5maXJzdFZpc2libGVJbmRleCYmbDw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fSxfZ2V0UGh5c2ljYWxJbmRleDpmdW5jdGlvbihsKXtyZXR1cm4gZj8KKHRoaXMuX3BoeXNpY2FsU3RhcnQrKGwtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudDp0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHRoaXMuaXRlbXNbbF0pXX0sZm9jdXNJdGVtOmZ1bmN0aW9uKGwpe3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKGwpfSxfZm9jdXNQaHlzaWNhbEl0ZW06ZnVuY3Rpb24obCl7aWYoISgwPmx8fGw+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpO3RoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8dGhpcy5zY3JvbGxUb0luZGV4KGwpO3ZhciBwPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChsKV0sbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuO20udGFiSW5kZXg9LTEwMDstMTAwPT09cC50YWJJbmRleCYmKG49cCk7bnx8KG49UG9seW1lci5kb20ocCkucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XHgzZCItMTAwIl0nKSk7Cm0udGFiSW5kZXg9MDt0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PWw7biYmbi5mb2N1cygpfX0sX3JlbW92ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTt0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIHA9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT0KcC5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChwLnJvb3QpfXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbbF07dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLnRhYkluZGV4PTA7dGhpcy5fcGh5c2ljYWxJdGVtc1tsXT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbTt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD1sO3RoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksCnA9dGhpcy5fcGh5c2ljYWxJdGVtc1tsXTtpZihwKXt2YXIgbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTttW3RoaXMuYXNdPT09blt0aGlzLmFzXT8odGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09cCxtLnRhYkluZGV4PS0xLHRoaXMuX3BoeXNpY2FsSXRlbXNbbF09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpO3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKGwpe2w9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxtPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSwKbj10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4O2wmJihwPT09bD90aGlzLl9pc0luZGV4VmlzaWJsZShuKXx8dGhpcy5zY3JvbGxUb0luZGV4KG4pOih0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSxwJiYocC50YWJJbmRleD0tMSksbC50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9bj1sW3RoaXMuaW5kZXhBc10sdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChuKSx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4XSxtJiYhdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX3VwZGF0ZSgpKSl9LF9rZXlkb3duSGFuZGxlcjpmdW5jdGlvbihsKXtzd2l0Y2gobC5rZXlDb2RlKXtjYXNlIDQwOnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8dGhpcy5fdmlydHVhbENvdW50LTEmJmwucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KwoodGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM5OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/LTE6MSkpO2JyZWFrO2Nhc2UgMzg6MDx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiZsLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleC0odGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM3OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/MTotMSkpO2JyZWFrO2Nhc2UgMTM6dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksdGhpcy5zZWxlY3Rpb25FbmFibGVkJiZ0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKGwpfX0sX2NsYW1wOmZ1bmN0aW9uKGwsCnAsbSl7cmV0dXJuIE1hdGgubWluKG0sTWF0aC5tYXgocCxsKSl9LF9kZWJvdW5jZTpmdW5jdGlvbihsLHAsbSl7Zj8odGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW2xdPVBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbbF0sbSxwLmJpbmQodGhpcykpLFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW2xdKSk6UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UobCxwKSl9LF9mb3J3YXJkUHJvcGVydHk6ZnVuY3Rpb24obCxwLG0pe2Y/bC5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsbSk6bFtwXT1tfSxfZm9yd2FyZEhvc3RQcm9wVjI6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJnRoaXMubW9kZWxGb3JFbGVtZW50KG0pLmZvcndhcmRIb3N0UHJvcChsLApwKX0sdGhpcyl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihsLHAsbSl7UG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcyxwKSYmKGw9bFt0aGlzLmluZGV4QXNdLHA9PXRoaXMuYXMmJih0aGlzLml0ZW1zW2xdPW0pLHRoaXMubm90aWZ5UGF0aChQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHRoaXMuYXMsIml0ZW1zLiIrbCxwKSxtKSl9LF9nZXRTdGFtcGVkQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxJdGVtc30sX2ZvcndhcmRJbnN0YW5jZVBhdGg6ZnVuY3Rpb24obCxwLG0pezA9PT1wLmluZGV4T2YodGhpcy5hcysiLiIpJiZ0aGlzLm5vdGlmeVBhdGgoIml0ZW1zLiIrbC5fX2tleV9fKyIuIitwLnNsaWNlKHRoaXMuYXMubGVuZ3RoKzEpLG0pfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJgp0aGlzLm1vZGVsRm9yRWxlbWVudChtKS5ub3RpZnlQYXRoKGwscCwhMCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFByb3A6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJih0aGlzLm1vZGVsRm9yRWxlbWVudChtKVtsXT1wKX0sdGhpcyl9LF9nZXRBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0O3JldHVybiBQb2x5bWVyLmRvbShsP2wucm9vdDpkb2N1bWVudCkuYWN0aXZlRWxlbWVudH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJvZHkuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaXRlbS1ib2R5In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90Zi1ncmFwaC1pY29uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihrKXtrLkNPTlNUPSJDT05TVCI7ay5NRVRBPSJNRVRBIjtrLk9QPSJPUCI7ay5TRVJJRVM9IlNFUklFUyI7ay5TVU1NQVJZPSJTVU1NQVJZIn0pKGg9Zi5HcmFwaEljb25UeXBlfHwoZi5HcmFwaEljb25UeXBlPXt9KSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWljb24iLHByb3BlcnRpZXM6e3R5cGU6U3RyaW5nLHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc3Ryb2tlT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LGZhZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maWxsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsKHR5cGUsIGZpbGxPdmVycmlkZSkifSxfc3Ryb2tlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTdHJva2UodHlwZSwgc3Ryb2tlT3ZlcnJpZGUpIn19LApnZXRTdmdEZWZpbmFibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuJC5zdmdEZWZzfSxfY29tcHV0ZUZpbGwoayx0KXtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaChrKXtjYXNlIGguTUVUQTpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2Nhc2UgaC5TRVJJRVM6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEx9fSxfY29tcHV0ZVN0cm9rZShrLHQpe2lmKG51bGwhPXQpcmV0dXJuIHQ7c3dpdGNoKGspe2Nhc2UgaC5NRVRBOnJldHVybiBiLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtjYXNlIGguU0VSSUVTOnJldHVybiBiLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRX19LApfaXNUeXBlKGssdCl7cmV0dXJuIGs9PT10fSxfZmFkZWRDbGFzczpmdW5jdGlvbihrLHQpe3JldHVybiBrPyJmYWRlZC0iK3Q6IiJ9fSl9KShkLmljb258fChkLmljb249e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLW5vZGUtaWNvbi5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWljb24iLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHJlbmRlckluZm86e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGNvbG9yQnk6e3R5cGU6T2JqZWN0LHZhbHVlOiJzdHJ1Y3R1cmFsIn0sdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSx0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb25zdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzdW1tYXJ5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF9maWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifX0sCl9jb21wdXRlRmlsbE92ZXJyaWRlOmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIGImJmQmJmYmJmg/KGI9dGYuZ3JhcGguc2NlbmUubm9kZSxiLmdldEZpbGxGb3JOb2RlKGgsYi5Db2xvckJ5W2YudG9VcHBlckNhc2UoKV0sZCwhMSkpOmt9LF9nZXRTdHJva2VPdmVycmlkZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFN0cm9rZUZvckZpbGwoYik6bnVsbH0sX2dldFR5cGU6ZnVuY3Rpb24oYixkLGYsaCl7Y29uc3Qgaz10Zi5ncmFwaC5pY29uLkdyYXBoSWNvblR5cGU7aWYoYilzd2l0Y2goYi50eXBlKXtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk9QOnJldHVybiBiPWIub3AsInN0cmluZyIhPT10eXBlb2YgYj9rLk9QOiJDb25zdCI9PT1ifHxmP2suQ09OU1Q6Yi5lbmRzV2l0aCgiU3VtbWFyeSIpfHxkP2suU1VNTUFSWTprLk9QO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuTUVUQTpyZXR1cm4gay5NRVRBO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuU0VSSUVTOnJldHVybiBrLlNFUklFU31yZXR1cm4gaH0sCl9pc1ZlcnRpY2FsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/Yi5oYXNOb25Db250cm9sRWRnZXM6ISFkfSxfZ2V0RmFkZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuaXNGYWRlZE91dH0sX29uRmlsbE92ZXJyaWRlQ2hhbmdlZChiLGQpe2NvbnN0IGY9dGhpcy5ub2RlLGg9dGhpcy5yZW5kZXJJbmZvLGs9dGhpcy5jb2xvckJ5LHQ9dGhpcy50ZW1wbGF0ZUluZGV4LGw9dGYuZ3JhcGguc2NlbmUubm9kZTtiIT09ZCYmbC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZiYmaCYmayYmdCYmbC5nZXRGaWxsRm9yTm9kZSh0LGwuQ29sb3JCeVtrLnRvVXBwZXJDYXNlKCldLGgsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYi50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXRQcmludGFibGVIVE1MTm9kZU5hbWU6ZnVuY3Rpb24oYil7cmV0dXJuKGJ8fCIiKS5yZXBsYWNlKC9cLy9nLCJceDNjd2JyXHgzZS8iKX0sX2dldFJlbmRlckluZm86ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShiKX0sCl90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzaXplTGlzdDpmdW5jdGlvbihiKXsoYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGIpKSYmYi5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfZ2V0SW5jb21wYXRpYmxlT3BOb2RlczpmdW5jdGlvbihiLGQpe2lmKGImJmIucm9vdClyZXR1cm4gdGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2luY29tcGF0aWJsZU9wc0xpc3QiKSksdGYuZ3JhcGguaGllcmFyY2h5LmdldEluY29tcGF0aWJsZU9wcyhiLGQpfSxfY29tcHV0ZU9wQ29tcGF0U2NvcmU6ZnVuY3Rpb24oYil7aWYoYiYmYi5yb290KXt2YXIgZD1iLnJvb3Q7Yj1kLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtkPWQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CnJldHVybiAwPT1iJiYwPT1kPzA6TWF0aC5mbG9vcigxMDAqYi8oYitkKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGIpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGIpfSxfZ2V0VG90YWxJbmNvbXBhdGlibGVPcHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIucm9vdD9iLnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2IudHlwZSx7Y2FyZE5vZGU6dGhpcy5jYXJkTm9kZS5uYW1lLG5vZGVOYW1lOnRoaXMubmFtZSwKdHlwZTp0aGlzLml0ZW1UeXBlfSl9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pbmZvIixwcm9wZXJ0aWVzOntncmFwaE5vZGVOYW1lOlN0cmluZyxncmFwaEhpZXJhcmNoeTpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxjb2xvckJ5OlN0cmluZyxfdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbixjb21wdXRlZDoiX2dldFRlbXBsYXRlSW5kZXgoZ3JhcGhIaWVyYXJjaHkpIn0sX25vZGU6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZShncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9LF9ub2RlU3RhdHM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzKGdyYXBoTm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKF9ub2RlU3RhdHMpIn0sX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlcyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZShfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKF9ub2RlU3RhdHMpIn0sbm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQifSxfYXR0cmlidXRlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEF0dHJpYnV0ZXMoX25vZGUpIn0sX2RldmljZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXREZXZpY2UoX25vZGUpIn0sX3N1Y2Nlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0U3VjY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sCl9wcmVkZWNlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0UHJlZGVjZXNzb3JzKF9ub2RlLCBncmFwaEhpZXJhcmNoeSkifSxfZnVuY3Rpb25Vc2FnZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRGdW5jdGlvblVzYWdlcyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX3N1Ym5vZGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0U3Vibm9kZXMoX25vZGUpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90b3RhbFByZWRlY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFByZWQoX3ByZWRlY2Vzc29ycykifSxfdG90YWxTdWNjZXNzb3JzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsU3VjYyhfc3VjY2Vzc29ycykifSxfb3BlbmVkQ29udHJvbFByZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX29wZW5lZENvbnRyb2xTdWNjOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hdXhCdXR0b25UZXh0OlN0cmluZyxfZ3JvdXBCdXR0b25UZXh0OlN0cmluZ30sCmV4cGFuZE5vZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIl9ub2RlLmV4cGFuZCIsdGhpcy5ub2RlKX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXROb2RlU3RhdHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4oYj10aGlzLl9nZXROb2RlKGIsZCkpP2Iuc3RhdHM6bnVsbH0sX2dldFRvdGFsTWljcm9zOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IuZ2V0VG90YWxNaWNyb3MoKTowfSxfZ2V0SGFzRGlzcGxheWFibGVOb2RlU3RhdHM6ZnVuY3Rpb24oYil7cmV0dXJuIHRmLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoYil9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlczpmdW5jdGlvbihiKXtpZihiJiZiLnRvdGFsQnl0ZXMpcmV0dXJuIHRmLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGIudG90YWxCeXRlcyx0Zi5ncmFwaC51dGlsLk1FTU9SWV9VTklUUyl9LApfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6ZnVuY3Rpb24oYil7aWYoYiYmYi5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShiLmdldFRvdGFsTWljcm9zKCksdGYuZ3JhcGgudXRpbC5USU1FX1VOSVRTKX0sX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzOmZ1bmN0aW9uKGIpe2lmKGImJmIub3V0cHV0U2l6ZSYmYi5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gXy5tYXAoYi5vdXRwdXRTaXplLGZ1bmN0aW9uKGQpe3JldHVybiAwPT09ZC5sZW5ndGg/InNjYWxhciI6IlsiK2Quam9pbigiLCAiKSsiXSJ9KX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihiKXtyZXR1cm4oYnx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGIpfSwKX2dldEF0dHJpYnV0ZXM6ZnVuY3Rpb24oYil7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2F0dHJpYnV0ZXNMaXN0IikpO2lmKCFifHwhYi5hdHRyKXJldHVybltdO3ZhciBkPVtdO18uZWFjaChiLmF0dHIsZnVuY3Rpb24oZil7Zi5rZXk9PT10Zi5ncmFwaC5MQVJHRV9BVFRSU19LRVk/ZD1kLmNvbmNhdChmLnZhbHVlLmxpc3Qucy5tYXAoZnVuY3Rpb24oaCl7cmV0dXJue2tleTpoLHZhbHVlOiJUb28gbGFyZ2UgdG8gc2hvdy4uLiJ9fSkpOmQucHVzaCh7a2V5OmYua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KGYudmFsdWUpfSl9KTtyZXR1cm4gZH0sX2dldERldmljZTpmdW5jdGlvbihiKXtyZXR1cm4gYj9iLmRldmljZTpudWxsfSxfZ2V0U3VjY2Vzc29ycyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImlucHV0c0xpc3QiKTtyZXR1cm4gYj90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChkLmdldFN1Y2Nlc3NvcnMoYi5uYW1lKSwKITEsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRQcmVkZWNlc3NvcnMoYixkKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpO3JldHVybiBiP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGQuZ2V0UHJlZGVjZXNzb3JzKGIubmFtZSksITAsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRGdW5jdGlvblVzYWdlcyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpO3JldHVybiBiJiZiLnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBPyhiPWQubGlicmFyeUZ1bmN0aW9uc1tiLmFzc29jaWF0ZWRGdW5jdGlvbl0pP2IudXNhZ2VzOltdOltdfSxfcmVmcmVzaE5vZGVJdGVtTGlzdChiKXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHtifWApKX0sX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0OmZ1bmN0aW9uKGIsCmQsZil7dmFyIGg9dD0+Xy5tYXAodC5iYXNlRWRnZUxpc3QsbD0+e3ZhciBwPWQ/bC52OmwudztyZXR1cm57bmFtZTpwLG5vZGU6dGhpcy5fZ2V0Tm9kZShwLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yQmFzZUVkZ2UobCx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pLGs9ZnVuY3Rpb24odCl7dmFyIGw9W107Xy5lYWNoKHQscD0+e3ZhciBtPWQ/cC52OnAudztmJiYxIT1wLmJhc2VFZGdlTGlzdC5sZW5ndGg/bC5wdXNoKHtuYW1lOm0sbm9kZTp0aGlzLl9nZXROb2RlKG0sdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JFZGdlKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhtLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOgpsPWwuY29uY2F0KGgocCkpfSk7cmV0dXJuIGx9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6ayhiLnJlZ3VsYXIpLGNvbnRyb2w6ayhiLmNvbnRyb2wpfX0sX2dldFN1Ym5vZGVzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm1ldGFncmFwaD9iLm1ldGFncmFwaC5ub2RlcygpOm51bGx9LF9nZXRUb3RhbFByZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIucmVndWxhci5sZW5ndGgrYi5jb250cm9sLmxlbmd0aH0sX2dldFRvdGFsU3VjYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZWd1bGFyLmxlbmd0aCtiLmNvbnRyb2wubGVuZ3RofSxfdG9nZ2xlQ29udHJvbFByZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9LF90b2dnbGVDb250cm9sU3VjYzpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPSF0aGlzLl9vcGVuZWRDb250cm9sU3VjY30sX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9CiF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPXRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExO3RoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0Iix0Zi5ncmFwaC5zY2VuZS5ub2RlLmdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTt0aGlzLl9ub2RlJiYoUG9seW1lci5kb20odGhpcy4kLm5vZGV0aXRsZSkuaW5uZXJIVE1MPXRoaXMuX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZSh0aGlzLl9ub2RlLm5hbWUpKX0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYil7KGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKSkmJmIuZmlyZSgiaXJvbi1yZXNpemUiKX0sX3RvZ2dsZUluY2x1ZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLWluY2x1c2lvbiIse25hbWU6dGhpcy5ncmFwaE5vZGVOYW1lfSl9LApfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXQoIl9hdXhCdXR0b25UZXh0Iix0Zi5ncmFwaC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhiKSl9LF90b2dnbGVHcm91cDpmdW5jdGlvbigpe3ZhciBiPXRmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0U2VyaWVzTmFtZSh0aGlzLl9ub2RlKTt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpifSl9LF9pc0xpYnJhcnlGdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5uYW1lLnN0YXJ0c1dpdGgodGYuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl9LF9pc0luU2VyaWVzOmZ1bmN0aW9uKGIpe3JldHVybiB0Zi5ncmFwaC5zY2VuZS5ub2RlLmNhbkJlSW5TZXJpZXMoYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtZ3JhcGgtaW5mby5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1pbmZvIixwcm9wZXJ0aWVzOnt0aXRsZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LGdyYXBoOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29tcGF0Tm9kZVRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0saGlnaGxpZ2h0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLWxpc3QtaXRlbS1jbGljayI6Il9ub2RlTGlzdEl0ZW1DbGlja2VkIiwibm9kZS1saXN0LWl0ZW0tbW91c2VvdmVyIjoiX25vZGVMaXN0SXRlbU1vdXNlb3ZlciIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3V0IjoiX25vZGVMaXN0SXRlbU1vdXNlb3V0In0sCl9ub2RlTGlzdEl0ZW1DbGlja2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdmVyOmZ1bmN0aW9uKGIpe3RoaXMuaGlnaGxpZ2h0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdXQ6ZnVuY3Rpb24oKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1udWxsfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZCYmMDxPYmplY3Qua2V5cyhkKS5sZW5ndGh9LF9lcXVhbHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj09PWR9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWJvYXJkL3RmLWdyYXBoLWJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLWJvYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsZ3JhcGg6T2JqZWN0LHN0YXRzOk9iamVjdCxwcm9ncmVzczpPYmplY3QsdHJhY2VJbnB1dHM6Qm9vbGVhbixjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxkZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW4sYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsYWxsU3RlcHNNb2RlRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOjB9LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsCm5vdGlmeTohMH0sY29tcGF0Tm9kZVRpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZToiVFBVIENvbXBhdGliaWxpdHkifSxlZGdlV2lkdGhGdW5jdGlvbjpPYmplY3QsX3NlbGVjdGVkTm9kZUluY2x1ZGU6TnVtYmVyLF9oaWdobGlnaHRlZE5vZGU6U3RyaW5nLGhhbmRsZU5vZGVTZWxlY3RlZDpPYmplY3QsZWRnZUxhYmVsRnVuY3Rpb246T2JqZWN0LGhhbmRsZUVkZ2VTZWxlY3RlZDpPYmplY3R9LG9ic2VydmVyczpbIl91cGRhdGVOb2RlSW5jbHVkZShzZWxlY3RlZE5vZGUsIHJlbmRlckhpZXJhcmNoeSkiXSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuZ3JhcGguZml0KCl9LF9pc05vdENvbXBsZXRlOmZ1bmN0aW9uKGIpe3JldHVybiAxMDA+Yi52YWx1ZX0sX2dldENvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKGIpe3ZhciBkPSJjb250YWluZXIiO2IuZXJyb3ImJihkKz0iIGVycm9yIik7dGhpcy5faXNOb3RDb21wbGV0ZShiKSYmKGQrPSIgbG9hZGluZyIpO3JldHVybiBkfSxfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZChiKXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZUV4dHJhY3QoYi5kZXRhaWwubmFtZSl9LApfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkKGIpe3RoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYi5kZXRhaWwubmFtZSl9LF91cGRhdGVOb2RlSW5jbHVkZSgpe2NvbnN0IGI9dGhpcy5yZW5kZXJIaWVyYXJjaHk/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0Tm9kZUJ5TmFtZSh0aGlzLnNlbGVjdGVkTm9kZSk6bnVsbDt0aGlzLl9zZWxlY3RlZE5vZGVJbmNsdWRlPWI/Yi5pbmNsdWRlOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZW51LWJlaGF2aW9yL2lyb24tbWVudWJhci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51YmFyIn0sa2V5QmluZGluZ3M6e2xlZnQ6Il9vbkxlZnRLZXkiLHJpZ2h0OiJfb25SaWdodEtleSJ9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYil7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sZ2V0IF9pc1JUTCgpe3JldHVybiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9ufSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzTmV4dCgpOnRoaXMuX2ZvY3VzUHJldmlvdXMoKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMPwp0aGlzLl9mb2N1c1ByZXZpb3VzKCk6dGhpcy5fZm9jdXNOZXh0KCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25LZXlkb3duOmZ1bmN0aW9uKGIpe3RoaXMua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsInVwIGRvd24gbGVmdCByaWdodCBlc2MiKXx8dGhpcy5fZm9jdXNXaXRoS2V5Ym9hcmRFdmVudChiKX19O1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcj1bUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yLFBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWJ1dHRvbi9wYXBlci1yYWRpby1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItcmFkaW8tYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnJhZGlvQ29udGFpbmVyfSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiKS50cmltKCkpe3ZhciBiPXBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSIpLnRyaW0oKSksCmQ9TWF0aC5mbG9vcigzKmIpO2QlMiE9PWIlMiYmZCsrO3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiOmQrInB4In0pfX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWdyb3VwL3BhcGVyLXJhZGlvLWdyb3VwLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWdyb3VwIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvZ3JvdXAifSxwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJuYW1lIn0sc2VsZWN0ZWRBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJjaGVja2VkIn0sc2VsZWN0YWJsZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBhcGVyLXJhZGlvLWJ1dHRvbiJ9LGFsbG93RW1wdHlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LHNlbGVjdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtpZighZHx8IWQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXtpZih0aGlzLnNlbGVjdGVkKXtkPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2lmKHRoaXMuc2VsZWN0ZWQ9PWIpaWYodGhpcy5hbGxvd0VtcHR5U2VsZWN0aW9uKWI9IiI7ZWxzZXtkJiYKKGQuY2hlY2tlZD0hMCk7cmV0dXJufWQmJihkLmNoZWNrZWQ9ITEpfVBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5zZWxlY3QuYXBwbHkodGhpcyxbYl0pO3RoaXMuZmlyZSgicGFwZXItcmFkaW8tZ3JvdXAtY2hhbmdlZCIpfX0sX2FjdGl2YXRlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9pdGVtQWN0aXZhdGUodGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuZm9jdXNlZEl0ZW0pLHRoaXMuZm9jdXNlZEl0ZW0pfSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c1ByZXZpb3VzKCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uRG93bktleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c05leHQoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uTGVmdEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CnRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9ySW1wbC5fb25SaWdodEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2x0aXAvcGFwZXItdG9vbHRpcC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sdGlwIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbHRpcCIsdGFiaW5kZXg6LTF9LHByb3BlcnRpZXM6e2Zvcjp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9maW5kVGFyZ2V0In0sbWFudWFsTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbWFudWFsTW9kZUNoYW5nZWQifSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGZpdFRvVmlzaWJsZUJvdW5kczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxtYXJnaW5Ub3A6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxhbmltYXRpb25EZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLG9ic2VydmVyOiJfZGVsYXlDaGFuZ2UifSxhbmltYXRpb25FbnRyeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFuaW1hdGlvbkV4aXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVybntlbnRyeTpbe25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIixub2RlOnRoaXMsdGltaW5nOntkZWxheTowfX1dLGV4aXQ6W3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLG5vZGU6dGhpc31dfX19LF9zaG93aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e3dlYmtpdEFuaW1hdGlvbkVuZDoiX29uQW5pbWF0aW9uRW5kIn0sZ2V0IHRhcmdldCgpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnBhcmVudE5vZGUsZD1Qb2x5bWVyLmRvbSh0aGlzKS5nZXRPd25lclJvb3QoKTtyZXR1cm4gdGhpcy5mb3I/UG9seW1lci5kb20oZCkucXVlcnlTZWxlY3RvcigiIyIrdGhpcy5mb3IpOmIubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT9kLmhvc3Q6Yn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5kVGFyZ2V0KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5tYW51YWxNb2RlfHx0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKX0sCnBsYXlBbmltYXRpb246ZnVuY3Rpb24oYil7ImVudHJ5Ij09PWI/dGhpcy5zaG93KCk6ImV4aXQiPT09YiYmdGhpcy5oaWRlKCl9LGNhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImNhbmNlbC1hbmltYXRpb24iKX0sc2hvdzpmdW5jdGlvbigpe2lmKCF0aGlzLl9zaG93aW5nKXtpZigiIj09PVBvbHltZXIuZG9tKHRoaXMpLnRleHRDb250ZW50LnRyaW0oKSl7Zm9yKHZhciBiPSEwLGQ9UG9seW1lci5kb20odGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLGY9MDtmPGQubGVuZ3RoO2YrKylpZigiIiE9PWRbZl0udGV4dENvbnRlbnQudHJpbSgpKXtiPSExO2JyZWFrfWlmKGIpcmV0dXJufXRoaXMuX3Nob3dpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTsKdGhpcy51cGRhdGVQb3NpdGlvbigpO3RoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKX19LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy5fYW5pbWF0aW9uUGxheWluZz8odGhpcy5fc2hvd2luZz0hMSx0aGlzLl9jYW5jZWxBbmltYXRpb24oKSk6KHRoaXMuX29uQW5pbWF0aW9uRmluaXNoKCksdGhpcy5fc2hvd2luZz0hMSx0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwKSl9LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fdGFyZ2V0JiZ0aGlzLm9mZnNldFBhcmVudCl7dmFyIGI9dGhpcy5vZmZzZXQ7MTQhPXRoaXMubWFyZ2luVG9wJiYxND09dGhpcy5vZmZzZXQmJihiPXRoaXMubWFyZ2luVG9wKTt2YXIgZD10aGlzLm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPXRoaXMuX3RhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGs9KGYud2lkdGgtaC53aWR0aCkvMix0PShmLmhlaWdodC1oLmhlaWdodCkvMixsPWYubGVmdC1kLmxlZnQscD1mLnRvcC1kLnRvcDtzd2l0Y2godGhpcy5wb3NpdGlvbil7Y2FzZSAidG9wIjp2YXIgbT1sK2s7dmFyIG49cC1oLmhlaWdodC1iO2JyZWFrO2Nhc2UgImJvdHRvbSI6bT1sK2s7bj1wK2YuaGVpZ2h0K2I7YnJlYWs7Y2FzZSAibGVmdCI6bT1sLWgud2lkdGgtYjtuPXArdDticmVhaztjYXNlICJyaWdodCI6bT1sK2Yud2lkdGgrYixuPXArdH10aGlzLmZpdFRvVmlzaWJsZUJvdW5kcz8oZC5sZWZ0K20raC53aWR0aD53aW5kb3cuaW5uZXJXaWR0aD8odGhpcy5zdHlsZS5yaWdodD0iMHB4Iix0aGlzLnN0eWxlLmxlZnQ9ImF1dG8iKToodGhpcy5zdHlsZS5sZWZ0PU1hdGgubWF4KDAsbSkrInB4Iix0aGlzLnN0eWxlLnJpZ2h0PSJhdXRvIiksZC50b3ArbitoLmhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQ/KHRoaXMuc3R5bGUuYm90dG9tPQpkLmhlaWdodCsicHgiLHRoaXMuc3R5bGUudG9wPSJhdXRvIik6KHRoaXMuc3R5bGUudG9wPU1hdGgubWF4KC1kLnRvcCxuKSsicHgiLHRoaXMuc3R5bGUuYm90dG9tPSJhdXRvIikpOih0aGlzLnN0eWxlLmxlZnQ9bSsicHgiLHRoaXMuc3R5bGUudG9wPW4rInB4Iil9fSxfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdGFyZ2V0JiYodGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWVudGVyIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiYmx1ciIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMubGlzdGVuKHRoaXMsIm1vdXNlZW50ZXIiLCJoaWRlIil9LApfZmluZFRhcmdldDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7dGhpcy5fdGFyZ2V0PXRoaXMudGFyZ2V0O3RoaXMubWFudWFsTW9kZXx8dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9kZWxheUNoYW5nZTpmdW5jdGlvbihiKXs1MDAhPT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6YisibXMifSl9LF9tYW51YWxNb2RlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZT90aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTp0aGlzLl9hZGRMaXN0ZW5lcnMoKX0sX2NhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSk7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTsKdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9LF9vbkFuaW1hdGlvbkZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX3Nob3dpbmcmJih0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSkpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSExO3RoaXMuX3Nob3dpbmd8fCh0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIikpfSxfZ2V0QW5pbWF0aW9uVHlwZTpmdW5jdGlvbihiKXtpZigiZW50cnkiPT09YiYmIiIhPT10aGlzLmFuaW1hdGlvbkVudHJ5KXJldHVybiB0aGlzLmFuaW1hdGlvbkVudHJ5OwppZigiZXhpdCI9PT1iJiYiIiE9PXRoaXMuYW5pbWF0aW9uRXhpdClyZXR1cm4gdGhpcy5hbmltYXRpb25FeGl0O2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdJiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lKXtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcmJnRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSYmMCE9PXRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSl7dmFyIGQ9dGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0udGltaW5nLmRlbGF5OyJlbnRyeSI9PT1iP3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LWluIjpkKyJtcyJ9KToiZXhpdCI9PT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQiOmQrIm1zIn0pfXJldHVybiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lfX0sX3JlbW92ZUxpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmCih0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlbGVhdmUiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy51bmxpc3Rlbih0aGlzLiQudG9vbHRpcCwiYW5pbWF0aW9uZW5kIiwiX29uQW5pbWF0aW9uRW5kIik7dGhpcy51bmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW5vZGUtc2VhcmNoL3RmLWdyYXBoLW5vZGUtc2VhcmNoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLW5vZGUtc2VhcmNoIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfcmF3UmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9yZWdleElucHV0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSZWdleElucHV0KHJlbmRlckhpZXJhcmNoeSwgX3Jhd1JlZ2V4SW5wdXQpIn0sX3ByZXZpb3VzUmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9zZWFyY2hUaW1lb3V0RGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjE1MCxyZWFkT25seTohMH0sX3NlYXJjaFBlbmRpbmc6Qm9vbGVhbixfbWF4UmVnZXhSZXN1bHRzOnt0eXBlOk51bWJlcix2YWx1ZTo0Mn0sX3JlZ2V4TWF0Y2hlczpBcnJheX0sb2JzZXJ2ZXJzOlsiX3JlZ2V4SW5wdXRDaGFuZ2VkKF9yZWdleElucHV0KSJdLF9jb21wdXRlUmVnZXhJbnB1dChiLGQpe3JldHVybiBkLnRyaW0oKX0sCl9yZWdleElucHV0Q2hhbmdlZCgpe3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sX2NsZWFyU2VhcmNoUmVzdWx0cygpe3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixbXSl9LF9yZXF1ZXN0U2VhcmNoKCl7dGhpcy5fc2VhcmNoUGVuZGluZ3x8KHRoaXMuX3JlZ2V4SW5wdXQ9PT10aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ/dGhpcy5fc2VhcmNoUGVuZGluZz0hMToodGhpcy5fc2VhcmNoUGVuZGluZz0hMCx0aGlzLl9leGVjdXRlU2VhcmNoKCksdGhpcy5hc3luYygoKT0+e3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE7dGhpcy5fcmVxdWVzdFNlYXJjaCgpfSx0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXkpKSl9LF9leGVjdXRlU2VhcmNoKCl7aWYodGhpcy5fcHJldmlvdXNSZWdleElucHV0PXRoaXMuX3JlZ2V4SW5wdXQpe3RyeXt2YXIgYj1uZXcgUmVnRXhwKHRoaXMuX3JlZ2V4SW5wdXQpfWNhdGNoKGYpe3RoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpO3JldHVybn12YXIgZD1bXTtfLmVhY2godGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKSwKKGYsaCk9PntpZihkLmxlbmd0aD49dGhpcy5fbWF4UmVnZXhSZXN1bHRzKXJldHVybiExO2IudGVzdChoKSYmZC5wdXNoKGgpfSk7dGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLGQpfWVsc2UgdGhpcy5fY2xlYXJTZWFyY2hSZXN1bHRzKCl9LF9tYXRjaENsaWNrZWQoYil7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYi5tb2RlbC5pdGVtKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb250cm9scy90Zi1ncmFwaC1jb250cm9scy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjb25zdCBoPS9kZXZpY2U6KFteOl0rOlswLTldKykkLyxrPVt7cmVnZXg6aH1dLHQ9W107bGV0IGw7KGZ1bmN0aW9uKG0pe20uQ09NUFVURV9USU1FPSJjb21wdXRlX3RpbWUiO20uTUVNT1JZPSJtZW1vcnkiO20uU1RSVUNUVVJFPSJzdHJ1Y3R1cmUiO20uWExBX0NMVVNURVI9InhsYV9jbHVzdGVyIjttLk9QX0NPTVBBVElCSUxJVFk9Im9wX2NvbXBhdGliaWxpdHkifSkobD1mLkNvbG9yQnl8fChmLkNvbG9yQnk9e30pKTtjb25zdCBwPW5ldyBTZXQoW2wuQ09NUFVURV9USU1FLGwuTUVNT1JZXSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntzdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0YXRzQ2hhbmdlZCJ9LGRldmljZXNGb3JTdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLAp2YWx1ZTpsLlNUUlVDVFVSRSxub3RpZnk6ITB9LGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkb25seTohMH0sZGF0YXNldHM6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9kYXRhc2V0c0NoYW5nZWQiLHZhbHVlOigpPT5bXX0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdH0sc2VsZWN0aW9uOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlU2VsZWN0aW9uKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgsIF9zZWxlY3RlZEdyYXBoVHlwZSkifSxzZWxlY3RlZEZpbGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX3NlbGVjdGVkUnVuSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZCJ9LHRyYWNlSW5wdXRzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfc2VsZWN0ZWRUYWdJbmRleDp7dHlwZTpOdW1iZXIsCnZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCJ9LF9zZWxlY3RlZEdyYXBoVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2N1cnJlbnREZXZpY2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZXMoZGV2aWNlc0ZvclN0YXRzKSJ9LF9jdXJyZW50RGV2aWNlUGFyYW1zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZVBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50WGxhQ2x1c3RlclBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKGNvbG9yQnlQYXJhbXMpIn0sX2N1cnJlbnRHcmFkaWVudFBhcmFtczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRDdXJyZW50R3JhZGllbnRQYXJhbXMoY29sb3JCeVBhcmFtcywgY29sb3JCeSkifSwKc2hvd1Nlc3Npb25SdW5zRHJvcGRvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sc2hvd1VwbG9hZEJ1dHRvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxoZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkOkJvb2xlYW4saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sZWdlbmRPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LF94bGFDbHVzdGVyc1Byb3ZpZGVkOmZ1bmN0aW9uKG0pe3JldHVybiBtJiZtLmhpZXJhcmNoeSYmMDxtLmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGh9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24obSl7aWYobnVsbCE9bSl7dmFyIG49e307Xy5lYWNoKG0uZGV2X3N0YXRzLGZ1bmN0aW9uKHEpe3ZhciB1PV8uc29tZShrLGZ1bmN0aW9uKEEpe3JldHVybiBBLnJlZ2V4LnRlc3QocS5kZXZpY2UpfSkseD1fLnNvbWUodCxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHEuZGV2aWNlKX0pO3UmJiF4JiYobltxLmRldmljZV09CiEwKX0pO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfX0sX2dldEN1cnJlbnREZXZpY2VzOmZ1bmN0aW9uKG0pe3ZhciBuPXRoaXMuc3RhdHM7bj0obj9uLmRldl9zdGF0czpbXSkubWFwKHU9PnUuZGV2aWNlKS5maWx0ZXIodT0+ay5zb21lKHg9PngucmVnZXgudGVzdCh1KSkpO2NvbnN0IHE9Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChuKTtpZigxPT1xLmxlbmd0aCl7Y29uc3QgdT1xWzBdLm1hdGNoKGgpO3UmJihxWzBdPXVbMV0pfXJldHVybiBuLm1hcCgodSx4KT0+e2xldCBBPW51bGw7dC5mb3JFYWNoKHk9Pnt5LnJlZ2V4LnRlc3QodSkmJihBPXkubXNnKX0pO3JldHVybntkZXZpY2U6dSxzdWZmaXg6cVt4XSx1c2VkOm1bdV0saWdub3JlZE1zZzpBfX0pfSxfZGV2aWNlQ2hlY2tib3hDbGlja2VkOmZ1bmN0aW9uKG0pe209bS50YXJnZXQ7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHRoaXMuZGV2aWNlc0ZvclN0YXRzKSxxPW0udmFsdWU7bS5jaGVja2VkPwpuW3FdPSEwOmRlbGV0ZSBuW3FdO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfSxfbnVtVGFnczpmdW5jdGlvbihtLG4pe3JldHVybiB0aGlzLl9nZXRUYWdzKG0sbikubGVuZ3RofSxfZ2V0VGFnczpmdW5jdGlvbihtLG4pe3JldHVybiBtJiZtW25dP21bbl0udGFnczpbXX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZml0LXRhcCIpfSxfaXNHcmFkaWVudENvbG9yaW5nOmZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaGFzKG4pJiZudWxsIT1tfSxfZXF1YWxzOmZ1bmN0aW9uKG0sbil7cmV0dXJuIG09PT1ufSxfZ2V0Q3VycmVudERldmljZVBhcmFtczpmdW5jdGlvbihtKXttPW0uZGV2aWNlLmZpbHRlcih1PT5rLnNvbWUoeD0+eC5yZWdleC50ZXN0KHUuZGV2aWNlKSkpO2NvbnN0IG49Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChtLm1hcCh1PT51LmRldmljZSkpO2lmKDE9PW4ubGVuZ3RoKXt2YXIgcT1uWzBdLm1hdGNoKGgpO3EmJihuWzBdPXFbMV0pfXJldHVybiBtLm1hcCgodSwKeCk9Pih7ZGV2aWNlOm5beF0sY29sb3I6dS5jb2xvcn0pKX0sX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zOmZ1bmN0aW9uKG0pe3JldHVybiBtLnhsYV9jbHVzdGVyfSxfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zOmZ1bmN0aW9uKG0sbil7aWYodGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMsbikpe209bVtuXTt2YXIgcT1tLm1pblZhbHVlLHU9bS5tYXhWYWx1ZTtuPT09bC5NRU1PUlk/KHE9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShxLGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpLHU9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh1LGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpKTpuPT09bC5DT01QVVRFX1RJTUUmJihxPWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocSxiLmdyYXBoLnV0aWwuVElNRV9VTklUUyksdT1iLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHUsCmIuZ3JhcGgudXRpbC5USU1FX1VOSVRTKSk7cmV0dXJue21pblZhbHVlOnEsbWF4VmFsdWU6dSxzdGFydENvbG9yOm0uc3RhcnRDb2xvcixlbmRDb2xvcjptLmVuZENvbG9yfX19LGRvd25sb2FkOmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoZG93bmxvYWQuY2xpY2soKX0sX3VwZGF0ZUZpbGVJbnB1dDpmdW5jdGlvbihtKXt2YXIgbj1tLnRhcmdldC5maWxlc1swXTtpZihuKXtuPW4ubmFtZTt2YXIgcT1uLmxhc3RJbmRleE9mKCIuIik7MDw9cSYmKG49bi5zdWJzdHJpbmcoMCxxKSk7cT1uLmxhc3RJbmRleE9mKCIvIik7MDw9cSYmKG49bi5zdWJzdHJpbmcocSsxKSk7dGhpcy5fc2V0RG93bmxvYWRGaWxlbmFtZShuKTt0aGlzLnNldCgic2VsZWN0ZWRGaWxlIixtKX19LF9kYXRhc2V0c0NoYW5nZWQ6ZnVuY3Rpb24obSxuKXtudWxsIT1uJiYodGhpcy5fc2VsZWN0ZWRSdW5JbmRleD0wKX0sX2NvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24obSxuLHEsdSl7cmV0dXJuIG1bbl0mJm1bbl0udGFnc1txXT8Ke3J1bjptW25dLm5hbWUsdGFnOm1bbl0udGFnc1txXS50YWcsdHlwZTp1fTpudWxsfSxfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQ6ZnVuY3Rpb24obSl7dGhpcy5kYXRhc2V0cyYmKHRoaXMuY29sb3JCeT1sLlNUUlVDVFVSRSx0aGlzLl9zZWxlY3RlZFRhZ0luZGV4PTAsdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKSx0aGlzLnRyYWNlSW5wdXRzPSExLHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUodGhpcy5kYXRhc2V0c1ttXT90aGlzLmRhdGFzZXRzW21dLm5hbWU6IiIpKX0sX3NlbGVjdGVkVGFnSW5kZXhDaGFuZ2VkKCl7dGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKX0sX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl7Y29uc3QgbT10aGlzLmRhdGFzZXRzLG49dGhpcy5fc2VsZWN0ZWRSdW5JbmRleCxxPXRoaXMuX3NlbGVjdGVkVGFnSW5kZXg7cmV0dXJuIG0mJm1bbl0mJm1bbl0udGFnc1txXSYmCiFtW25dLnRhZ3NbcV0ub3BHcmFwaD9tW25dLnRhZ3NbcV0ucHJvZmlsZT9iLmdyYXBoLlNlbGVjdGlvblR5cGUuUFJPRklMRTptW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBoP2IuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9LF9nZXRGaWxlOmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2ZpbGUiKS5jbGljaygpfSxfc2V0RG93bmxvYWRGaWxlbmFtZTpmdW5jdGlvbihtKXt0aGlzLiQuZ3JhcGhkb3dubG9hZC5zZXRBdHRyaWJ1dGUoImRvd25sb2FkIixtKyIucG5nIil9LF9zdGF0c05vdE51bGw6ZnVuY3Rpb24obSl7cmV0dXJuIG51bGwhPT1tfSxfdG9nZ2xlTGVnZW5kT3Blbigpe3RoaXMuc2V0KCJfbGVnZW5kT3BlbmVkIiwhdGhpcy5fbGVnZW5kT3BlbmVkKX0sX2dldFRvZ2dsZVRleHQobSl7cmV0dXJuIG0/IkNsb3NlIGxlZ2VuZC4iOiJFeHBhbmQgbGVnZW5kLiJ9LApfZ2V0VG9nZ2xlTGVnZW5kSWNvbihtKXtyZXR1cm4gbT8iZXhwYW5kLW1vcmUiOiJleHBhbmQtbGVzcyJ9LF9nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLm9wR3JhcGh9LF9nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLnByb2ZpbGV9LF9nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChtLG4scSl7cmV0dXJuIW1bbl18fCFtW25dLnRhZ3NbcV18fCFtW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBofX0pfSkoZC5jb250cm9sc3x8KGQuY29udHJvbHM9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtbG9hZGVyL3RmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIuanMKVWk9dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGIsZCxmLGgpe3JldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihrLHQpe2Z1bmN0aW9uIGwobil7dHJ5e20oaC5uZXh0KG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBwKG4pe3RyeXttKGhbInRocm93Il0obikpfWNhdGNoKHEpe3QocSl9fWZ1bmN0aW9uIG0obil7bi5kb25lP2sobi52YWx1ZSk6KG5ldyBmKGZ1bmN0aW9uKHEpe3Eobi52YWx1ZSl9KSkudGhlbihsLHApfW0oKGg9aC5hcHBseShiLGR8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlciIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXkscHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0aW9uOk9iamVjdCxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBiLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0saGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Yi5ncmFwaC5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtc30sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0U3RhdHM6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sCl9ncmFwaFJ1blRhZzpPYmplY3R9LG9ic2VydmVyczpbIl9zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbiwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsIl9zZWxlY3RlZEZpbGVDaGFuZ2VkKHNlbGVjdGVkRmlsZSwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9zZWxlY3Rpb25DaGFuZ2VkKCl7dGhpcy5kZWJvdW5jZSgic2VsZWN0aW9uY2hhbmdlIiwoKT0+e3RoaXMuX2xvYWQodGhpcy5zZWxlY3Rpb24pfSl9LF9sb2FkOmZ1bmN0aW9uKGYpe2NvbnN0IGg9Zi5ydW4saz1mLnRhZztmPWYudHlwZTtzd2l0Y2goZil7Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDp0aGlzLl9zZXRPdXRTdGF0cyhudWxsKTt2YXIgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJydW4iLGgpO3Quc2V0KCJjb25jZXB0dWFsIixTdHJpbmcoZj09PWIuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIKSk7CmsmJnQuc2V0KCJ0YWciLGspO2Y9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsdCk7cmV0dXJuIHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZikudGhlbigoKT0+e3RoaXMuX2dyYXBoUnVuVGFnPXtydW46aCx0YWc6a319KTtjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5QUk9GSUxFOnsoe3RhZ3M6Zn09dGhpcy5kYXRhc2V0cy5maW5kKCh7bmFtZTptfSk9Pm09PT1oKSk7Y29uc3QgbD1mLmZpbmQobT0+bS50YWc9PT1rKS5vcEdyYXBoP2s6bnVsbDtjb25zb2xlLmFzc2VydChmLmZpbmQobT0+bS50YWc9PT1sKSxgUmVxdWlyZWQgdGFnICgke2x9KSBpcyBtaXNzaW5nLmApO2Y9dGhpcy5fZ3JhcGhSdW5UYWcmJnRoaXMuX2dyYXBoUnVuVGFnLnJ1bj09PWgmJnRoaXMuX2dyYXBoUnVuVGFnLnRhZz09PWw/UHJvbWlzZS5yZXNvbHZlKCk6dGhpcy5fbG9hZCh7cnVuOmgsdGFnOmwsdHlwZTpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9KTsKdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJ0YWciLGspO3Quc2V0KCJydW4iLGgpO2NvbnN0IHA9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ydW5fbWV0YWRhdGEiLHQpO3JldHVybiBmLnRoZW4oKCk9PnRoaXMuX3JlYWRBbmRQYXJzZU1ldGFkYXRhKHApKX1kZWZhdWx0OnJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihgVW5rbm93biBzZWxlY3Rpb24gdHlwZTogJHtmfWApKX19LF9yZWFkQW5kUGFyc2VNZXRhZGF0YTpmdW5jdGlvbihmKXt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO2IuZ3JhcGgucGFyc2VyLmZldGNoQW5kUGFyc2VNZXRhZGF0YShmLGIuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpKS50aGVuKGg9Pnt0aGlzLl9zZXRPdXRTdGF0cyhoKX0pfSxfZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaDpmdW5jdGlvbihmLGgpe3JldHVybiBVaSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dGhpcy5zZXQoInByb2dyZXNzIiwKe3ZhbHVlOjAsbXNnOiIifSk7cmV0dXJuIGIuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoYi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksZixoLHRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyLHRoaXMuaGllcmFyY2h5UGFyYW1zKS50aGVuKCh7Z3JhcGg6ayxncmFwaEhpZXJhcmNoeTp0fSk9Pnt0aGlzLl9zZXRPdXRHcmFwaChrKTt0aGlzLl9zZXRPdXRHcmFwaEhpZXJhcmNoeSh0KX0pfSl9LF9zZWxlY3RlZEZpbGVDaGFuZ2VkOmZ1bmN0aW9uKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGFzaGJvYXJkL3RmLWdyYXBoLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19kYXRhc2V0czp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9kYXRhc2V0c0ZldGNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3NlbGVjdGVkRGF0YXNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3JlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2RlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhbGxTdGVwc01vZGVFbmFibGVkOkJvb2xlYW4sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCJ9LApzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2lzQXR0YWNoZWQ6Qm9vbGVhbixfaW5pdGlhbGl6ZWQ6Qm9vbGVhbixfYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2hlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLF9oZWFsdGhQaWxsUmVxdWVzdElkOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZDpOdW1iZXIsX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxyZWFkT25seTohMH0scnVuczpBcnJheSxydW46e3R5cGU6U3RyaW5nLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMX0pLG9ic2VydmVyOiJfcnVuT2JzZXJ2ZXIifSwKX3NlbGVjdGlvbjp7dHlwZTpPYmplY3R9LF9jb21wYXRpYmlsaXR5UHJvdmlkZXI6T2JqZWN0LF90cmFjZUlucHV0czpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLXRvZ2dsZS1leHBhbmQiOiJfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCJ9LG9ic2VydmVyczpbIl9tYXliZUZldGNoSGVhbHRoUGlsbHMoX2RlYnVnZ2VyRGF0YUVuYWJsZWQsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIF9zZWxlY3RlZE5vZGUpIiwiX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZChfaXNBdHRhY2hlZCkiLCJfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgcnVuKSIsIl91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgX3NlbGVjdGVkRGF0YXNldCkiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsCiExKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZHx8dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShiPT57Yi5jYW5jZWxsZWR8fGIudmFsdWVbImRlYnVnZ2VyIl0mJnRoaXMuc2V0KCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsITApfSkpO3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfSxfZml0OmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2dyYXBoYm9hcmQiKS5maXQoKX0sX3J1bk9ic2VydmVyOnBkLmdldFN0cmluZ09ic2VydmVyKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIscG9seW1lclByb3BlcnR5OiJydW4iLHVzZUxvY2FsU3RvcmFnZTohMX0pLF9mZXRjaERhdGFzZXQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2luZm8iKSl9LF9mZXRjaEhlYWx0aFBpbGxzKGIsCmQpe2I9e25vZGVfbmFtZXM6SlNPTi5zdHJpbmdpZnkoYikscnVuOiJfX2RlYnVnZ2VyX2RhdGFfXyJ9O3ZvaWQgMCE9PWQmJihiLnN0ZXA9ZCk7ZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvaGVhbHRoX3BpbGxzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCxiKX0sX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9udW1lcmljc19hbGVydF9yZXBvcnQiKSl9LF9ncmFwaFVybChiLGQsZil7cmV0dXJuIHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3J1bjpiLGxpbWl0X2F0dHJfc2l6ZTpkLGxhcmdlX2F0dHJzX2tleTpmfSkpfSxfc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQmJgp0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZ0aGlzLl9yZW5kZXJIaWVyYXJjaHkmJnRoaXMuX2RhdGFzZXRzU3RhdGUodGhpcy5fZGF0YXNldHNGZXRjaGVkLHRoaXMuX2RhdGFzZXRzLCJQUkVTRU5UIil9LF9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQ6ZnVuY3Rpb24oYil7IXRoaXMuX2luaXRpYWxpemVkJiZiJiYodGhpcy5zZXQoIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLG5ldyB0Zi5ncmFwaC5vcC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXIpLHRoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX2ZldGNoRGF0YXNldCgpLnRoZW4oZD0+e3RoaXMuX2RhdGFzZXRzPU9iamVjdC5rZXlzKGQpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAoZj0+e2NvbnN0IGg9ZFtmXTt2YXIgaz1PYmplY3Qua2V5cyhoLnRhZ3MpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAodD0+aC50YWdzW3RdKS5tYXAoKHt0YWc6dCxjb25jZXB0dWFsX2dyYXBoOmwsb3BfZ3JhcGg6cCxwcm9maWxlOm19KT0+Cih7dGFnOnQsZGlzcGxheU5hbWU6dCxjb25jZXB0dWFsR3JhcGg6bCxvcEdyYXBoOnAscHJvZmlsZTptfSkpO2s9aC5ydW5fZ3JhcGg/W3t0YWc6bnVsbCxkaXNwbGF5TmFtZToiRGVmYXVsdCIsY29uY2VwdHVhbEdyYXBoOiExLG9wR3JhcGg6ITAscHJvZmlsZTohMX0sLi4ua106aztyZXR1cm57bmFtZTpmLHRhZ3M6a319KTt0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITB9KSl9LF9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoYixkLGYpe2Y/KGQ9ZC5maW5kSW5kZXgoaD0+aC5uYW1lPT09ZiksLTE9PT1kP2ImJihiPXRoaXMuJCQoIiNlcnJvci1kaWFsb2ciKSxiLnRleHRDb250ZW50PWBObyBkYXRhc2V0IG5hbWVkICIke2Z9IiBjb3VsZCBiZSBmb3VuZC5gLGIub3BlbigpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsZCkpOnRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IiwwKX0sX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoYixkLGYpe2ImJihkLmxlbmd0aDw9Znx8dGhpcy5zZXQoInJ1biIsCmRbZl0ubmFtZSkpfSxfcmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCEwKTt2YXIgYj0rK3RoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQ7bnVsbCE9PXRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbCk7dGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbDt0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMoYil9LmJpbmQodGhpcyksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSk6dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGIpfSwKX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxsczpmdW5jdGlvbihiKXtpZih0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkPT09Yil7dmFyIGQ9dGhpcy5fZmV0Y2hIZWFsdGhQaWxscyh0aGlzLl9yZW5kZXJIaWVyYXJjaHkuZ2V0TmFtZXNPZlJlbmRlcmVkT3BzKCksdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp2b2lkIDApLGY9dGhpcy5fZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCk7UHJvbWlzZS5hbGwoW2QsZl0pLnRoZW4oZnVuY3Rpb24oaCl7dmFyIGs9aFswXTtoPWhbMV07aWYodGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmYj09PXRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQpe2Zvcih2YXIgdCBpbiBrKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwSW5kZXgiLGtbdF0ubGVuZ3RoLTEpO2JyZWFrfXRoaXMuc2V0KCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIixoKTt0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLAprKTt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITEpO3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCIsbnVsbCl9fS5iaW5kKHRoaXMpKX19LF9kYXRhc2V0c1N0YXRlOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gYj9kJiZkLmxlbmd0aD8iUFJFU0VOVCI9PT1mOiJFTVBUWSI9PT1mOiJOT1RfTE9BREVEIj09PWZ9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVsb2FkKCk6dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix7fSl9LF9tYXliZUZldGNoSGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSYmdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotZGlzdHJpYnV0aW9uLWNoYXJ0L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC5qcwp2YXIgSms7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsaCl7dGhpcy5ydW4yZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPWg7dGhpcy5idWlsZENoYXJ0KGYpfWdldERhdGFzZXQoZil7dm9pZCAwPT09dGhpcy5ydW4yZGF0YXNldHNbZl0mJih0aGlzLnJ1bjJkYXRhc2V0c1tmXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se3J1bjpmfSkpO3JldHVybiB0aGlzLnJ1bjJkYXRhc2V0c1tmXX1idWlsZENoYXJ0KGYpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpO2Y9cmcuZ2V0WENvbXBvbmVudHMoZik7dGhpcy54QWNjZXNzb3I9Zi5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1mLnNjYWxlO3RoaXMueEF4aXM9Zi5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7dGhpcy55U2NhbGU9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3RoaXMueUF4aXM9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtmPQpyZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihmKTt0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCk7Zj10aGlzLmJ1aWxkUGxvdCh0aGlzLnhBY2Nlc3Nvcix0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxmXSk7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChmLGgsayl7bGV0IHQ9WzAsMjI4LDE1ODcsMzA4NSw1RTMsNjkxNSw4NDEzLDk3NzIsMUU0XSxsPV8ucmFuZ2UodC5sZW5ndGgtCjEpLm1hcCh1PT4odFt1KzFdLXRbdV0pLzI1MDApLHA9dC5tYXAoKHUseCk9PkE9PkFbeF1bMV0pLG09cFs0XSxuPV8ucmFuZ2UocC5sZW5ndGgtMSkubWFwKHU9PntsZXQgeD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWE7eC54KGYsaCk7bGV0IEE9NDx1P3BbdV06cFt1KzFdO3gueSg0PHU/cFt1KzFdOnBbdV0sayk7eC55MChBKTt4LmF0dHIoImZpbGwiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2UiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2Utd2VpZ2h0IiwoKT0+IjAuNXB4Iik7eC5hdHRyKCJzdHJva2Utb3BhY2l0eSIsKCk9PmxbdV0pO3guYXR0cigiZmlsbC1vcGFjaXR5IiwoKT0+bFt1XSk7cmV0dXJuIHh9KSxxPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtxLngoZixoKTtxLnkobSxrKTtxLmF0dHIoInN0cm9rZSIsKHUseCxBKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEEucnVuKSk7CnRoaXMucGxvdHM9bjtyZXR1cm4gbmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKG4pfXNldFZpc2libGVTZXJpZXMoZil7dGhpcy5ydW5zPWY7bGV0IGg9Zi5tYXAoaz0+dGhpcy5nZXREYXRhc2V0KGspKTt0aGlzLnBsb3RzLmZvckVhY2goaz0+ay5kYXRhc2V0cyhoKSl9c2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuZ2V0RGF0YXNldChmKS5kYXRhKGgpfXJlbmRlclRvKGYpe3RoaXMudGFyZ2V0U1ZHPWY7dGhpcy5vdXRlci5yZW5kZXJUbyhmKX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19Yi5EaXN0cmlidXRpb25DaGFydD1kO1BvbHltZXIoe2lzOiJ2ei1kaXN0cmlidXRpb24tY2hhcnQiLHByb3BlcnRpZXM6e2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKX19LHhUeXBlOnt0eXBlOlN0cmluZywKdmFsdWU6InN0ZXAifSxfYXR0YWNoZWQ6Qm9vbGVhbixfY2hhcnQ6T2JqZWN0LF92aXNpYmxlU2VyaWVzQ2FjaGU6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX21ha2VDaGFydCh4VHlwZSwgY29sb3JTY2FsZSwgX2F0dGFjaGVkKSIsIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0KSJdLHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oZil7dGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWY7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKGYpLHRoaXMucmVkcmF3KCkpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGYsaCl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2ZdPWg7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZiwKaCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0LnJlZHJhdygpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LF9tYWtlQ2hhcnQ6ZnVuY3Rpb24oZixoLGspe251bGw9PT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJnRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGspe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dmFyIHQ9bmV3IGQoZixoKSxsPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO3QucmVuZGVyVG8obCk7dGhpcy5fY2hhcnQ9dH19LDM1MCl9LF9yZWxvYWRGcm9tQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSwKdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goZnVuY3Rpb24oZil7dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShmLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtmXXx8W10pfS5iaW5kKHRoaXMpKSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9fSl9KShKa3x8KEprPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QseFR5cGU6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmJ9KT0+Yn0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmIscnVuOmR9KT0+dmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwiL2Rpc3RyaWJ1dGlvbnMiKSx7dGFnOmIscnVuOmR9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQsZik9PntiPWYubWFwKGg9Pntjb25zdCBbayx0LGxdPWg7bC53YWxsX3RpbWU9bmV3IERhdGUoMUUzKmspO2wuc3RlcD10O3JldHVybiBsfSk7CmQ9dGhpcy5nZXREYXRhTG9hZE5hbWUoZCk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoZCxiKTt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhbZF0pfX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2FsZTpwZi5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnNjYWxlKGIpfSwKcmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e194VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWREaXN0cmlidXRpb25zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLAoiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkRGlzdHJpYnV0aW9ucygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9LF90YWdNZXRhZGF0YShiLApkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToib2Zmc2V0In0sdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LGJpbnM6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5zIn0seDp7dHlwZTpTdHJpbmcsdmFsdWU6IngifSxkeDp7dHlwZTpTdHJpbmcsdmFsdWU6ImR4In0seTp7dHlwZTpTdHJpbmcsdmFsdWU6InkifSxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxtb2RlVHJhbnNpdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTo1MDB9LF9hdHRhY2hlZDpCb29sZWFuLF9uYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsicmVkcmF3KHRpbWVQcm9wZXJ0eSwgX2F0dGFjaGVkKSIsIl9tb2RlUmVkcmF3KG1vZGUpIl0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLnN2ZywhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oYixkKXt0aGlzLl9uYW1lPWI7dGhpcy5fZGF0YT1kO3RoaXMucmVkcmF3KCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2RyYXcoMCl9LF9tb2RlUmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdyh0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24pfSxfZHJhdzpmdW5jdGlvbihiKXtpZih0aGlzLl9hdHRhY2hlZCYmdGhpcy5fZGF0YSl7aWYodm9pZCAwPT09Yil0aHJvdyBFcnJvcigidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgX2RyYXcgbmVlZHMgZHVyYXRpb24iKTtpZigwPj10aGlzLl9kYXRhLmxlbmd0aCl0aHJvdyBFcnJvcigiTm90IGVub3VnaCBzdGVwcyBpbiB0aGUgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgRXJyb3IoIk5vIGJpbnMgcHJvcGVydHkgb2YgJyIrCnRoaXMuYmlucysiJyBpbiBkYXRhIik7aWYoMD49dGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdLmxlbmd0aCl0aHJvdyBFcnJvcigiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBiaW4gaW4gYmlucyBpbiBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLngpKXRocm93IEVycm9yKCJObyB4IHByb3BlcnR5ICciK3RoaXMueCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMuZHgpKXRocm93IEVycm9yKCJObyBkeCBwcm9wZXJ0eSAnIit0aGlzLmR4KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy55KSl0aHJvdyBFcnJvcigiTm8geSBwcm9wZXJ0eSAnIit0aGlzLnkrIicgb24gYmlucyBkYXRhIik7dmFyIGQ9dGhpcy50aW1lUHJvcGVydHksZj10aGlzLngsaD10aGlzLmJpbnMsaz10aGlzLmR4LAp0PXRoaXMueSxsPXRoaXMuX2RhdGEscD10aGlzLm1vZGUsbT1kMy5oY2wodGhpcy5jb2xvclNjYWxlKHRoaXMuX25hbWUpKSxuPWQzLnNlbGVjdCh0aGlzLiQudG9vbHRpcCkscT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2ZdfSx1PWZ1bmN0aW9uKHlhKXtyZXR1cm4geWFbdF19LHg9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXX0sQT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2RdfTsicmVsYXRpdmUiPT09ZCYmKEE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YS53YWxsX3RpbWUtbFswXS53YWxsX3RpbWV9KTt2YXIgeT10aGlzLiQuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHc9eS53aWR0aCxDPXkuaGVpZ2h0LEc9NTtpZigib2Zmc2V0Ij09PXApe3ZhciBEPUMvMi41O0c9RCs1fWVsc2UgRD1DLUctMjA7dmFyIEI9dy0yNC02MCxJPUMtRy0yMDtkMy5taW4obCxxKTtkMy5tYXgobCx4KTt2YXIgTj1kMy5mb3JtYXQoIi4zbiIpO3k9ZDMuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PQpkP3k9ZDMudGltZUZvcm1hdCgiJW0vJWQgJVgiKToicmVsYXRpdmUiPT09ZCYmKHk9ZnVuY3Rpb24oeWEpe3JldHVybiBkMy5mb3JtYXQoIi4xciIpKHlhLzM2RTUpKyJoIn0pO3ZhciBPPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm5bZDMubWluKHlhW2hdLHEpLGQzLm1heCh5YVtoXSx4KV19KSxIPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm4gZDMuZXh0ZW50KHlhW2hdLHUpfSksSz1kMy5leHRlbnQobCxBKSxNPSgid2FsbF90aW1lIj09PWQ/ZDMuc2NhbGVUaW1lKCk6ZDMuc2NhbGVMaW5lYXIoKSkuZG9tYWluKEspLnJhbmdlKFswLCJvZmZzZXQiPT09cD9JOjBdKSxMPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLGQzLm1heChsLGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gSFtTYV1bMV19KV0pLnJhbmdlKFtELDBdKSxRPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKEwuZG9tYWluKCkpLnJhbmdlKFs1MDAsMF0pLFQ9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW2QzLm1pbihsLGZ1bmN0aW9uKHlhLApTYSl7cmV0dXJuIE9bU2FdWzBdfSksZDMubWF4KGwsZnVuY3Rpb24oeWEsU2Epe3JldHVybiBPW1NhXVsxXX0pXSkubmljZSgpLnJhbmdlKFswLEJdKSxYPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFQuZG9tYWluKCkpLnJhbmdlKFswLDUwMF0pLGFhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGQzLmV4dGVudChsLEEpKS5yYW5nZShbbS5kYXJrZXIoKSxtLmJyaWdodGVyKCldKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUhjbCk7bT1kMy5heGlzQm90dG9tKFQpLnRpY2tzKCk7dmFyIGxhPWQzLmF4aXNSaWdodChNKS50aWNrcygpLnRpY2tGb3JtYXQoeSksWj1kMy5heGlzUmlnaHQoTCkudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoTiksYmE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXS8yfSxlYT1kMy5saW5lKCkueChmdW5jdGlvbih5YSl7cmV0dXJuIFgoYmEoeWEpKX0pLnkoZnVuY3Rpb24oeWEpe3JldHVybiBRKHlhW3RdKX0pLGNhPWZ1bmN0aW9uKHlhKXtyZXR1cm4iTSIrClgoYmEoeWFbMF0pKSsiLCIrUSgwKSsiTCIrZWEoeWEpLnNsaWNlKDEpKyJMIitYKGJhKHlhW3lhLmxlbmd0aC0xXSkpKyIsIitRKDApfSxrYT10aGlzLiQuc3ZnO3k9ZDMuc2VsZWN0KGthKTtiPXkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGIpO3k9eS5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTtiPWIuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRysiKSIpO3ZhciBZPWQzLmJpc2VjdG9yKHgpLmxlZnQ7Sz15LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YS5zdHlsZSgib3BhY2l0eSIsMSk7eGEuc3R5bGUoIm9wYWNpdHkiLDEpO0FhLnN0eWxlKCJvcGFjaXR5IiwxKTtGYS5zdHlsZSgib3BhY2l0eSIsCjEpO24uc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt4YS5zdHlsZSgib3BhY2l0eSIsMCk7QWEuc3R5bGUoIm9wYWNpdHkiLDApO0ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt2YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO24uc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB5YShBYil7cmV0dXJuIE1hdGgubWluKEFiW2hdLmxlbmd0aC0xLFkoQWJbaF0sWGEpKX12YXIgU2E9ZDMubW91c2UodGhpcyksWGE9VC5pbnZlcnQoU2FbMF0pO00uaW52ZXJ0KFNhWzFdKTt2YXIgdWIsQmI9SW5maW5pdHkscWI7dmEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtxYj1BYjt2YXIgaWM9VChBYltoXVtIYl1bZl0rQWJbaF1bSGJdW2tdLzIpO0hiPUwoQWJbaF1bSGJdW3RdKTt2YXIgYmM9CiJvZmZzZXQiPT09cD9NKEEoQWIpKS0oRC1IYik6SGI7YmM9TWF0aC5hYnMoU2FbMV0tYmMpO2JjPEJiJiYoQmI9YmMsdWI9QWIpO3JldHVybiJ0cmFuc2xhdGUoIitpYysiLCIrSGIrIikifSk7dmEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtyZXR1cm4gQWJbaF1bSGJdW3RdfSk7dmEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7dmFyIHpiPXlhKHFiKTt4YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1QocWJbaF1bemJdW2ZdK3FiW2hdW3piXVtrXS8yKSsiLCAiK0krIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBOKHFiW2hdW3piXVtmXStxYltoXVt6Yl1ba10vMil9KTt2YXIgdmI9bGEudGlja0Zvcm1hdCgpO0FhLmF0dHIoInRyYW5zZm9ybSIsCmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wP00oQSh1YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXA/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIHZiKEEodWIpKX0pO3ZhciBHYj1aLnRpY2tGb3JtYXQoKTtGYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6TCh1YltoXVt6Yl1bdF0pKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1wPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBHYih1YltoXVt6Yl1bdF0pfSk7dmFyIE5iPWQzLm1vdXNlKGthKTtuLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoTmJbMF0rMTUpKyJweCwiKyhOYlsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT1wP0diKHViW2hdW3piXVt0XSk6Cigic3RlcCI9PT1kPyJzdGVwICI6IiIpK3ZiKEEodWIpKSl9KTtLLnNlbGVjdCgiLmJhY2tncm91bmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTI0LCIrLUcrIikiKS5hdHRyKCJ3aWR0aCIsdykuYXR0cigiaGVpZ2h0IixDKTtDPUsuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShsKTtDLmV4aXQoKS5yZW1vdmUoKTt3PUMuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpO0M9dy5tZXJnZShDKS5zb3J0KGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gQSh5YSktQShTYSl9KTtHPWIuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih5YSl7cmV0dXJuInRyYW5zbGF0ZSgwLCAiKygib2Zmc2V0Ij09PXA/TShBKHlhKSktRDowKSsiKSJ9KTt3LmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwiYmFzZWxpbmUiKTtHLnNlbGVjdCgiLmJhc2VsaW5lIikuc3R5bGUoInN0cm9rZS1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09CnA/LjE6MH0pLmF0dHIoInkxIixEKS5hdHRyKCJ5MiIsRCkuYXR0cigieDIiLEIpO3cuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIEVhPUMuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIixmdW5jdGlvbih5YSl7cmV0dXJuIGNhKHlhW2hdKX0pLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpO0cuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInRyYW5zZm9ybSIsInNjYWxlKCIrQi81MDArIiwgIitELzUwMCsiKSIpLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKHlhKXtyZXR1cm4ib2Zmc2V0Ij09PXA/IndoaXRlIjphYShBKHlhKSl9KS5zdHlsZSgiZmlsbC1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09cD8xOjB9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt3PXcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJob3ZlciIpLnN0eWxlKCJmaWxsIiwKZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt2YXIgdmE9Qy5zZWxlY3QoIi5ob3ZlciIpO3cuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKTt3LmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt3PXkuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKTtDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIHhhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNik7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeSIsMTgpO3c9eS5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pOwpDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIEFhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KTtDLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsNikuYXR0cigieTEiLDApLmF0dHIoInkyIiwwKTtDLmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7eT15LnNlbGVjdCgiLnktc2xpY2UtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbInkiXSk7dz15LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBGYT15Lm1lcmdlKHcpO3cuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7dy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwKMCkuYXR0cigieTIiLDApO3cuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTtiLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXA/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1wPy1EOjApKyIpIikuY2FsbChaKTtiLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCAiK0krIikiKS5jYWxsKG0pO2Iuc2VsZWN0KCIueS5heGlzIikuc3R5bGUoIm9wYWNpdHkiLCJvZmZzZXQiPT09cD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6SSkrIikiKS5jYWxsKGxhKTtiLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIik7Yi5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL2hpc3RvZ3JhbUNvcmUuanMKdmFyIEtrOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChoKXtjb25zdCBbayx0LGxdPWg7cmV0dXJue3dhbGxfdGltZTprLHN0ZXA6dCxtaW46ZDMubWluKGwubWFwKChbcF0pPT5wKSksbWF4OmQzLm1heChsLm1hcCgoWyxwXSk9PnApKSxidWNrZXRzOmwubWFwKChbcCxtLG5dKT0+KHtsZWZ0OnAscmlnaHQ6bSxjb3VudDpufSkpfX1mdW5jdGlvbiBmKGgsayx0LGw9MzApe3Q9PT1rJiYodD0xLjEqaysxLGs9ay8xLjEtMSk7Y29uc3QgcD0odC1rKS9sO2xldCBtPTA7cmV0dXJuIGQzLnJhbmdlKGssdCxwKS5tYXAobj0+e2NvbnN0IHE9bitwO2xldCB1PTA7Zm9yKDttPGguYnVja2V0cy5sZW5ndGg7KXtjb25zdCBBPU1hdGgubWluKHQsaC5idWNrZXRzW21dLnJpZ2h0KTt2YXIgeD1NYXRoLm1heChrLGguYnVja2V0c1ttXS5sZWZ0KTtjb25zdCB5PU1hdGgubWluKEEscSktTWF0aC5tYXgoeCxuKTt4PXkvKEEteCkqaC5idWNrZXRzW21dLmNvdW50O3UrPTA8eT94OjA7aWYoQT5xKWJyZWFrO20rK31yZXR1cm57eDpuLApkeDpwLHk6dX19KX1iLmJhY2tlbmRUb0ludGVybWVkaWF0ZT1kO2IuaW50ZXJtZWRpYXRlVG9EMz1mO2IuYmFja2VuZFRvVno9ZnVuY3Rpb24oaCl7aD1oLm1hcChkKTtjb25zdCBrPWQzLm1pbihoLGw9PmwubWluKSx0PWQzLm1heChoLGw9PmwubWF4KTtyZXR1cm4gaC5tYXAobD0+KHt3YWxsX3RpbWU6bC53YWxsX3RpbWUsc3RlcDpsLnN0ZXAsYmluczpmKGwsayx0KX0pKX19KShLa3x8KEtrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhdGFUb0xvYWQocnVuLCB0YWcpIn0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3J1bjpifSk9PmJ9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3RhZzpiLHJ1bjpkfSk9PnZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi9oaXN0b2dyYW1zIikse3RhZzpiLHJ1bjpkfSl9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Yj1Lay5iYWNrZW5kVG9WeihmKTtkPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGQpO3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGQsYil9fX0sdGFnTWV0YWRhdGE6T2JqZWN0LHRpbWVQcm9wZXJ0eTpTdHJpbmcsCmhpc3RvZ3JhbU1vZGU6U3RyaW5nLF9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5wZi5ydW5zQ29sb3JTY2FsZX0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnLCByZXF1ZXN0TWFuYWdlcikiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oYil9LHJlZHJhdygpe3RoaXMuJC5jaGFydC5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvdGYtaGlzdG9ncmFtLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfaGlzdG9ncmFtTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZnNldCJ9LF90aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWc6T2JqZWN0LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfcmVzdGFtcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWcsIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfX0sbGlzdGVuZXJzOnsiY29udGVudC12aXNpYmlsaXR5LWNoYW5nZWQiOiJfcmVkcmF3Q2F0ZWdvcnlQYW5lIn0sCl9yZWRyYXdDYXRlZ29yeVBhbmUoYixkKXtkJiZiLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaChmPT5mLnJlZHJhdygpKX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkSGlzdG9ncmFtcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT4Ke3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7cmV0dXJuICRjLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYixkLGYpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3RleHRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9fSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90ZXh0Iikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW59KSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fAooZj1mLnZhbHVlLm1hcChoPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqaC53YWxsX3RpbWUpLHN0ZXA6aC5zdGVwLHRleHQ6aC50ZXh0fSkpLHRoaXMuc2V0KCJfdGV4dHMiLGYuc2xpY2UoKS5yZXZlcnNlKCkpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2Zvcm1hdFN0ZXAoYil7cmV0dXJuIGQzLmZvcm1hdCgiLCIpKGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRUZXh0cygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT4Ke2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZykpe3ZhciBmPXZjLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZFRleHRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXRleHQtbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGIsZCxmKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHRhZzpTdHJpbmcsdGFnTWV0YWRhdGE6T2JqZWN0LHJ1blRvU3RlcENhcDpPYmplY3QscmVxdWVzdE1hbmFnZXI6T2JqZWN0LGFjdGl2ZTpCb29sZWFuLF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3J1blRvUHJDdXJ2ZUVudHJ5Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnk6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTdGVwQXZhaWxhYmxlOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU3RlcEF2YWlsYWJsZShydW5zLCBfcnVuVG9QckN1cnZlRW50cnkpIn0sX3NldE9mUmVsZXZhbnRSdW5zOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXRPZlJlbGV2YW50UnVucyhfcnVuc1dpdGhTdGVwQXZhaWxhYmxlKSJ9LF9ydW5Ub0RhdGFPdmVyVGltZTpPYmplY3QsCl9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfYXR0YWNoZWQ6Qm9vbGVhbixfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PigpPT57Y29uc3QgYj1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmIsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhiLCJib3R0b20iKSxhY2Nlc3NvcjpkPT5kLnJlY2FsbH19fSxfeVZhbHVlQWNjZXNzb3I6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT5iPT5iLnByZWNpc2lvbn0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLHZhbHVlOigpPT57Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSwKZD1mPT5pc05hTihmKT8iTmFOIjpiKGYpO3JldHVyblt7dGl0bGU6IlJ1biIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJUaHJlc2hvbGQiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS50aHJlc2hvbGRzKX0se3RpdGxlOiJQcmVjaXNpb24iLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5wcmVjaXNpb24pfSx7dGl0bGU6IlJlY2FsbCIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnJlY2FsbCl9LHt0aXRsZToiVFAiLGV2YWx1YXRlOmY9PmYuZGF0dW0udHJ1ZV9wb3NpdGl2ZXN9LHt0aXRsZToiRlAiLGV2YWx1YXRlOmY9PmYuZGF0dW0uZmFsc2VfcG9zaXRpdmVzfSx7dGl0bGU6IlROIixldmFsdWF0ZTpmPT5mLmRhdHVtLnRydWVfbmVnYXRpdmVzfSx7dGl0bGU6IkZOIixldmFsdWF0ZTpmPT5mLmRhdHVtLmZhbHNlX25lZ2F0aXZlc31dfX0sX3Nlcmllc0RhdGFGaWVsZHM6e3R5cGU6QXJyYXksdmFsdWU6InRocmVzaG9sZHMgcHJlY2lzaW9uIHJlY2FsbCB0cnVlX3Bvc2l0aXZlcyBmYWxzZV9wb3NpdGl2ZXMgdHJ1ZV9uZWdhdGl2ZXMgZmFsc2VfbmVnYXRpdmVzIi5zcGxpdCgiICIpLApyZWFkT25seTohMH0sX2RlZmF1bHRYUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kZWZhdWx0WVJhbmdlOnt0eXBlOkFycmF5LHZhbHVlOlstLjA1LDEuMDVdLHJlYWRPbmx5OiEwfSxfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLnRhZztyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvcHJfY3VydmVzIikse3RhZzpkLHJ1bjpifSl9fX0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbG9hZChydW5zLCB0YWcpIiwiX3NldENoYXJ0RGF0YShfcnVuVG9QckN1cnZlRW50cnksIF9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5LCBfc2V0T2ZSZWxldmFudFJ1bnMpIiwiX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KF9ydW5Ub0RhdGFPdmVyVGltZSwgcnVuVG9TdGVwQ2FwKSJdLApfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihiLGQsZik9Pnt0aGlzLnNldCgiX3J1blRvRGF0YU92ZXJUaW1lIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLGYpKX19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbi5zY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDA9PT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KTp0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCkpfSxfc2V0Q2hhcnREYXRhKGIsZCxmKXtfLmZvck93bihiLChoLGspPT57Y29uc3QgdD1kW2tdO3QmJmJba10uc3RlcD09PXQuc3RlcHx8KGZba10/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihrLGgpOnRoaXMuX2NsZWFyU2VyaWVzRGF0YShrKSl9KX0sCl91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGIsZCl7Y29uc3QgZj1fLnJlZHVjZSh0aGlzLl9zZXJpZXNEYXRhRmllbGRzLChrLHQpPT57a1t0XT1kW3RdLnNsaWNlKCkucmV2ZXJzZSgpO3JldHVybiBrfSx7fSksaD1BcnJheShmW3RoaXMuX3Nlcmllc0RhdGFGaWVsZHNbMF1dLmxlbmd0aCk7Zm9yKGxldCBrPTA7azxoLmxlbmd0aDtrKyspaFtrXT1fLm1hcFZhbHVlcyhmLHQ9PnRba10pO3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5zZXRTZXJpZXNEYXRhKGIsaCl9LF9jbGVhclNlcmllc0RhdGEoYil7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnNldFNlcmllc0RhdGEoYixbXSl9LF91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeShiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oYiwoaCxrKT0+e2gmJmgubGVuZ3RoJiYoZltrXT10aGlzLl9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChkW2tdLGgpKX0pO3RoaXMuc2V0KCJfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSIsCnRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KTt0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixmKX0sX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKGIsZCl7Yj1NYXRoLm1pbihfLnNvcnRlZEluZGV4KGQubWFwKGY9PmYuc3RlcCksYiksZC5sZW5ndGgtMSk7cmV0dXJuIGRbYl19LF9jb21wdXRlUnVuc1dpdGhTdGVwQXZhaWxhYmxlKGIsZCl7cmV0dXJuIF8uZmlsdGVyKGIsZj0+ZFtmXSkuc29ydCgpfSxfY29tcHV0ZVNldE9mUmVsZXZhbnRSdW5zKGIpe2NvbnN0IGQ9e307Xy5mb3JFYWNoKGIsZj0+e2RbZl09ITB9KTtyZXR1cm4gZH0sX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pP2Iuc3RlcDpudWxsfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pPyhuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKS50b1N0cmluZygpOm51bGx9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLAohdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF9yZXNldERvbWFpbigpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZXNldERvbWFpbigpfSxyZWRyYXcoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXM6T2JqZWN0LHJ1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVJ1blRvU3RlcChydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgpIn0sdGltZURpc3BsYXlUeXBlOlN0cmluZyxfcnVuVG9TdGVwSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTbGlkZXJzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU2xpZGVycyhydW5zLCBydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKSJ9fSxvYnNlcnZlcnM6WyJfdXBkYXRlU3RlcHNGb3JOZXdSdW5zKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMpIl0sX2NvbXB1dGVDb2xvckZvclJ1bihiKXtyZXR1cm4gcGYucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlVGltZVRleHRGb3JSdW4oYiwKZCxmLGgpe2Q9ZFtmXTtpZighXy5pc051bWJlcihkKSlyZXR1cm4iIjtiPWJbZl07aWYoIWIpcmV0dXJuIiI7Yj1iW2RdW2hdO2lmKCJzdGVwIj09PWgpcmV0dXJuYHN0ZXAgJHtifWA7aWYoInJlbGF0aXZlIj09PWgpcmV0dXJuIDE+Yj9gJHsoMUUzKmIpLnRvRml4ZWQoMil9IG1zYDpgJHtiLnRvRml4ZWQoMil9IHNgO2lmKCJ3YWxsX3RpbWUiPT09aClyZXR1cm4obmV3IERhdGUoMUUzKmIpKS50b1N0cmluZygpO3Rocm93IEVycm9yKGBUaGUgZGlzcGxheSB0eXBlIG9mICR7aH0gaXMgbm90IHJlY29nbml6ZWQuYCk7fSxfc2xpZGVyVmFsdWVDaGFuZ2VkKGIpe2NvbnN0IGQ9Yi50YXJnZXQuZGF0YXNldC5ydW4sZj1iLnRhcmdldC5pbW1lZGlhdGVWYWx1ZSxoPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO2lzTmFOKGYpP2RlbGV0ZSBoW2RdOmhbZF09Yi50YXJnZXQuaW1tZWRpYXRlVmFsdWU7dGhpcy5fcnVuVG9TdGVwSW5kZXg9aH0sX2NvbXB1dGVNYXhTdGVwSW5kZXhGb3JSdW4oYiwKZCl7cmV0dXJuKGI9YltkXSkmJmIubGVuZ3RoP2IubGVuZ3RoLTE6MH0sX3VwZGF0ZVN0ZXBzRm9yTmV3UnVucyhiKXtjb25zdCBkPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO18uZm9yT3duKGIsKGYsaCk9PntfLmlzTnVtYmVyKGRbaF0pfHwoZFtoXT1mLmxlbmd0aC0xKX0pO3RoaXMuX3J1blRvU3RlcEluZGV4PWR9LF9nZXRTdGVwKGIsZCl7cmV0dXJuIHRoaXMuX3J1blRvU3RlcEluZGV4P3RoaXMuX3J1blRvU3RlcEluZGV4W2RdOjB9LF9jb21wdXRlUnVuVG9TdGVwKGIsZCl7Y29uc3QgZj17fTtfLmZvck93bihkLChoLGspPT57Y29uc3QgdD1iW2tdO3QmJihmW2tdPXRbaF0uc3RlcCl9KTtyZXR1cm4gZn0sX2NvbXB1dGVSdW5zV2l0aFNsaWRlcnMoYixkKXtyZXR1cm4gYi5maWx0ZXIoZj0+ZFtmXSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190aW1lRGlzcGxheVR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9yZWxldmFudFNlbGVjdGVkUnVuczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSZWxldmFudFNlbGVjdGVkUnVucyhfc2VsZWN0ZWRSdW5zLCBfcnVuVG9UYWdJbmZvKSJ9LF9ydW5zV2l0aFByQ3VydmVEYXRhOkFycmF5LF9ydW5Ub1N0ZXA6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sCl9nZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PmIudGFnfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7UHJvbWlzZS5hbGwoW3RoaXMuX2ZldGNoVGFncygpLHRoaXMuX2ZldGNoVGltZUVudHJpZXNQZXJSdW4oKV0pLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDYXJkcygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5fLmtleXMoaCkpOwpmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9mZXRjaFRpbWVFbnRyaWVzUGVyUnVuKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL2F2YWlsYWJsZV90aW1lX2VudHJpZXMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntfLmZvck93bihkLGY9PntfLmZvckVhY2goZixoPT57aC5yZWxhdGl2ZT1oLndhbGxfdGltZS1mWzBdLndhbGxfdGltZX0pfSk7dGhpcy5zZXQoIl9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzIixkKTtkPV8ua2V5cyhkKS5zbGljZSgpLnNvcnQoKTtfLmlzRXF1YWwoZCx0aGlzLl9ydW5zV2l0aFByQ3VydmVEYXRhKXx8dGhpcy5zZXQoIl9ydW5zV2l0aFByQ3VydmVEYXRhIiwKZCl9KX0sX3JlbG9hZENhcmRzKCl7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1wci1jdXJ2ZS1jYXJkIiksYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtiPV8ubWFwVmFsdWVzKGIsaD0+T2JqZWN0LmtleXMoaCkpO3JldHVybiAkYy5jYXRlZ29yaXplVGFncyhiLGQsZil9LF9jb21wdXRlQ29sb3JGb3JSdW4oYil7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfSxfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKGIsZCl7cmV0dXJuIGIuZmlsdGVyKGY9PmRbZl0pfSxfdGFnTWV0YWRhdGEoYixkLGYpe2NvbnN0IGg9e307ZC5mb3JFYWNoKGs9PntoW2tdPWJba11bZl19KTtkPWYucmVwbGFjZSgvXC9wcl9jdXJ2ZXMkLywiIik7cmV0dXJuIHJmLmFnZ3JlZ2F0ZVRhZ0luZm8oaCxkKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZCIscHJvcGVydGllczp7X2luc3RhbGxDb21tYW5kOnt0eXBlOlN0cmluZyxyZWFkT25seTohMCx2YWx1ZToicGlwIGluc3RhbGwgLVUgdGVuc29yYm9hcmRfcGx1Z2luX3Byb2ZpbGUifX0sX2NvcHlJbnN0YWxsQ29tbWFuZCgpe2NvbnN0IGI9dGhpcztyZXR1cm4gaGMoZnVuY3Rpb24qKCl7Y29uc3QgZD0oKT0+aGMoZnVuY3Rpb24qKCl7Yi4kLmNvbW1hbmRUZXh0YXJlYS5zZWxlY3QoKTt0cnl7eWllbGQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYi5faW5zdGFsbENvbW1hbmQpfWNhdGNoKGYpe2lmKCFkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpKXJldHVybiBQcm9taXNlLnJlamVjdCgpfX0pO3RyeXt5aWVsZCBkKCksYi4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSJDb3BpZWQuIn1jYXRjaChmKXtiLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IkZhaWxlZCB0byBjb3B5IHRvIGNsaXBib2FyZC4ifX0pfSwKX3JlbW92ZUNvcGllZE1lc3NhZ2UoKXt0aGlzLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3BsdWdpbi1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcGx1Z2luLWRpYWxvZyIscHJvcGVydGllczp7X3RpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY3VzdG9tTWVzc2FnZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29wZW46e3R5cGU6Qm9vbGVhbn0sX2hpZGRlbjp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhpZGRlbihfb3BlbikiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3VzZU5hdGl2ZUJhY2tkcm9wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9fSxvcGVuTm9UZW5zb3JGbG93RGlhbG9nKCl7dGhpcy5vcGVuRGlhbG9nKCJUaGlzIHBsdWdpbiBpcyBkaXNhYmxlZCB3aXRob3V0IFRlbnNvckZsb3ciLCdUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyB3aXRoICJwaXAgaW5zdGFsbCB0ZW5zb3JmbG93IiBvciBlcXVpdmFsZW50LicpfSxvcGVuT2xkVGVuc29yRmxvd0RpYWxvZyhiKXt0aGlzLm9wZW5EaWFsb2coIlRoaXMgcGx1Z2luIGlzIGRpc2FibGVkIHdpdGhvdXQgVGVuc29yRmxvdyAiKwpiLCJUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyAiK2IrJyBvciBncmVhdGVyIHdpdGggInBpcCBpbnN0YWxsIHRlbnNvcmZsb3ciIG9yIGVxdWl2YWxlbnQuJyl9LG9wZW5EaWFsb2coYixkKXt0aGlzLnNldCgiX3RpdGxlIixiKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLGQpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxjbG9zZURpYWxvZygpe3RoaXMuJC5kaWFsb2cuY2xvc2UoKX0sX2NvbXB1dGVIaWRkZW4oYil7cmV0dXJuIWJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLXZpZGVvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvYmVob2xkZXItZnJhbWUiKSxkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9waW5nIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLXZpZGVvIixwcm9wZXJ0aWVzOntmcHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfZnBzQ2hhbmdlZCJ9LHBpbmdTbGVlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MUUzfSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToyNTAwfSxfaW1hZ2VVUkw6e3R5cGU6U3RyaW5nLHZhbHVlOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIn0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcixfaXNEZWFkOkJvb2xlYW59LGF0dGFjaGVkKCl7dGhpcy5zZXQoIl9pbWFnZVVSTCIsYik7dGhpcy5fcGluZygpfSxkZXRhY2hlZCgpe3RoaXMuX2NsZWFyKCk7CnRoaXMuc2V0KCJfaW1hZ2VVUkwiLCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIil9LF9waW5nKCl7dGhpcy5fY2xlYXIoKTt0aGlzLl94aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3RoaXMuX3hoci5vcGVuKCJHRVQiLGQsITApO3RoaXMuX3hoci50aW1lb3V0PXRoaXMueGhyVGltZW91dDt0aGlzLl94aHIub25sb2FkPXRoaXMuX29uUGluZ0xvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLHRoaXMucGluZ1NsZWVwKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX29uUGluZy5iaW5kKHRoaXMsITEsMSk7dGhpcy5feGhyLnNlbmQobnVsbCl9LF9vblBpbmdMb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBmPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7dGhpcy5fb25QaW5nKCJhbGl2ZSI9PWYuc3RhdHVzLHRoaXMucGluZ1NsZWVwKX1lbHNlIHRoaXMuX29uUGluZyghMSwKdGhpcy5waW5nU2xlZXApfSxfb25QaW5nKGYsaCl7ZiYmdGhpcy5faXNEZWFkJiZ0aGlzLnNldCgiX2ltYWdlVVJMIixiKyI/dFx4M2QiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKTt0aGlzLl9pc0RlYWQ9IWY7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX3BpbmcoKSxoKX0sX2NsZWFyKCl7dGhpcy5fdGltZXImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj1udWxsKTt0aGlzLl94aHImJih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGYsaCl7MD09Zj90aGlzLl9jbGVhcigpOjA9PWgmJnRoaXMuX3BpbmcoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9zZWN0aW9uLWluZm8iKTtQb2x5bWVyKHtpczoidGYtYmVob2xkZXItaW5mbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToxRTR9LF9pdGVtczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3tuYW1lOiJMb2FkaW5nLi4uIn1dfSxfeGhyOk9iamVjdCxfdGltZXI6TnVtYmVyfSxhdHRhY2hlZCgpe3RoaXMuX2xvYWQoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpfSxfbG9hZCgpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixiLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vbkxvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj0KdGhpcy5fcmV0cnkuYmluZCh0aGlzLHRoaXMuX2dldFNsZWVwKCkpO3RoaXMuX3hoci5vbnRpbWVvdXQ9dGhpcy5fcmV0cnkuYmluZCh0aGlzLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25Mb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBkPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7Y29uc29sZS5hc3NlcnQoQXJyYXkuaXNBcnJheShkKSwiRXhwZWN0ZWQgcmVzcG9uc2UgdG8gYmUgaW4gYW4gYXJyYXkiKTt0aGlzLl9pdGVtcz1kfXRoaXMuX3JldHJ5KHRoaXMuX2dldFNsZWVwKCkpfSxfcmV0cnkoZCl7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQodGhpcy5fbG9hZC5iaW5kKHRoaXMpLGQpfSxfZ2V0U2xlZXAoKXtyZXR1cm4gMUUzLygwPT09dGhpcy5mcHM/MTp0aGlzLmZwcyl9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYKKHRoaXMuX3hoci5yZWFkeVN0YXRlPFhNTEh0dHBSZXF1ZXN0LkRPTkUmJnRoaXMuX3hoci5hYm9ydCgpLHRoaXMuX3hocj1udWxsKX0sX2Zwc0NoYW5nZWQoZCxmKXswPT1kP3RoaXMuX2NsZWFyKCk6MD09ZiYmdGhpcy5fbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iZWhvbGRlci1kYXNoYm9hcmQvdGYtYmVob2xkZXItZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwLDApfSxfaXNBdmFpbGFibGU6Qm9vbGVhbixfdmFsdWVzOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhaW5hYmxlX3ZhcmlhYmxlcyIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJ2YXJpYW5jZSIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3NjYWxpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJsYXllciIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3dpbmRvd1NpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjE1LG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9wcmV2aW91c0ZQUzp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9LF9GUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LApfcmVjb3JkVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YXJ0IHJlY29yZGluZyJ9LF9pc1JlY29yZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zaG93QWxsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbG9ybWFwOnt0eXBlOlN0cmluZyx2YWx1ZToibWFnbWEiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9pc19hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfY29udHJvbHNfZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifX0sX3ZhbHVlc05vdEZyYW1lKGIpe3JldHVybiJmcmFtZXMiIT09Yn0sX3ZhcmlhbmNlU2VsZWN0ZWQoYil7cmV0dXJuInZhcmlhbmNlIj09PWJ9LF9jb25maWdDaGFuZ2VkKCl7aWYodGhpcy5faXNfYWN0aXZlJiYhdGhpcy5fY29udHJvbHNfZGlzYWJsZWQpe3ZhciBiPQpbdGhpcy5fdmFsdWVzLHRoaXMuX21vZGUsdGhpcy5fc2NhbGluZyx0aGlzLl93aW5kb3dTaXplLHRoaXMuX0ZQUyx0aGlzLl9pc1JlY29yZGluZyx0aGlzLl9zaG93QWxsLHRoaXMuX2NvbG9ybWFwXSxkO2ZvcihkIG9mIGIpaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZHx8IiI9PT1kKXJldHVybjtiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9jaGFuZ2UtY29uZmlnIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiLHt2YWx1ZXM6dGhpcy5fdmFsdWVzLG1vZGU6dGhpcy5fbW9kZSxzY2FsaW5nOnRoaXMuX3NjYWxpbmcsd2luZG93X3NpemU6dGhpcy5fd2luZG93U2l6ZSxGUFM6dGhpcy5fRlBTLGlzX3JlY29yZGluZzp0aGlzLl9pc1JlY29yZGluZyxzaG93X2FsbDp0aGlzLl9zaG93QWxsLGNvbG9ybWFwOnRoaXMuX2NvbG9ybWFwfSl9fSxfdG9nZ2xlUmVjb3JkKCl7InN0YXJ0IHJlY29yZGluZyI9PXRoaXMuX3JlY29yZFRleHQ/KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsCiJzdG9wIHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCEwKSk6KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsInN0YXJ0IHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCExKSk7dGhpcy4kLnJlY29yZF9idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtcmVjb3JkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGI9PnsiYmVob2xkZXIiaW4gYj8odGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMCkpOih0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2lzQXZhaWxhYmxlKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsCiIvaXMtYWN0aXZlIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9Pnt0aGlzLnNldCgiX2lzX2FjdGl2ZSIsZC5pc19hY3RpdmUpO3RoaXMuc2V0KCJfY29udHJvbHNfZGlzYWJsZWQiLCFkLmlzX2NvbmZpZ193cml0YWJsZSl9KX19fSk7cWYucmVnaXN0ZXJEYXNoYm9hcmQoKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy11dGlscy90Zi1ocGFyYW1zLXV0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChCKXtyZXR1cm4iIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWU/Qi5kaXNwbGF5TmFtZTpCLm5hbWV9ZnVuY3Rpb24gayhCKXtpZigiIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWUpcmV0dXJuIEIuZGlzcGxheU5hbWU7bGV0IEk9Qi5uYW1lLmdyb3VwO0I9Qi5uYW1lLnRhZzt2b2lkIDA9PT1JJiYoST0iIik7dm9pZCAwPT09QiYmKEI9IiIpO3JldHVybiIiPT09ST9COkkrIi4iK0J9ZnVuY3Rpb24gdChCKXtyZXR1cm4gQi5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBsKEIpe3JldHVybiBCLm1ldHJpY0NvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIHAoQixJKXtyZXR1cm4gQltJXX1mdW5jdGlvbiBtKEIsSSl7cmV0dXJuIEIuZmluZChOPT5fLmlzRXF1YWwoTi5uYW1lLEkpKX1mdW5jdGlvbiBuKEIsSSxOKXtyZXR1cm4gSS5ocGFyYW1zW0IuaHBhcmFtQ29sdW1uc1tOXS5ocGFyYW1JbmZvLm5hbWVdfQpmdW5jdGlvbiBxKEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNDb2x1bW5zW05dLm1ldHJpY0luZm8ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gdShCLEksTil7cmV0dXJuIE48Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9uKEIsSSxOKTpxKEIsSSxOLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGgpfWZ1bmN0aW9uIHgoQil7cmV0dXJuIEIuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIEEoQil7cmV0dXJuIEIubWV0cmljSW5mb3MubGVuZ3RofWZ1bmN0aW9uIHkoQixJLE4pe3JldHVybiBJLmhwYXJhbXNbQi5ocGFyYW1JbmZvc1tOXS5uYW1lXX1mdW5jdGlvbiB3KEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNJbmZvc1tOXS5uYW1lKTtyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6Qi52YWx1ZX1mdW5jdGlvbiBDKEIsSSxOKXtyZXR1cm4gTjxCLmhwYXJhbUluZm9zLmxlbmd0aD95KEIsSSxOKTp3KEIsSSxOLUIuaHBhcmFtSW5mb3MubGVuZ3RoKX0KZnVuY3Rpb24gRyhCKXtyZXR1cm4gXy5pc051bWJlcihCKT9CLnRvUHJlY2lzaW9uKDUpOnZvaWQgMD09PUI/IiI6Qi50b1N0cmluZygpfWZ1bmN0aW9uIEQoQixJKXtyZXR1cm4gQipCK0kqSX1mLmhwYXJhbU5hbWU9aDtmLm1ldHJpY05hbWU9aztmLnNjaGVtYUNvbHVtbk5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gSTxCLmhwYXJhbUNvbHVtbnMubGVuZ3RoP2goQi5ocGFyYW1Db2x1bW5zW0ldLmhwYXJhbUluZm8pOmsoQi5tZXRyaWNDb2x1bW5zW0ktQi5ocGFyYW1Db2x1bW5zLmxlbmd0aF0ubWV0cmljSW5mbyl9O2YubnVtSFBhcmFtcz10O2YubnVtTWV0cmljcz1sO2YubnVtQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gdChCKStsKEIpfTtmLmhwYXJhbVZhbHVlQnlOYW1lPXA7Zi5tZXRyaWNWYWx1ZUJ5TmFtZT1tO2YuaHBhcmFtVmFsdWVCeUluZGV4PW47Zi5tZXRyaWNWYWx1ZUJ5SW5kZXg9cTtmLmNvbHVtblZhbHVlQnlJbmRleD11O2YubnVtZXJpY0NvbHVtbkV4dGVudD0KZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT51KEIsTyxOKSl9O2YuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleD1mdW5jdGlvbihCLEksTil7aWYoTjxJLmhwYXJhbUluZm9zLmxlbmd0aClCPUIuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoTz0+Ty5ocGFyYW1JbmZvLm5hbWU9PT1JLmhwYXJhbUluZm9zW05dLm5hbWUpO2Vsc2V7Y29uc3QgTz1JLm1ldHJpY0luZm9zW04tSS5ocGFyYW1JbmZvcy5sZW5ndGhdLm5hbWU7Qj1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoK0IubWV0cmljQ29sdW1ucy5maW5kSW5kZXgoSD0+SC5tZXRyaWNJbmZvLm5hbWU9PT1PKX1jb25zb2xlLmFzc2VydCgtMSE9PUIpO3JldHVybiBCfTtmLnNjaGVtYVZpc2libGVDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEk8Qi5ocGFyYW1JbmZvcy5sZW5ndGg/aChCLmhwYXJhbUluZm9zW0ldKTprKEIubWV0cmljSW5mb3NbSS1CLmhwYXJhbUluZm9zLmxlbmd0aF0pfTtmLm51bVZpc2libGVIUGFyYW1zPQp4O2YubnVtVmlzaWJsZU1ldHJpY3M9QTtmLm51bVZpc2libGVDb2x1bW5zPWZ1bmN0aW9uKEIpe3JldHVybiB4KEIpK0EoQil9O2YudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT5DKEIsTyxOKSl9O2YucHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKHAoQixJKSl9O2YucHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKG0oQixJKSl9O2Yuc2Vzc2lvbkdyb3VwV2l0aE5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5maW5kKE49Pk4ubmFtZT09PUkpfTtmLmhwYXJhbVZhbHVlQnlWaXNpYmxlSW5kZXg9eTtmLm1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg9dztmLmNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXg9QztmLnByZXR0eVByaW50PUc7Zi5sMk5vcm1TcXVhcmVkPUQ7Zi5ldWNsaWRlYW5EaXN0PWZ1bmN0aW9uKEIsSSxOLE8pe3JldHVybiBNYXRoLnNxcnQoRChCLQpOLEktTykpfTtmLnBvaW50VG9SZWN0YW5nbGVEaXN0PWZ1bmN0aW9uKEIsSSxOLE8sSCxLKXtpZihCPE4mJkk8TylyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSSxOLE8pO2lmKE48PUImJkI8SCYmSTxPKXJldHVybiBPLUk7aWYoSDw9QiYmSTxPKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsTyk7aWYoQjxOJiZPPD1JJiZJPEspcmV0dXJuIE4tQjtpZihOPD1CJiZCPEgmJk88PUkmJkk8SylyZXR1cm4gMDtpZihIPD1CJiZPPD1JJiZJPEspcmV0dXJuIEItSDtpZihCPE4mJks8PUkpcmV0dXJuIGYuZXVjbGlkZWFuRGlzdChCLEksTixLKTtpZihOPD1CJiZCPEgmJks8PUkpcmV0dXJuIEktSztpZihIPD1CJiZLPD1JKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsSyk7dGhyb3ciUG9pbnQgKHgseSkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHJlZ2lvbnMgZGVmaW5lZCBhYm92ZS4iO307Zi50cmFuc2xhdGVTdHI9ZnVuY3Rpb24oQixJKXtyZXR1cm4gdm9pZCAwPT09ST8idHJhbnNsYXRlKCIrCkIrIikiOiJ0cmFuc2xhdGUoIitCKyIsIitJKyIpIn07Zi5yb3RhdGVTdHI9ZnVuY3Rpb24oQixJKXtsZXQgTj0icm90YXRlKDkwIjt2b2lkIDAhPT1CJiZ2b2lkIDAhPT1JJiYoTj1OKyIsIitCKyIsIitJKTtyZXR1cm4gTisiKSJ9O2YuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oQil7cmV0dXJuIG51bGw9PT1CfHx2b2lkIDA9PT1CfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q9ZnVuY3Rpb24oQixJLE4sTyxILEspe0IudmlzaXQoKE0sTCxRLFQsWCk9PntpZih2b2lkIDA9PT1NLmxlbmd0aCl7ZG8gTD1CLngoKShNLmRhdGEpLFE9Qi55KCkoTS5kYXRhKSxJPD1MJiZMPE8mJk48PVEmJlE8SCYmSyhNLmRhdGEpO3doaWxlKE09TS5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gTD49T3x8VDw9SXx8UT49SHx8WDw9Tn0pfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJbkRpc2s9ZnVuY3Rpb24oQixJLE4sTyxIKXtCLnZpc2l0KChLLE0sTCxRLFQpPT57aWYodm9pZCAwPT09Sy5sZW5ndGgpe2RvIE09CkIueCgpKEsuZGF0YSksTD1CLnkoKShLLmRhdGEpLE09Zi5ldWNsaWRlYW5EaXN0KEksTixNLEwpLE08PU8mJkgoSy5kYXRhLE0pO3doaWxlKEs9Sy5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gZi5wb2ludFRvUmVjdGFuZ2xlRGlzdChJLE4sTSxMLFEsVCk+T30pfTtmLmZpbHRlclNldD1mdW5jdGlvbihCLEkpe2NvbnN0IE49bmV3IFNldDtCLmZvckVhY2goTz0+e0koTykmJk4uYWRkKE8pfSk7cmV0dXJuIE59O2Yuc2V0QXJyYXlPYnNlcnZhYmx5PWZ1bmN0aW9uKEIsSSl7Y29uc3QgTj1CLmdldCgic2Vzc2lvbkdyb3VwcyIsQik7QXJyYXkuaXNBcnJheShOKT9CLnNwbGljZS5hcHBseShCLFsic2Vzc2lvbkdyb3VwcyIsMCxOLmxlbmd0aF0uY29uY2F0KEkpKTpCLnNldCgic2Vzc2lvbkdyb3VwcyIsSSl9O2YuaGFzaE9mU3RyaW5nPWZ1bmN0aW9uKEIpe2xldCBJPTA7Zm9yKGxldCBOPTA7TjxCLmxlbmd0aDsrK04pST0zMSpJK0IuY2hhckNvZGVBdChOKSY0Mjk0OTY3Mjk1O3JldHVybiBJKwpNYXRoLnBvdygyLDMxKX19KShkLnV0aWxzfHwoZC51dGlscz17fSkpfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLXNwbGl0LWxheW91dC92YWFkaW4tc3BsaXQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1zcGxpdC1sYXlvdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxfcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50czpTdHJpbmcsX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50czpTdHJpbmd9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX3Byb2Nlc3NDaGlsZHJlbil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpfSxfcHJvY2Vzc0NoaWxkcmVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYi5jbGFzc0xpc3QuY29udGFpbnMoInNwbGl0dGVyLWhhbmRsZSIpPwooUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90IiwiaGFuZGxlIiksITEpOiEwfSkuZm9yRWFjaChmdW5jdGlvbihiLGQpezA9PT1kPyh0aGlzLl9wcmltYXJ5Q2hpbGQ9YixQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJwcmltYXJ5IikpOjE9PWQ/KHRoaXMuX3NlY29uZGFyeUNoaWxkPWIsUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90Iiwic2Vjb25kYXJ5IikpOlBvbHltZXIuZG9tKGIpLnJlbW92ZUF0dHJpYnV0ZSgic2xvdCIpfS5iaW5kKHRoaXMpKX0sX3NldEZsZXhCYXNpczpmdW5jdGlvbihiLGQsZil7ZD1NYXRoLm1heCgwLE1hdGgubWluKGQsZikpOzA9PT1kJiYoZD0xRS02KTtiLnN0eWxlLmZsZXg9IjEgMSAiK2QrInB4In0sX29uSGFuZGxlVHJhY2s6ZnVuY3Rpb24oYil7aWYodGhpcy5fcHJpbWFyeUNoaWxkJiZ0aGlzLl9zZWNvbmRhcnlDaGlsZCl7dmFyIGQ9dGhpcy52ZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiOyJzdGFydCI9PT0KYi5kZXRhaWwuc3RhdGU/KHRoaXMuX3N0YXJ0U2l6ZT17Y29udGFpbmVyOnRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0tdGhpcy4kLnNwbGl0dGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHByaW1hcnk6dGhpcy5fcHJpbWFyeUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHNlY29uZGFyeTp0aGlzLl9zZWNvbmRhcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXX0sdGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cz10aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM9dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpOihkPXRoaXMudmVydGljYWw/Yi5kZXRhaWwuZHk6CmIuZGV0YWlsLmR4LHRoaXMuX3NldEZsZXhCYXNpcyh0aGlzLl9wcmltYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnByaW1hcnkrZCx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fc2Vjb25kYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnNlY29uZGFyeS1kLHRoaXMuX3N0YXJ0U2l6ZS5jb250YWluZXIpLHRoaXMubm90aWZ5UmVzaXplKCksImVuZCI9PT1iLmRldGFpbC5zdGF0ZSYmKGRlbGV0ZSB0aGlzLl9zdGFydFNpemUsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cyx0aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50cykpfX0sX3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKGIpe2IucHJldmVudERlZmF1bHQoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUvdGYtaHBhcmFtcy1xdWVyeS1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcXVlcnktcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjaGVtYTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfSxjb2x1bW5zVmlzaWJpbGl0eTpbXSx2aXNpYmxlU2NoZW1hOntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19KSxyZWFkT25seTohMCxub3RpZnk6ITB9LHNlc3Npb25Hcm91cHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2V4cGVyaW1lbnQ6T2JqZWN0LF9ocGFyYW1zOkFycmF5LF9tZXRyaWNzOkFycmF5LF9zdGF0dXNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3t2YWx1ZToiU1RBVFVTX1VOS05PV04iLGRpc3BsYXlOYW1lOiJVbmtub3duIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19TVUNDRVNTIixkaXNwbGF5TmFtZToiU3VjY2VzcyIsCmFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX0ZBSUxVUkUiLGRpc3BsYXlOYW1lOiJGYWlsdXJlIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19SVU5OSU5HIixkaXNwbGF5TmFtZToiUnVubmluZyIsYWxsb3dlZDohMH1dfSxfZ2V0RXhwZXJpbWVudFJlc29sdmVkOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZShiPT57dGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQ9Yn0pfX0sX3Jlc29sdmVHZXRFeHBlcmltZW50OkZ1bmN0aW9uLF9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zb3J0QnlJbmRleDpOdW1iZXIsX3NvcnREaXJlY3Rpb246TnVtYmVyLF9wYWdlU2l6ZUlucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEwMCIsaW52YWxpZDohMX19LF9wYWdlTnVtYmVySW5wdXQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt2YWx1ZToiMSIsaW52YWxpZDohMX19LApfcGFnZUNvdW50U3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiPyJ9LF90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0cjpTdHJpbmcsX3Nlc3Npb25Hcm91cHNSZXF1ZXN0Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVFeHBlcmltZW50QW5kUmVsYXRlZFByb3BzKGJhY2tlbmQsIGV4cGVyaW1lbnROYW1lKSIsIl91cGRhdGVDb25maWd1cmF0aW9uKF9ocGFyYW1zLiosIF9tZXRyaWNzLiopIl0scmVsb2FkKCl7dGhpcy5fcXVlcnlTZXJ2ZXIoKX0sX2NzdlVybChiLGQpe3JldHVybiB0aGlzLl9kb3dubG9hZERhdGFVcmwoYixkLCJjc3YiKX0sX2pzb25VcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwianNvbiIpfSxfbGF0ZXhVcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwibGF0ZXgiKX0sX2Rvd25sb2FkRGF0YVVybChiLGQsZil7cmV0dXJuIHRoaXMuYmFja2VuZC5nZXREb3dubG9hZFVybChmLGIsZC5jb2x1bW5zVmlzaWJpbGl0eSl9LApfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7Yi5pc051bGxPclVuZGVmaW5lZCh0aGlzLmJhY2tlbmQpfHxiLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZXhwZXJpbWVudE5hbWUpfHx0aGlzLmJhY2tlbmQuZ2V0RXhwZXJpbWVudCh7ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZX0pLnRoZW4oZD0+e18uaXNFcXVhbChkLHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50IixkKSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLHRoaXMuX2NvbXB1dGVNZXRyaWNzKCksdGhpcy5fcXVlcnlTZXJ2ZXIoKSx0aGlzLl9yZXNvbHZlR2V0RXhwZXJpbWVudCgpKX0pfSxfY29tcHV0ZUhQYXJhbXMoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MuZm9yRWFjaCgoZCxmKT0+e2NvbnN0IGg9e2luZm86ZCxkaXNwbGF5ZWQ6NT5mLGZpbHRlcjp7fX07aC5pbmZvLmhhc093blByb3BlcnR5KCJkb21haW5EaXNjcmV0ZSIpPwooaC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10saC5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goaz0+e2guZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmssY2hlY2tlZDohMH0pfSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWguaW5mby50eXBlP2guZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19OiJEQVRBX1RZUEVfU1RSSU5HIj09PWguaW5mby50eXBlP2guZmlsdGVyLnJlZ2V4cD0iIjpjb25zb2xlLndhcm4oInVua25vd24gaHBhcmFtLmluZm8udHlwZTogJXMiLGguaW5mby50eXBlKTtiLnB1c2goaCl9KTt0aGlzLnNldCgiX2hwYXJhbXMiLGIpfSxfY29tcHV0ZU1ldHJpY3MoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQubWV0cmljSW5mb3MuZm9yRWFjaCgoZCwKZik9PntiLnB1c2goe2luZm86ZCxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6NT5mfSl9KTt0aGlzLnNldCgiX21ldHJpY3MiLGIpfSxfY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKGI9Pih7aHBhcmFtSW5mbzpiLmluZm99KSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcChiPT4oe21ldHJpY0luZm86Yi5pbmZvfSkpfTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfX0sX3VwZGF0ZUNvbmZpZ3VyYXRpb24oKXt0aGlzLmRlYm91bmNlKCJfdXBkYXRlQ29uZmlndXJhdGlvbiIsKCk9Pnt0aGlzLl9zZXRDb25maWd1cmF0aW9uKHtzY2hlbWE6dGhpcy5fY29tcHV0ZVNjaGVtYSgpLGNvbHVtbnNWaXNpYmlsaXR5OnRoaXMuX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpLAp2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3M/dGhpcy5faHBhcmFtcy5tYXAoYj0+Yi5kaXNwbGF5ZWQpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcChiPT5iLmRpc3BsYXllZCkpOltdfSxfY29tcHV0ZVZpc2libGVTY2hlbWEoKXtpZighdGhpcy5faHBhcmFtc3x8IXRoaXMuX21ldHJpY3MpcmV0dXJue2hwYXJhbUluZm9zOltdLG1ldHJpY0luZm9zOltdfTtjb25zdCBiPXRoaXMuX2hwYXJhbXMuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKSxkPXRoaXMuX21ldHJpY3MuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKTtyZXR1cm57aHBhcmFtSW5mb3M6YixtZXRyaWNJbmZvczpkfX0sX3F1ZXJ5U2VydmVyKCl7dGhpcy5kZWJvdW5jZSgicXVlcnlTZXJ2ZXIiLCgpPT50aGlzLl9xdWVyeVNlcnZlck5vRGVib3VuY2UoKSwKMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe3JldHVybiB0aGlzLl9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkudGhlbih0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxsYWJsZSgoe3ZhbHVlOmIsY2FuY2VsbGVkOmR9KT0+e2R8fCgwPD1iLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYi50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsYi50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSksdGYuaHBhcmFtcy51dGlscy5zZXRBcnJheU9ic2VydmFibHkodGhpcyxiLnNlc3Npb25Hcm91cHMpKX0pKX0sX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKXtjb25zdCBiPXRoaXMuX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCk7CmlmKG51bGwhPT1iKXJldHVybiB0aGlzLnNldCgiX3Nlc3Npb25Hcm91cHNSZXF1ZXN0IixiKSx0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMoYil9LF9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGIobSl7dmFyIG49Zi5nZXQobSsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249IiI9PT1uPyItSW5maW5pdHkiOituO2Yuc2V0KG0rIi5taW4uaW52YWxpZCIsaXNOYU4obikpO2g9aCYmIWlzTmFOKG4pO3ZhciBxPWYuZ2V0KG0rIi5tYXgudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPSIiPT09cT8iSW5maW5pdHkiOitxO2Yuc2V0KG0rIi5tYXguaW52YWxpZCIsaXNOYU4ocSkpO2g9aCYmIWlzTmFOKHEpO3JldHVybiBpc05hTihuKXx8aXNOYU4ocSk/bnVsbDp7bWluVmFsdWU6bixtYXhWYWx1ZTpxfX1mdW5jdGlvbiBkKG0pe3ZhciBuPQpmLmdldChtKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1uKTtuPStuO2NvbnN0IHE9TnVtYmVyLmlzSW50ZWdlcihuKSYmMDxuO2Yuc2V0KG0rIi5pbnZhbGlkIiwhcSk7aD1oJiZxO3JldHVybiBxP246bnVsbH1jb25zdCBmPXRoaXM7bGV0IGg9ITA7Y29uc3Qgaz10aGlzLl9zdGF0dXNlcy5maWx0ZXIobT0+bS5hbGxvd2VkKS5tYXAobT0+bS52YWx1ZSk7bGV0IHQ9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChtLG4pPT57bGV0IHE9e2hwYXJhbTptLmluZm8ubmFtZX07aWYobS5maWx0ZXIuZG9tYWluRGlzY3JldGUpcS5maWx0ZXJEaXNjcmV0ZT1bXSxtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKHU9Pnt1LmNoZWNrZWQmJnEuZmlsdGVyRGlzY3JldGUucHVzaCh1LnZhbHVlKX0pO2Vsc2UgaWYobS5maWx0ZXIuaW50ZXJ2YWwpcS5maWx0ZXJJbnRlcnZhbD1iKCJfaHBhcmFtcy4iK24rIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNlIGlmKG0uZmlsdGVyLnJlZ2V4cClxLmZpbHRlclJlZ2V4cD0KbS5maWx0ZXIucmVnZXhwO2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIsbSksbnVsbDt0LnB1c2gocSl9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKG0sbik9PnttPXttZXRyaWM6bS5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YigiX21ldHJpY3MuIituKyIuZmlsdGVyLmludGVydmFsIil9O3QucHVzaChtKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluIHQpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDt0W3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoKIk9SREVSX0RFU0MifWNvbnN0IGw9ZCgiX3BhZ2VOdW1iZXJJbnB1dCIpLHA9ZCgiX3BhZ2VTaXplSW5wdXQiKTtyZXR1cm4gaD97ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZSxhbGxvd2VkU3RhdHVzZXM6ayxjb2xQYXJhbXM6dCxzdGFydEluZGV4OnAqKGwtMSksc2xpY2VTaXplOnB9Om51bGx9LF9tZXRyaWNTb3J0QnlJbmRleChiKXtyZXR1cm4gYit0aGlzLl9ocGFyYW1zLmxlbmd0aH0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfcHJldHR5UHJpbnQ6dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcGFnZXMvaXJvbi1wYWdlcy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLXBhZ2VzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtzY3JvbGw6ITB9LGQ9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxmPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oaCxrKXtrPWRba107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1rP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWt8fGg/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oaCl7dmFyIGs9e307ay5mbGV4PSJjb3ZlciIhPT1oO3JldHVybiBPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGtbdF19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dmFyIHQ9dGhpcy5oZWFkZXI7dCYmKGZba10mJiFmW2hdPyh0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGZbaF0sdCkpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5zY3JvbGxlcixrPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1oLnNjcm9sbFRvcCk7ayYmdGhpcy50YWxsQ2xhc3MmJmZbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxrLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmguc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGspfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGgpe3JldHVybiBiW2hdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYiYmISFiLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGIpe2lmKHRoaXMubGluayl7dmFyIGQ9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmQmJmIudGFyZ2V0IT09ZCYmZC5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGI/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7Yi5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihiKXtiLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYixkLGYpe3JldHVybiFkfHxmPyJoaWRkZW4iOmI/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/InNjcm9sbGFibGUiKyhkPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj8iaGlkZGVuIjpkPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuX3RhYkNoYW5nZWQoYi5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9Yi5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYixkKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09Yjt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGQpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDtiLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGIsZCl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZCYmLWQuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYil7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YjtiPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09Yjt0aGlzLl9yaWdodEhpZGRlbj1iPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2lmKGIpe3ZhciBmPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD1mLndpZHRoLGs9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtmPWsubGVmdC1mLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChrLndpZHRoLGgpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZixoKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1kKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgdD1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9dGhpcy5pdGVtcy5pbmRleE9mKGQpO2I9dGhpcy5pdGVtcy5pbmRleE9mKGIpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7Yj1kPGI7dGhpcy5faXNSVEwmJihiPSFiKTtiP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGsubGVmdCtrLndpZHRoLQp0LmxlZnQsaCktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudCh0LmxlZnQrdC53aWR0aC1rLmxlZnQsaCktNSx0aGlzLl9jYWxjUGVyY2VudChmLGgpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGsud2lkdGgsZil9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihiLGQpe2QtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5kP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWQ6KGQrPWItdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxkJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9ZCkpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYiwKZCl7cmV0dXJuIDEwMCpiL2R9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihiLGQpe2I9Ynx8MDtkPWR8fDA7dGhpcy5fd2lkdGg9Yjt0aGlzLl9sZWZ0PWQ7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitkKyIlKSBzY2FsZVgoIitiLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDtiLmNvbnRhaW5zKCJleHBhbmQiKT8oYi5yZW1vdmUoImV4cGFuZCIpLGIuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmIuY29udGFpbnMoImNvbnRyYWN0IikmJmIucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2xiYXIvcGFwZXItdG9vbGJhci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sYmFyIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbGJhciJ9LHByb3BlcnRpZXM6e2JvdHRvbUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxqdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbWlkZGxlSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxyZWFkeTpmdW5jdGlvbigpe2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj10aGlzLl9vYnNlcnZlKHRoaXMpO3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKX0sX29ic2VydmU6ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfS5iaW5kKHRoaXMpKTsKZC5vYnNlcnZlKGIse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7cmV0dXJuIGR9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmZsdXNoKCk7Zm9yKHZhciBiPVtdLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGYsaD0wO2Y9ZFtoXTtoKyspe2Y9UG9seW1lci5kb20oZikuZ2V0RGlzdHJpYnV0ZWROb2RlcygpO2Zvcih2YXIgayx0PTA7az1mW3RdO3QrKylpZihrLmNsYXNzTGlzdCYmay5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoay5pZCliLnB1c2goay5pZCk7ZWxzZXt2YXIgbD0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMUU0Kk1hdGgucmFuZG9tKCkpO2suaWQ9bDtiLnB1c2gobCl9fTA8CmIubGVuZ3RoJiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiLmpvaW4oIiAiKSl9LF9jb21wdXRlQmFyRXh0cmFDbGFzc2VzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IrKCJqdXN0aWZpZWQiPT09Yj8iIjoiLWp1c3RpZmllZCIpOiIifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZ3VyYXRpb24uKikiLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyhzZXNzaW9uR3JvdXBzLiopIl0sX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKCl7Y29uc3QgYj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYSxkPXRoaXMuY29uZmlndXJhdGlvbi5zY2hlbWEsZj17Y29sdW1uczpiLmhwYXJhbUluZm9zLm1hcCgoaCxrKT0+KHtuYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZShoKSxpbmRleDprLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGQsYixrKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oayk/CiJMSU5FQVIiOiJOT05fTlVNRVJJQyJ9KSkuY29uY2F0KGIubWV0cmljSW5mb3MubWFwKChoLGspPT57ays9Yi5ocGFyYW1JbmZvcy5sZW5ndGg7cmV0dXJue3NjYWxlOiJMSU5FQVIiLG5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGgpLGluZGV4OmssYWJzb2x1dGVJbmRleDp0Zi5ocGFyYW1zLnV0aWxzLmdldEFic29sdXRlQ29sdW1uSW5kZXgoZCxiLGspfX0pKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsZik7UG9seW1lci5kb20uZmx1c2goKTt0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9LF91bnNlbGVjdERpc2FibGVkTG9nU2NhbGVzKCl7bnVsbCE9PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmNvbHVtbnMuZm9yRWFjaChiPT57Y29uc3QgZD0ib3B0aW9ucy5jb2x1bW5zLiIrCmIuaW5kZXg7dGhpcy5fYWxsb3dMb2dTY2FsZShiKXx8IkxPRyIhPT1iLnNjYWxlfHx0aGlzLnNldChkKyIuc2NhbGUiLCJMSU5FQVIiKX0pfSxfYWxsb3dMb2dTY2FsZShiKXtpZighdGhpcy5faXNOdW1lcmljQ29sdW1uKGIuaW5kZXgpfHwhdGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiExO2NvbnN0IFtkLGZdPXRmLmhwYXJhbXMudXRpbHMudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIuaW5kZXgpO3JldHVybiAwPGR8fDA+Zn0sX2lzTnVtZXJpY0NvbHVtbihiKXtyZXR1cm4gYj49dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RofHwiREFUQV9UWVBFX0ZMT0FUNjQiPT09dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3NbYl0udHlwZX0sX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKXtpZigwPHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwpjb25zdCBiPXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleChkPT4iREFUQV9UWVBFX0ZMT0FUNjQiPT09ZC50eXBlKTtpZigtMSE9PWIpcmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmVJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGxpc3RlbmVyczp7ImNlbGwtYWN0aXZhdGUiOiJfYWN0aXZhdGVJdGVtIn0sb2JzZXJ2ZXJzOlsiX2FjdGl2ZUl0ZW1DaGFuZ2VkKGFjdGl2ZUl0ZW0pIl0sX2FjdGl2YXRlSXRlbTpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5tb2RlbC5pdGVtO3RoaXMuYWN0aXZlSXRlbT10aGlzLmFjdGl2ZUl0ZW0hPT1kP2Q6bnVsbDtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxfYWN0aXZlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuX3VwZGF0ZUl0ZW0oYixiLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7X3ZpZHhPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGlvczp7dHlwZTpCb29sZWFuLHZhbHVlOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLykscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmaXhlZFNlY3Rpb25zOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLGNvbXB1dGVkOiJfaGFzRml4ZWRTZWN0aW9ucyhzY3JvbGxiYXJXaWR0aCkifSxfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNjcm9sbGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUYXJnZXQ9dGhpcy4kLnRhYmxlfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsCiJfb25XaGVlbCIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXQsIndoZWVsIiwiX29uV2hlZWwiKX0sc2Nyb2xsVG9TY2FsZWRJbmRleDpmdW5jdGlvbihiKXt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1udWxsO3RoaXMuJC5pdGVtcy5zdHlsZS5ib3JkZXJUb3BXaWR0aHx8KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4PWIpO2I9TWF0aC5taW4oTWF0aC5tYXgoYiwwKSx0aGlzLnNpemUtMSk7dGhpcy4kLnRhYmxlLnNjcm9sbFRvcD1iL3RoaXMuc2l6ZSp0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0O3RoaXMuX3Njcm9sbEhhbmRsZXIoKTt0aGlzLnNjcm9sbFRvSW5kZXgoYi10aGlzLl92aWR4T2Zmc2V0KTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3Njcm9sbFBvc2l0aW9uKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5fdmlkeE9mZnNldCt0aGlzLmxhc3RWaXNpYmxlSW5kZXg9PT10aGlzLnNpemUtCjEmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQtdGhpcy4kLnRhYmxlLm9mZnNldEhlaWdodCx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpfSxfaGFzRml4ZWRTZWN0aW9uczpmdW5jdGlvbihiKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZS8pJiYwPT09Yn0sX29uV2hlZWw6ZnVuY3Rpb24oYil7aWYoIWIuY3RybEtleSYmIXRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYi50YXJnZXQsYi5kZWx0YVgsYi5kZWx0YVkpKXt2YXIgZD10aGlzLiQudGFibGUsZj1iLmRlbHRhWTsxPT09Yi5kZWx0YU1vZGUmJihmKj1ncmlkLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQXZlcmFnZSk7dmFyIGg9TWF0aC5hYnMoYi5kZWx0YVgpK01hdGguYWJzKGYpO3RoaXMuX2NhblNjcm9sbChkLGIuZGVsdGFYLGYpPyhiLnByZXZlbnREZWZhdWx0KCksZC5zY3JvbGxUb3ArPWYsZC5zY3JvbGxMZWZ0Kz1iLmRlbHRhWCx0aGlzLl9zY3JvbGxIYW5kbGVyKCksCnRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITAsdGhpcy5faWdub3JlTmV3V2hlZWw9dGhpcy5kZWJvdW5jZSgiaWdub3JlLW5ldy13aGVlbCIsZnVuY3Rpb24oKXt0aGlzLl9pZ25vcmVOZXdXaGVlbD1udWxsfSw1MDApKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZoPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD9iLnByZXZlbnREZWZhdWx0KCk6aD50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSk7dGhpcy5fcHJldmlvdXNNb21lbnR1bT1ofX0sX2hhc1Njcm9sbGVkQW5jZXN0b3I6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuX2NhblNjcm9sbChiLGQsZikpcmV0dXJuITA7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT1iLmxvY2FsTmFtZSYmYiE9PXRoaXMmJmIucGFyZW50RWxlbWVudClyZXR1cm4gdGhpcy5faGFzU2Nyb2xsZWRBbmNlc3RvcihiLnBhcmVudEVsZW1lbnQsZCxmKX0sCl9jYW5TY3JvbGw6ZnVuY3Rpb24oYixkLGYpe3JldHVybiAwPGYmJmIuc2Nyb2xsVG9wPGIuc2Nyb2xsSGVpZ2h0LWIub2Zmc2V0SGVpZ2h0fHwwPmYmJjA8Yi5zY3JvbGxUb3B8fDA8ZCYmYi5zY3JvbGxMZWZ0PGIuc2Nyb2xsV2lkdGgtYi5vZmZzZXRXaWR0aHx8MD5kJiYwPGIuc2Nyb2xsTGVmdH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxkPWItdGhpcy5fc2Nyb2xsUG9zaXRpb24sZj10aGlzLl9yYXRpbyxoPTAsaz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSx0PWYsbD1bXTt0aGlzLl9zY3JvbGxQb3NpdGlvbj1iO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt2YXIgcD10aGlzLl9zY3JvbGxCb3R0b207dmFyIG09dGhpcy5fcGh5c2ljYWxCb3R0b207aWYoTWF0aC5hYnMoZCk+dGhpcy5fcGh5c2ljYWxTaXplKXRoaXMuX3BoeXNpY2FsVG9wKz0KZCxoPU1hdGgucm91bmQoZC90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO2Vsc2UgaWYoMD5kKXt2YXIgbj1iLXRoaXMuX3BoeXNpY2FsVG9wO2w9dGhpcy5fdmlydHVhbFN0YXJ0O3ZhciBxPVtdO3ZhciB1PXRoaXMuX3BoeXNpY2FsRW5kO2Zvcih0PW4vazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmMDxsLWgmJm0tdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpPnA7KW49dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpLHQrPW4vayxtLT1uLHEucHVzaCh1KSxoKyssdT0wPT09dT90aGlzLl9waHlzaWNhbENvdW50LTE6dS0xO2w9cTtoPS1ofWVsc2UgaWYoMDxkKXt2YXIgeD10aGlzLl92aXJ0dWFsRW5kLEE9dGhpcy5fdmlydHVhbENvdW50LTE7cT1bXTt1PXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHQ9KG0tcCkvazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmeCtoPEEmJnRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KTwKYjspbj10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodSksdCs9bi9rLHRoaXMuX3BoeXNpY2FsVG9wKz1uLHEucHVzaCh1KSxoKyssdT0odSsxKSV0aGlzLl9waHlzaWNhbENvdW50fXRoaXMuX3ZpcnR1YWxDb3VudDx0aGlzLnNpemUmJnRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldChkKTswPT09aD8obTxwfHx0aGlzLl9waHlzaWNhbFRvcD5iKSYmdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKToodGhpcy5fdmlydHVhbFN0YXJ0Kz1oLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWgsdGhpcy5fdXBkYXRlKHEsbCkpO3RoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpO3RoaXMuaGFzQXR0cmlidXRlKCJyZW9yZGVyaW5nIil8fCh0aGlzLnNjcm9sbGluZz0hMCk7dGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtc2Nyb2xsaW5nIixmdW5jdGlvbigpe3RoaXMuc2Nyb2xsaW5nPSExO3RoaXMuX3Jlb3JkZXJSb3dzKCl9LDEwMCl9LF9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQ6ZnVuY3Rpb24oYil7aWYoMUU0PApNYXRoLmFicyhiKSl0aGlzLl9ub1NjYWxlP3RoaXMuX25vU2NhbGU9ITE6KGI9TWF0aC5yb3VuZCh0aGlzLl9zY3JvbGxQb3NpdGlvbi90aGlzLl9zY3JvbGxIZWlnaHQqMUUzKS8xRTMsdGhpcy5fdmlkeE9mZnNldD1NYXRoLnJvdW5kKGIqdGhpcy5zaXplLWIqdGhpcy5fdmlydHVhbENvdW50KSwwPT09dGhpcy5fc2Nyb2xsVG9wJiZ0aGlzLnNjcm9sbFRvSW5kZXgoMCkpO2Vsc2V7Yj10aGlzLl92aWR4T2Zmc2V0fHwwOzA9PT10aGlzLl9zY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9MCxiIT09dGhpcy5fdmlkeE9mZnNldCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKToxRTM+dGhpcy5maXJzdFZpc2libGVJbmRleCYmMDx0aGlzLl92aWR4T2Zmc2V0JiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KyhiLXRoaXMuX3ZpZHhPZmZzZXQpKzEpLHRoaXMuX25vU2NhbGU9CiEwKTt2YXIgZD10aGlzLnNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PWQsYiE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLl92aXJ0dWFsQ291bnQpKTp0aGlzLmZpcnN0VmlzaWJsZUluZGV4PnRoaXMuX3ZpcnR1YWxDb3VudC0xRTMmJnRoaXMuX3ZpZHhPZmZzZXQ8ZCYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGQtdGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LWIpKSx0aGlzLl9ub1NjYWxlPSEwKX19LF9yZW9yZGVyUm93czpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcyksZD1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3ciKSxmPWQubGVuZ3RoLShkWzBdLmluZGV4LSh0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fdmlkeE9mZnNldCkpOwppZihmPGQubGVuZ3RoLzIpZm9yKHZhciBoPTA7aDxmO2grKyliLmFwcGVuZENoaWxkKGRbaF0pO2Vsc2UgZm9yKDtmPGQubGVuZ3RoO2YrKyliLmluc2VydEJlZm9yZShkW2ZdLGRbMF0pfSxfZnJvemVuQ2VsbHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiY2FjaGUtZWxlbWVudHMiLGZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcy5kb21Ib3N0LnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1jZWxsIikuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0eWxlLnRyYW5zZm9ybT0iIn0pO3RoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKX0pO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX0sX3VwZGF0ZUxhc3RGcm96ZW46ZnVuY3Rpb24oKXtpZih0aGlzLmNvbHVtblRyZWUpe3ZhciBiPQp0aGlzLmNvbHVtblRyZWVbdGhpcy5jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTtiLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gZi5fb3JkZXItaC5fb3JkZXJ9KTt2YXIgZD1iLnJlZHVjZShmdW5jdGlvbihmLGgsayl7aC5fbGFzdEZyb3plbj0hMTtyZXR1cm4gaC5mcm96ZW4mJiFoLmhpZGRlbj9rOmZ9LHZvaWQgMCk7dm9pZCAwIT09ZCYmKGJbZF0uX2xhc3RGcm96ZW49ITApfX0sX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50czpmdW5jdGlvbigpe3RoaXMuZml4ZWRTZWN0aW9ucz8odGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnR8fDAsLXRoaXMuX3Njcm9sbFRvcHx8MCksdGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLDApKTp0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT0KdGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsdGhpcy5fc2Nyb2xsVG9wKTtmb3IodmFyIGI9dGhpcy5fZ2V0VHJhbnNsYXRlKHRoaXMuX3Njcm9sbExlZnQsMCksZD0wO2Q8dGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoO2QrKyl0aGlzLl9mcm96ZW5DZWxsc1tkXS5zdHlsZS50cmFuc2Zvcm09Yn0sX2dldFRyYW5zbGF0ZTpmdW5jdGlvbihiLGQpe3JldHVybiJ0cmFuc2xhdGUoIitiKyJweCwiK2QrInB4KSJ9fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9yPVtQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY2VsbC1jbGljay1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcj17bGlzdGVuZXJzOntjbGljazoiX29uQ2xpY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGIpe2IudGFyZ2V0IT09dGhpcy5fY2VsbENvbnRlbnQmJnRoaXMuZmlyZSgiY2VsbC1jb250ZW50LWZvY3VzIix7Y2VsbDp0aGlzfSl9LmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sX29uQ2xpY2s6ZnVuY3Rpb24oYil7InZhYWRpbi1ncmlkLXNvcnRlciIhPT10aGlzLmxvY2FsTmFtZSYmdGhpcy5maXJlKCJjZWxsLWZvY3VzIix7Y2VsbDp0aGlzfSk7aWYodGhpcy5fY2VsbENsaWNrKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDsKZC5nZXREaXN0cmlidXRlZE5vZGVzJiYoZD1Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKClbMF0pO3ZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGg7Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLDAsZi5pbmRleE9mKGQpKzEpO2QuY29udGFpbnModGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LnJvb3QuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl8fGYuc29tZSh0aGlzLl9pc0ZvY3VzYWJsZSl8fHRoaXMuX2NlbGxDbGljayhiKX19LF9pc0ZvY3VzYWJsZTpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXJlbnROb2RlO2Q9LTEhPT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0YWJpbmRleF0sIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIG9iamVjdCwgaWZyYW1lLCBsYWJlbCwgYVtocmVmXSwgYXJlYVtocmVmXSIpLGIpO3JldHVybiFiLmRpc2FibGVkJiYKZH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWNlbGwuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17cHJvcGVydGllczp7Y29sdW1uOk9iamVjdCxleHBhbmRlZDpCb29sZWFuLGZsZXhHcm93Ok51bWJlcixjb2xTcGFuOk51bWJlcixmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGxhc3RGcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGhpZGRlbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saW5zdGFuY2U6T2JqZWN0LGluZGV4Ok51bWJlcixpdGVtOk9iamVjdCxzZWxlY3RlZDpCb29sZWFuLHRlbXBsYXRlOk9iamVjdCx0YXJnZXQ6T2JqZWN0LHdpZHRoOlN0cmluZyxvcmRlcjpOdW1iZXIscmVvcmRlclN0YXR1czp7dHlwZTpTdHJpbmcscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfY2hpbGRDb2x1bW5zOkFycmF5LF9jZWxsQ29udGVudDpPYmplY3QsX2luc2VydGlvblBvaW50Ok9iamVjdCwKX3RlbXBsYXRpemVyOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uQ2hhbmdlZChjb2x1bW4pO19jZWxsQXR0YWNoZWQoY29sdW1uLCBpc0F0dGFjaGVkKTtfZXhwYW5kZWRDaGFuZ2VkKGV4cGFuZGVkLCBpbnN0YW5jZSk7X2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X2luZGV4Q2hhbmdlZChpbmRleCwgaW5zdGFuY2UpO19pdGVtQ2hhbmdlZChpdGVtLCBpbnN0YW5jZSk7X2luc3RhbmNlQ2hhbmdlZChpbnN0YW5jZSwgdGFyZ2V0KTtfc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkLCBpbnN0YW5jZSk7X3RvZ2dsZUNvbnRlbnQoaXNBdHRhY2hlZCwgX2NlbGxDb250ZW50LCBfaW5zZXJ0aW9uUG9pbnQpO190b2dnbGVJbnN0YW5jZShpc0F0dGFjaGVkLCBfdGVtcGxhdGl6ZXIsIGluc3RhbmNlKTtfd2lkdGhDaGFuZ2VkKHdpZHRoKTtfb3JkZXJDaGFuZ2VkKG9yZGVyKTtfdmlzaWJsZUNoaWxkQ29sdW1uc0NoYW5nZWQoX3Zpc2libGVDaGlsZENvbHVtbnMpO19jaGlsZENvbHVtbnNDaGFuZ2VkKF9jaGlsZENvbHVtbnMpIi5zcGxpdCgiOyIpLApyZWFkeTpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY2VsbCIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0sX2NvbHVtbkNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5mbGV4R3Jvdz1kLmZsZXhHcm93O3RoaXMuZnJvemVuPWQuZnJvemVuO3RoaXMubGFzdEZyb3plbj1kLl9sYXN0RnJvemVuO3RoaXMuaGVhZGVyVGVtcGxhdGU9ZC5oZWFkZXJUZW1wbGF0ZTt0aGlzLmZvb3RlclRlbXBsYXRlPWQuZm9vdGVyVGVtcGxhdGU7dGhpcy50ZW1wbGF0ZT1kLnRlbXBsYXRlO3RoaXMud2lkdGg9ZC53aWR0aDt0aGlzLmhpZGRlbj1kLmhpZGRlbjt0aGlzLnJlc2l6YWJsZT1kLnJlc2l6YWJsZTt0aGlzLl9jaGlsZENvbHVtbnM9ZC5fY2hpbGRDb2x1bW5zO3RoaXMub3JkZXI9ZC5fb3JkZXI7ZC5jb2xTcGFuJiYodGhpcy5jb2xTcGFuPQpkLmNvbFNwYW4pO3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0sX2NlbGxBdHRhY2hlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmP3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkfHx0aGlzLnVubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0pKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT10aGlzLmNvbHVtbiYmKHRoaXNbZC5kZXRhaWwucGF0aF09ZC5kZXRhaWwudmFsdWUpfSxfZXhwYW5kZWRDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuX19leHBhbmRlZF9fPWQsZi5leHBhbmRlZD1kKX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLmZsZXhHcm93PQpkfSxfaW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuaW5kZXg9ZCl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLml0ZW09ZCl9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5fX3NlbGVjdGVkX189ZCxmLnNlbGVjdGVkPWQpfSxfY2hpbGRDb2x1bW5zQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmNvbFNwYW49ZC5sZW5ndGh9LF90b2dnbGVDb250ZW50OmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD8oUG9seW1lci5kb20oZikucGFyZW50Tm9kZSE9PXRoaXMudGFyZ2V0JiZQb2x5bWVyLmRvbSh0aGlzLnRhcmdldCkuYXBwZW5kQ2hpbGQoZiksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQoaCkpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWR8fFBvbHltZXIuZG9tKGYpLnBhcmVudE5vZGUhPT0KdGhpcy50YXJnZXR8fFBvbHltZXIuZG9tKHRoaXMudGFyZ2V0KS5yZW1vdmVDaGlsZChmKX0pKX0sX3RvZ2dsZUluc3RhbmNlOmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD9mLmFkZEluc3RhbmNlKGgpOmYucmVtb3ZlSW5zdGFuY2UoaCkpfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUud2lkdGg9ZH0sX29yZGVyQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLm9yZGVyPWR9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCk7dGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcn0sX2luc3RhbmNlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJih0aGlzLnN0eWxlLmhlaWdodD0iIix0aGlzLl9jZWxsQ29udGVudD10aGlzLl9jZWxsQ29udGVudHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtY2VsbC1jb250ZW50IiksCmQ9InZhYWRpbi1ncmlkLWNlbGwtY29udGVudC0iKyh2YWFkaW4uZWxlbWVudHMuZ3JpZC5fY29udGVudEluZGV4PXZhYWRpbi5lbGVtZW50cy5ncmlkLl9jb250ZW50SW5kZXgrMXx8MCksdGhpcy5fY2VsbENvbnRlbnQuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKHRoaXMuX2NlbGxDb250ZW50KS5hcHBlbmRDaGlsZCh0aGlzLmluc3RhbmNlLnJvb3QpLHRoaXMuX2NlbGxDb250ZW50LnNldEF0dHJpYnV0ZSgiaWQiLGQpLFBvbHltZXIuRWxlbWVudD8odGhpcy5fY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCJzbG90IixkKSx0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2xvdCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgibmFtZSIsZCkpOih0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29udGVudCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgic2VsZWN0IiwKIiMiK2QpKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtY2VsbCIsYmVoYXZpb3JzOltiLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfdGVtcGxhdGVDaGFuZ2VkKHRlbXBsYXRlKSJdLF9jZWxsQ2xpY2s6ZnVuY3Rpb24oZCl7ZC5kZWZhdWx0UHJldmVudGVkfHx0aGlzLmZpcmUoImNlbGwtYWN0aXZhdGUiLHttb2RlbDp0aGlzLmluc3RhbmNlfSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1jZWxsIixwcm9wZXJ0aWVzOntoZWFkZXJUZW1wbGF0ZTpPYmplY3QscmVzaXphYmxlOkJvb2xlYW4sY29sdW1uUmVzaXppbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2lzRW1wdHlDaGFuZ2VkKF9pc0VtcHR5LCBpc0F0dGFjaGVkKSIsCiJfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIl0sbGlzdGVuZXJzOnttb3VzZWRvd246Il9jYW5jZWxNb3VzZURvd25PblJlc2l6ZSIsbW91c2Vtb3ZlOiJfZW5hYmxlRHJhZyIsbW91c2VvdXQ6Il9kaXNhYmxlRHJhZyIsdG91Y2hzdGFydDoiX29uVG91Y2hTdGFydCIsdG91Y2htb3ZlOiJfb25Ub3VjaE1vdmUiLHRvdWNoZW5kOiJfb25Ub3VjaEVuZCIsY29udGV4dG1lbnU6Il9vbkNvbnRleHRNZW51In0sX29uQ29udGV4dE1lbnU6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0JiZkLnByZXZlbnREZWZhdWx0KCl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24oZCl7ZC50YXJnZXQhPT10aGlzLl9yZXNpemVIYW5kbGUmJnRoaXMudGFyZ2V0LmNvbHVtblJlb3JkZXJpbmdBbGxvd2VkJiYodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlci5iaW5kKHRoaXMsZCksMTAwKSl9LF9zdGFydFJlb3JkZXI6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0PQp0aGlzLl9nZXRHaG9zdCgpO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdzdGFydCIse2J1YmJsZXM6ITB9KTt0aGlzLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3Jlb3JkZXJYWT17eDpkLnRvdWNoZXNbMF0uY2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQseTpkLnRvdWNoZXNbMF0uY2xpZW50WS10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH07dGhpcy5fdXBkYXRlR2hvc3RQb3NpdGlvbihkLnRvdWNoZXNbMF0uY2xpZW50WCxkLnRvdWNoZXNbMF0uY2xpZW50WSl9LF9vblRvdWNoTW92ZTpmdW5jdGlvbihkKXtpZih0aGlzLl9yZW9yZGVyR2hvc3Qpe2QucHJldmVudERlZmF1bHQoKTt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdvdmVyIix7YnViYmxlczohMH0pO2YuY2xpZW50WD1kLnRvdWNoZXNbMF0uY2xpZW50WDtmLmNsaWVudFk9CmQudG91Y2hlc1swXS5jbGllbnRZO3ZhciBoPXRoaXMuX2NvbnRlbnRGcm9tUG9pbnQoZi5jbGllbnRYLGYuY2xpZW50WSk7aCYmaC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24oZC50b3VjaGVzWzBdLmNsaWVudFgsZC50b3VjaGVzWzBdLmNsaWVudFkpfWVsc2UgY2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQpfSxfdXBkYXRlR2hvc3RQb3NpdGlvbjpmdW5jdGlvbihkLGYpe2QtPXRoaXMuX3Jlb3JkZXJYWS54O2Y9Zi10aGlzLl9yZW9yZGVyWFkueS01MDt2YXIgaD1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdHx8MCksaz1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wfHwwKSx0PXRoaXMuX3Jlb3JkZXJHaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdD1oLSh0LmxlZnQtZCkrInB4Ijt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wPQprLSh0LnRvcC1mKSsicHgifSxfb25Ub3VjaEVuZDpmdW5jdGlvbihkKXtjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dCk7dGhpcy5fcmVvcmRlckdob3N0JiYoZC5wcmV2ZW50RGVmYXVsdCgpLGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnZW5kIix7YnViYmxlczohMH0pLHRoaXMuZGlzcGF0Y2hFdmVudChkKSx0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLl9yZW9yZGVyR2hvc3Q9bnVsbCl9LF9jb250ZW50RnJvbVBvaW50OmZ1bmN0aW9uKGQsZil7aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpe3ZhciBoPXRoaXMudGFyZ2V0LiQuc2Nyb2xsZXI7aC50b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCEwKTtkPXRoaXMuZG9tSG9zdC5yb290LmVsZW1lbnRGcm9tUG9pbnQoZCxmKTtoLnRvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITEpO2lmKGQmJmQuZ2V0Q29udGVudENoaWxkcmVuKXJldHVybiBkLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/CiJzbG90IjoiY29udGVudCIpWzBdfWVsc2UgcmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZCxmKX0sX2dldEdob3N0OmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy50YXJnZXQuJC5zY3JvbGxlci4kLnJlb3JkZXJnaG9zdDtkLmlubmVyVGV4dD10aGlzLl9jZWxsQ29udGVudC5pbm5lclRleHQ7dmFyIGY9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fY2VsbENvbnRlbnQpOyJib3hTaXppbmcgZGlzcGxheSB3aWR0aCBoZWlnaHQgYmFja2dyb3VuZCBhbGlnbkl0ZW1zIHBhZGRpbmcgYm9yZGVyIGZsZXgtZGlyZWN0aW9uIG92ZXJmbG93Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oaCl7ZC5zdHlsZVtoXT1mW2hdfSx0aGlzKTtyZXR1cm4gZH0sX2VuYWJsZURyYWc6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudC5kcmFnZ2FibGU9dGhpcy50YXJnZXQuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQmJiF3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKX0sX2Rpc2FibGVEcmFnOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnQuZHJhZ2dhYmxlPQohMX0sX2NhbmNlbE1vdXNlRG93bk9uUmVzaXplOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT09dGhpcy5fcmVzaXplSGFuZGxlJiZkLnByZXZlbnREZWZhdWx0KCl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe2Q/KHRoaXMuX3Jlc2l6ZUhhbmRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLl9yZXNpemVIYW5kbGUuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGUiKSx0aGlzLmxpc3Rlbih0aGlzLl9yZXNpemVIYW5kbGUsInRyYWNrIiwiX29uVHJhY2siKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9yZXNpemVIYW5kbGUpKTp0aGlzLl9yZXNpemVIYW5kbGUmJih0aGlzLnVubGlzdGVuKHRoaXMuX3Jlc2l6ZUhhbmRsZSwidHJhY2siLCJfb25UcmFjayIpLFBvbHltZXIuZG9tKHRoaXMpLnJlbW92ZUNoaWxkKHRoaXMuX3Jlc2l6ZUhhbmRsZSkpfSxfb25UcmFjazpmdW5jdGlvbihkKXt0aGlzLmNvbHVtblJlc2l6aW5nPQohMDt2YXIgZj10aGlzLmNvbHVtbjsidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWYubG9jYWxOYW1lJiYoZj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLl9jaGlsZENvbHVtbnMsMCkuc29ydChmdW5jdGlvbih0LGwpe3JldHVybiB0Ll9vcmRlci1sLl9vcmRlcn0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5oaWRkZW59KS5wb3AoKSk7dmFyIGg9dGhpcy5fZ2V0SGVhZGVyQ2VsbEJ5Q29sdW1uKGYpO2lmKGgub2Zmc2V0V2lkdGgpe3ZhciBrPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGguX2NlbGxDb250ZW50KTtmLndpZHRoPU1hdGgubWF4KDEwK3BhcnNlSW50KGsucGFkZGluZ0xlZnQpK3BhcnNlSW50KGsucGFkZGluZ1JpZ2h0KSxoLm9mZnNldFdpZHRoK2QuZGV0YWlsLngtaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkrInB4IjtmLmZsZXhHcm93PTB9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCIpKS5zb3J0KGZ1bmN0aW9uKHQsCmwpe3JldHVybiB0LmNvbHVtbi5fb3JkZXItbC5jb2x1bW4uX29yZGVyfSkuZm9yRWFjaChmdW5jdGlvbih0LGwscCl7bDxwLmluZGV4T2YoaCkmJih0LmNvbHVtbi53aWR0aD10Lm9mZnNldFdpZHRoKyJweCIsdC5jb2x1bW4uZmxleEdyb3c9MCl9KTt0aGlzLmNvbHVtblJlc2l6aW5nJiYiZW5kIj09PWQuZGV0YWlsLnN0YXRlJiYodGhpcy5jb2x1bW5SZXNpemluZz0hMSk7dGhpcy5maXJlKCJjb2x1bW4tcmVzaXppbmciKX0sX2dldEhlYWRlckNlbGxCeUNvbHVtbjpmdW5jdGlvbihkKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihmKXtyZXR1cm4gZi5jb2x1bW49PT1kfSlbMF19LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dm9pZCAwIT09CmQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItY2VsbCIscHJvcGVydGllczp7Zm9vdGVyVGVtcGxhdGU6T2JqZWN0fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9pc0VtcHR5Q2hhbmdlZChfaXNFbXB0eSwgaXNBdHRhY2hlZCkiXSxfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZvaWQgMCE9PWQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIixiZWhhdmlvcnM6W2JdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyIixwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRvcDpOdW1iZXIsX2NvbHVtbnM6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlKSIsIl90b3BDaGFuZ2VkKHRvcCkiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fY29sdW1ucz1iW2IubGVuZ3RoLTFdfSxfdG9wQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnN0eWxlLnRvcD1iKyJweCJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIiLHByb3BlcnRpZXM6e3Njcm9sbFRhcmdldDp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zY3JvbGxUYXJnZXRDaGFuZ2VkIn0scGFzc3Rocm91Z2g6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3Njcm9sbDoiX3N5bmNTY3JvbGxUYXJnZXQifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuZG9tSG9zdCwibW91c2Vtb3ZlIiwiX29uTW91c2VNb3ZlIik7dGhpcy5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZz0idG91Y2gifSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5kb21Ib3N0LCJtb3VzZW1vdmUiLCJfb25Nb3VzZU1vdmUiKX0sX3Njcm9sbFRhcmdldENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZ0aGlzLnVubGlzdGVuKGQsInNjcm9sbCIsIl9zeW5jT3V0ZXJTY3JvbGxlciIpO3RoaXMubGlzdGVuKGIsCiJzY3JvbGwiLCJfc3luY091dGVyU2Nyb2xsZXIiKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3RoaXMucGFzc3Rocm91Z2g9Yi5vZmZzZXRZPD10aGlzLmNsaWVudEhlaWdodCYmYi5vZmZzZXRYPD10aGlzLmNsaWVudFdpZHRofSxfc3luY091dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0fHwodGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITAsdGhpcy5zY3JvbGxUb3A9dGhpcy5kb21Ib3N0Ll9zY3JvbGxUb3AsdGhpcy5zY3JvbGxMZWZ0PXRoaXMuZG9tSG9zdC5fc2Nyb2xsTGVmdCk7dGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldD0hMX0sX3N5bmNTY3JvbGxUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcnx8KHRoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXQ9ITAsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxMZWZ0LAp0aGlzLmRvbUhvc3QuX3Njcm9sbEhhbmRsZXIoKSk7dGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZm9jdXNhYmxlLWNlbGwtY29udGFpbmVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcj17cHJvcGVydGllczp7Zm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2ZvY3VzZWRSb3c6T2JqZWN0LF9mb2N1c2VkUm93SW5kZXg6TnVtYmVyLF9mb2N1c2VkQ2VsbDpPYmplY3QsX2ZvY3VzZWRDZWxsSW5kZXg6TnVtYmVyLF9sYXN0Rm9jdXNlZENlbGw6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYW5ub3VuY2VGb2N1c2VkQ2VsbChfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2Rpc3BhdGNoRXZlbnRzKF9mb2N1c2VkQ2VsbCwgZm9jdXNlZCkiLCJfZm9jdXNlZENlbGxDaGFuZ2VkKF9mb2N1c2VkUm93SW5kZXgsIF9mb2N1c2VkQ2VsbEluZGV4KSJdLF9hbm5vdW5jZUZvY3VzZWRDZWxsOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdGhpcy5kb21Ib3N0Lm5hdmlnYXRpbmcmJmQmJihkPVBvbHltZXIuRWxlbWVudD9iLl9jZWxsQ29udGVudC5nZXRBdHRyaWJ1dGUoInNsb3QiKToKYi5fY2VsbENvbnRlbnQuaWQsInZhYWRpbi1ncmlkLXRhYmxlLWJvZHkiIT09dGhpcy5pc3x8Yi5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIil8fChiPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oYi5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGIpLGQ9dGhpcy5kb21Ib3N0LiQuaGVhZGVyLmxhc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bYl0uX2NlbGxDb250ZW50LmlkKyIgIitkKSx0aGlzLmRvbUhvc3QuJC5mb290ZXJGb2N1c1RyYXAuYWN0aXZlVGFyZ2V0PWQpfSxfZGlzcGF0Y2hFdmVudHM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c291dCIpKSx0aGlzLl9sYXN0Rm9jdXNlZENlbGw9dm9pZCAwKSwKZCYmKGIuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzaW4iKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPWIpKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oZixoKXtmLmZvY3VzZWQ9aD09PWI7Zi5mb2N1c2VkJiYodGhpcy5fZm9jdXNlZFJvdz1mLHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9TWF0aC5taW4oZCxmLmNoaWxkcmVuLmxlbmd0aC0xKSx0aGlzLl9mb2N1c2VkQ2VsbD1mLmNoaWxkcmVuW3RoaXMuX2ZvY3VzZWRDZWxsSW5kZXhdKTtmLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oayx0KXtrLmZvY3VzZWQ9dD09PXRoaXMuX2ZvY3VzZWRDZWxsSW5kZXh9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sZm9jdXNMZWZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9CnRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5tYXgoMCxiLmluZGV4T2YodGhpcy5fZm9jdXNlZENlbGxJbmRleCktMSldKX19LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMSx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKX0sX3Zpc2libGVDZWxsSW5kZXhlczpmdW5jdGlvbigpe3ZhciBiPVtdO2lmKHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuY2hpbGRyZW4pe2Zvcih2YXIgZD10aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmhpZGRlbnx8ZFtmXT09PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfHxiLnB1c2goZik7Yi5zb3J0KGZ1bmN0aW9uKGgsayl7cmV0dXJuIGRbaF0uY29sdW1uLl9vcmRlcjxkW2tdLmNvbHVtbi5fb3JkZXI/LTE6MX0pfXJldHVybiBifSwKZm9jdXNQYWdlRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMTAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LGZvY3VzUGFnZVVwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEwKX0sZm9jdXNSaWdodDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5taW4oYi5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpKzEsYi5sZW5ndGgtMSldKX19LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSl9LGZvY3VzSG9tZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iWzBdKX19LGZvY3VzRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9dGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxiLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YltiLmxlbmd0aC0xXSl9fSxmb2N1c0ZpcnN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PTA7dGhpcy5mb2N1c0hvbWUoKX0sZm9jdXNMYXN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PXRoaXMuY2hpbGRyZW4ubGVuZ3RoLTE7dGhpcy5mb2N1c0VuZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWZvb3Rlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRhcmdldDpPYmplY3QsX3Jvd3M6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlLCB0YXJnZXQpIiwiX3Jvd3NDaGFuZ2VkKF9yb3dzKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe3RoaXMuX3Jvd3MmJnRoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtQb2x5bWVyLmRvbShsKS5pbm5lckhUTUw9IiJ9KTtmb3IodmFyIGg9W10saz0wO2s8ZC5sZW5ndGg7aysrKXt2YXIgdD10aGlzLl9jcmVhdGVSb3coKTt0LnRhcmdldD1mO3QuX2lzQ29sdW1uUm93PWs9PWQubGVuZ3RoLTE7dC5jb2x1bW5zPWRba107aC5wdXNoKHQpfXRoaXMuX3Jvd3M9InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciI9PT10aGlzLmxvY2FsTmFtZT9oOmgucmV2ZXJzZSgpfX0sX3Jvd3NDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0KIiI7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpfS5iaW5kKHRoaXMpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiLGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLF9jcmVhdGVSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZFJvdyhfZm9jdXNlZFJvdykiXSxfYW5ub3VuY2VGb2N1c2VkUm93OmZ1bmN0aW9uKGQpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6IlJvdyAiKyhkLmluZGV4KzEpKyIgb2YgIisKdGhpcy5kb21Ib3N0LnNpemV9KX0sX21vdmVGb2N1c1RvRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkQ2VsbC5mb2N1c2VkPSExO3RoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsLmZvY3VzZWQ9ITA7dGhpcy5fZm9jdXNlZENlbGw9dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LF9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9jdXNlZFJvdyYmdGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGwmJnRoaXMuX2ZvY3VzZWRDZWxsIT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpP3RoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKTp0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5kb21Ib3N0LnNpemUtMSl9LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93JiYKdGhpcy5fZm9jdXNlZENlbGw9PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbD90aGlzLl9mb2N1c2VkQ2VsbENoYW5nZWQodGhpcy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpOih0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSksdGhpcy5fZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsKCkmJnRoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmRvbUhvc3Quc2l6ZS0xO3RoaXMuZm9jdXNFbmQoKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oaCl7aC5mb2N1c2VkPWguaW5kZXg9PT1kO2guaW5kZXg9PT1kJiYodGhpcy5fZm9jdXNlZFJvdz0KaCx0aGlzLl9mb2N1c2VkQ2VsbD1oLmNoaWxkcmVuW2ZdKTtoLml0ZXJhdGVDZWxscyhmdW5jdGlvbihrLHQpe2suZm9jdXNlZD10PT09Zn0pfS5iaW5kKHRoaXMpKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIixob3N0QXR0cmlidXRlczp7cm9sZToiZ3JpZGNlbGwifSxwcm9wZXJ0aWVzOnthY3RpdmVUYXJnZXQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWN0aXZlVGFyZ2V0Q2hhbmdlZCJ9fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3ByaW1hcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIucHJpbWFyeSIpO3RoaXMuX3NlY29uZGFyeT1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIi5zZWNvbmRhcnkiKTtpZihQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvd3x8UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fc2Vjb25kYXJ5KSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9wcmltYXJ5KX0sZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkIT09dGhpcy5fcHJpbWFyeT90aGlzLl9wcmltYXJ5LmZvY3VzKCk6CnRoaXMuX3NlY29uZGFyeS5mb2N1cygpfSxfb25CYWl0Rm9jdXM6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNlZD1iLnRhcmdldDt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWdhaW5lZCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9LTEpfSxfb25CYWl0Qmx1cjpmdW5jdGlvbigpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseXx8KHRoaXMuZmlyZSgiZm9jdXMtbG9zdCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9MCl9LF9hY3RpdmVUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMDt0aGlzLl9mb2N1c2VkPT09dGhpcy5fcHJpbWFyeT8odGhpcy5fc2Vjb25kYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiKSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7CnRoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX0sX3JlYW5ub3VuY2U6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3NlY29uZGFyeS5mb2N1cygpKToodGhpcy5fcHJpbWFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSExfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXJvdy5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGNvbHVtbnM6QXJyYXksaW5kZXg6TnVtYmVyLGNlbGxzOnt2YWx1ZTpbXX0sdGFyZ2V0Ok9iamVjdCxleHBhbmRlZDp7dmFsdWU6ITF9LGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGl0ZW06T2JqZWN0LHNlbGVjdGVkOntyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9yb3dEZXRhaWxzQ2VsbDpPYmplY3Qscm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uc0NoYW5nZWQoY29sdW1ucywgdGFyZ2V0KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBjZWxscyk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGNlbGxzKTtfaXRlbUNoYW5nZWRGb3JEZXRhaWxzKGl0ZW0sIF9yb3dEZXRhaWxzQ2VsbCk7X3Jvd0RldGFpbHNDaGFuZ2VkKGV4cGFuZGVkLCByb3dEZXRhaWxzVGVtcGxhdGUsIHRhcmdldCk7X3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgaW5kZXgpO19yb3dEZXRhaWxzQ2VsbENoYW5nZWQoX3Jvd0RldGFpbHNDZWxsLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGNlbGxzKTtfc2VsZWN0ZWRDaGFuZ2VkRm9yRGV0YWlscyhzZWxlY3RlZCwgX3Jvd0RldGFpbHNDZWxsKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLXJvdyIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0saXRlcmF0ZUNlbGxzOmZ1bmN0aW9uKGQpe3RoaXMuY2VsbHMuZm9yRWFjaChkKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmZCh0aGlzLl9yb3dEZXRhaWxzQ2VsbCl9LF9yb3dEZXRhaWxzQ2hhbmdlZDpmdW5jdGlvbihkLGYsaCl7aWYodm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmdm9pZCAwIT09aCl7aWYoZCl7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpO2suc2V0QXR0cmlidXRlKCJkZXRhaWxzY2VsbCIsITApO2suZnJvemVuPSEwO2sudGFyZ2V0PWg7ay50ZW1wbGF0ZT1mO2sudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIiwhMCk7UG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChrKTsKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbD1rfWVsc2UgdGhpcy5fcm93RGV0YWlsc0NlbGwmJihQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0RldGFpbHNDZWxsKSx0aGlzLl9yb3dEZXRhaWxzQ2VsbD1udWxsKTt0aGlzLml0ZXJhdGVDZWxscyhmdW5jdGlvbih0KXt0LmV4cGFuZGVkPWR9KTt0aGlzLnRhcmdldC4kLnNjcm9sbGVyLl9mcm96ZW5DZWxsc0NoYW5nZWQoKX19LF91cGRhdGVSb3dWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49dGhpcy5jZWxscy5ldmVyeShmdW5jdGlvbihkKXtyZXR1cm4gZC5faXNFbXB0eX0pfSxfcm93RGV0YWlsc0NlbGxDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi4kLnNjcm9sbGVyLl91cGRhdGUoKX0sX3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGQ/KGQuaW5kZXg9CmYsUG9seW1lci5kb20uZmx1c2goKSx0aGlzLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpKTp0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209IiIpfSx1cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXImJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCYmdGhpcy50YXJnZXQuX29ic2VydmVyLmZsdXNoKCksdGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuc3R5bGUucGFkZGluZ0JvdHRvbT10aGlzLl9yb3dEZXRhaWxzQ2VsbC5zdHlsZS5oZWlnaHQ9dGhpcy5fcm93RGV0YWlsc0NlbGwuY2xpZW50SGVpZ2h0KyJweCIpfSxfY29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9IiI7dmFyIGg9W107ZC5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciB0PQoiXyIrdGhpcy5pcy5yZXBsYWNlKC8tL2csIl8iKSsiX2NlbGxzIjt0PWtbdF09a1t0XXx8W107dmFyIGw9dC5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIVBvbHltZXIuZG9tKG0pLnBhcmVudE5vZGV9KVswXTtpZighbCl7bD10aGlzLl9jcmVhdGVDZWxsKCk7dmFyIHA9QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0aGlzLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJkb20tcmVwZWF0IiksZnVuY3Rpb24obSl7cmV0dXJuIW0ucmVzdGFtcH0pOyhwPXB8fCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93Ij09PXRoaXMuaXN8fCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Ij09PXRoaXMuaXMpfHx0LnB1c2gobCl9bC5pbmRleD10aGlzLmluZGV4O2wudGFyZ2V0PXRoaXMudGFyZ2V0O2wuX2lzQ29sdW1uUm93PXRoaXMuX2lzQ29sdW1uUm93O2wuY29sdW1uPWs7bC5leHBhbmRlZD10aGlzLmV4cGFuZGVkO1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGwpO2gucHVzaChsKX0uYmluZCh0aGlzKSk7CnRoaXMuY2VsbHM9aH19LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLmZvckVhY2goZnVuY3Rpb24oaCl7aC5pbmRleD1kfSl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLml0ZW09ZH0pfSxfaXRlbUNoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZiYmKGYuaXRlbT1kKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLnNlbGVjdGVkPWR9KX0sX3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHM6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmJiYoZi5zZWxlY3RlZD1kKX0sdXBkYXRlTGFzdENvbHVtbjpmdW5jdGlvbigpe3RoaXMuY2VsbHMuc2xpY2UoMCkuc29ydChmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb2x1bW4uX29yZGVyLWYuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24oZCxmLGgpe2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIixmPT09aC5sZW5ndGgtMSl9KX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciLGJlaGF2aW9yczpbYl0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93IixiZWhhdmlvcnM6W2JdLG9ic2VydmVyczpbIl91cGRhdGVSb3dWaXNpYmlsaXR5KGNvbHVtbnMpIl0sbGlzdGVuZXJzOnsiY2VsbC1lbXB0eS1jaGFuZ2VkIjoiX3VwZGF0ZVJvd1Zpc2liaWxpdHkifSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93IiwKYmVoYXZpb3JzOltiXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1mdW5jdGlvbigpe307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyPVBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10ZW1wbGF0aXplciIsYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlSW5zdGFuY2VzQ2hhbmdlZChfdGVtcGxhdGVJbnN0YW5jZXMuKiwgX3BhcmVudFBhdGhWYWx1ZXMuKikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50TW9kZWw9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH19LGNyZWF0ZUluc3RhbmNlOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgYj10aGlzLnN0YW1wKHt9KTsKdGhpcy5hZGRJbnN0YW5jZShiKTtyZXR1cm4gYn0sYWRkSW5zdGFuY2U6ZnVuY3Rpb24oYil7LTE9PT10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGIpJiZ0aGlzLnB1c2goIl90ZW1wbGF0ZUluc3RhbmNlcyIsYil9LHJlbW92ZUluc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMuc3BsaWNlKCJfdGVtcGxhdGVJbnN0YW5jZXMiLHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoYiksMSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe3RoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkfHwodGhpcy50ZW1wbGF0ZS5fdGVtcGxhdGl6ZWQ9ITAsdGhpcy50ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUpLHRoaXMuX3BhcmVudFByb3BzPXRoaXMuX3BhcmVudFByb3BzfHx7fSxQb2x5bWVyLkVsZW1lbnR8fE9iamVjdC5rZXlzKHRoaXMuX3BhcmVudFByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uKCl7fSx0aGlzKSl9LF9mb3J3YXJkSW5zdGFuY2VQcm9wOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT0KYlsiX18iK2QrIl9fIl0mJmJbIl9fIitkKyJfXyJdIT09ZiYmdGhpcy5maXJlKCJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIix7cHJvcDpkLHZhbHVlOmYsaW5zdDpifSl9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGIsZCxmKXswIT09ZC5pbmRleE9mKCJpdGVtLiIpfHx0aGlzLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudHx8dGhpcy5maXJlKCJpdGVtLWNoYW5nZWQiLHtpdGVtOmIuaXRlbSxwYXRoOmQuc3Vic3RyaW5nKDUpLHZhbHVlOmZ9KX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGIsZCxmKXt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQcm9wKGIsZCxmKTt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQYXRoKGIsZCxmKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGIsZCl7dGhpcy5fcGFyZW50UGF0aFZhbHVlc1tiXT1kO3RoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZXQoYixkKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihiLApkKXt0aGlzLnNldChbIl9wYXJlbnRQYXRoVmFsdWVzIixiXSxkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yubm90aWZ5UGF0aChiLGQpfSx0aGlzKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZm9yd2FyZFBhcmVudFByb3AoYixkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcyYmdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLm5vdGlmeVBhdGgoYixkKX0sdGhpcyl9LF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7aWYoIl90ZW1wbGF0ZUluc3RhbmNlcyI9PT1iLnBhdGgpe3ZhciBkPTA7dmFyIGY9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMubGVuZ3RofWVsc2UgaWYoIl90ZW1wbGF0ZUluc3RhbmNlcy5zcGxpY2VzIj09PWIucGF0aClkPWIudmFsdWUuaW5kZXgsZj1iLnZhbHVlLmFkZGVkQ291bnQ7ZWxzZSByZXR1cm47T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8Cnt9KS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2Zvcih2YXIgaz1kO2s8ZCtmO2srKyl0aGlzLl90ZW1wbGF0ZUluc3RhbmNlc1trXS5zZXQoaCx0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2hdKX0sdGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtcm93LWRldGFpbHMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuUm93RGV0YWlsc0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntleHBhbmRlZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkIn0sb2JzZXJ2ZXJzOlsiX2V4cGFuZGVkSXRlbXNDaGFuZ2VkKGV4cGFuZGVkSXRlbXMuKiwgZGF0YVByb3ZpZGVyKSIsIl9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkKF9yb3dEZXRhaWxzVGVtcGxhdGUpIl0sX2V4cGFuZGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHRoaXMuX2ZsdXNoSXRlbXNEZWJvdW5jZXIoKSx0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuZXhwYW5kZWQ9dGhpcy5faXNFeHBhbmRlZChmLml0ZW0pfS5iaW5kKHRoaXMpKSl9LApfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD1uZXcgdmFhZGluLmVsZW1lbnRzLmdyaWQuVGVtcGxhdGl6ZXI7ZC5kYXRhSG9zdD10aGlzLmRhdGFIb3N0O2QuX2luc3RhbmNlUHJvcHM9e2V4cGFuZGVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITB9O1BvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoZCk7ZC50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9ZH0sX2lzRXhwYW5kZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZXhwYW5kZWRJdGVtcyYmLTEhPT10aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihiKX0sZXhwYW5kSXRlbTpmdW5jdGlvbihiKXt0aGlzLl9pc0V4cGFuZGVkKGIpfHx0aGlzLnB1c2goImV4cGFuZGVkSXRlbXMiLGIpfSxjb2xsYXBzZUl0ZW06ZnVuY3Rpb24oYil7dGhpcy5faXNFeHBhbmRlZChiKSYmdGhpcy5zcGxpY2UoImV4cGFuZGVkSXRlbXMiLHRoaXMuZXhwYW5kZWRJdGVtcy5pbmRleE9mKGIpLDEpfSwKX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkRXhwYW5kZWQ6ZnVuY3Rpb24oYil7ImV4cGFuZGVkIj09PWIuZGV0YWlsLnByb3AmJihiLmRldGFpbC52YWx1ZT90aGlzLmV4cGFuZEl0ZW0oYi5kZXRhaWwuaW5zdC5pdGVtKTp0aGlzLmNvbGxhcHNlSXRlbShiLmRldGFpbC5pbnN0Lml0ZW0pLGIuc3RvcFByb3BhZ2F0aW9uKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcj17bGlzdGVuZXJzOnsiaXRlbS1jaGFuZ2VkIjoiX3RlbXBsYXRlSXRlbUNoYW5nZWQifSxwcm9wZXJ0aWVzOntwYWdlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAsb2JzZXJ2ZXI6Il9wYWdlU2l6ZUNoYW5nZWQifSxkYXRhUHJvdmlkZXI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2RhdGFQcm92aWRlckNoYW5nZWQifSxfbG9hZGluZzpCb29sZWFuLF9jYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9wZW5kaW5nUmVxdWVzdHM6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sX3RlbXBsYXRlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5kZXRhaWwuaXRlbTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcykuY2hpbGRyZW4sZnVuY3Rpb24oZil7Zi5pdGVtPT09ZCYmZi5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oaCl7aC5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PQohMDtoLmluc3RhbmNlLm5vdGlmeVBhdGgoIml0ZW0uIitiLmRldGFpbC5wYXRoLGIuZGV0YWlsLnZhbHVlKTtoLl90ZW1wbGF0aXplci5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnQ9ITF9KX0pfSxfZ2V0Q2FjaGVkSXRlbTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9nZXRQYWdlRm9ySW5kZXgoYiksZj10aGlzLl9jYWNoZSYmdGhpcy5fY2FjaGVbZF07cmV0dXJuIGY/ZltiLWQqdGhpcy5wYWdlU2l6ZV06bnVsbH0sX2dldEl0ZW06ZnVuY3Rpb24oYixkKXt0aGlzLl91cGRhdGVJdGVtKGQsdGhpcy5fZ2V0Q2FjaGVkSXRlbShiKSk7dGhpcy5fZWFnZXJseUxvYWRQYWdlcygpO3ZhciBmPXRoaXMuX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCk7MDxmLmxlbmd0aCYmKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5kZWJvdW5jZSgibG9hZCIsZnVuY3Rpb24oKXtmLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5fbG9hZFBhZ2UoaCl9LmJpbmQodGhpcykpfSwxMDApKX0sX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIHZvaWQgMCE9PQp0aGlzLl9jYWNoZSYmdm9pZCAwIT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfdW5jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiB2b2lkIDAhPT10aGlzLl9jYWNoZSYmdm9pZCAwPT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfZWFnZXJseUxvYWRQYWdlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLnNsaWNlKDApO2lmKDA8Yi5sZW5ndGgpe2Iuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBmPmh9KTt2YXIgZD1NYXRoLm1pbihiW2IubGVuZ3RoLTFdKzEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKHRoaXMuc2l6ZS90aGlzLnBhZ2VTaXplKS0xKSk7dGhpcy5fbG9hZFBhZ2UoTWF0aC5tYXgoMCxiWzBdLTEpKTt0aGlzLl9sb2FkUGFnZShkKX19LF9wYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fZ2V0UGFnZUZvckluZGV4KHRoaXMuJC5zY3JvbGxlci5maXJzdFZpc2libGVJbmRleCsKdGhpcy4kLnNjcm9sbGVyLl92aWR4T2Zmc2V0KV0uY29uY2F0KHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIuaW5kZXh9KS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2dldFBhZ2VGb3JJbmRleChiLmluZGV4KX0uYmluZCh0aGlzKSkpLnJlZHVjZShmdW5jdGlvbihiLGQpey0xPT09Yi5pbmRleE9mKGQpJiZiLnB1c2goZCk7cmV0dXJuIGJ9LFtdKX0sX3VwZGF0ZUl0ZW1zOmZ1bmN0aW9uKGIsZCl7Zm9yKHZhciBmPTA7Zjx0aGlzLnBhZ2VTaXplO2YrKyl7dmFyIGg9dGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYip0aGlzLnBhZ2VTaXplK2ZdO2gmJih0aGlzLl91cGRhdGVJdGVtKGgsZFtmXSksdGhpcy5kZWJvdW5jZSgidXBkYXRlLWhlaWdodHMiLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVNZXRyaWNzKCk7dGhpcy4kLnNjcm9sbGVyLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVTY3JvbGxlclNpemUoKX0sCjEpKX19LF9sb2FkUGFnZTpmdW5jdGlvbihiLGQpe2Q9ZHx8dGhpcy5fdXBkYXRlSXRlbXMuYmluZCh0aGlzKTtpZighdGhpcy5fY2FjaGVbYl0mJiF0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl0mJnRoaXMuZGF0YVByb3ZpZGVyKXt0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl09ITA7dmFyIGY9e3BhZ2U6YixwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpfTt0aGlzLmRhdGFQcm92aWRlcihmLGZ1bmN0aW9uKGgpe3RoaXMuX2NhY2hlW2JdPWg7ZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXTtkKGIsaCk7dGhpcy5fbG9hZGluZz0wPHRoaXMuX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGg7dGhpcy5kZWJvdW5jZSgiY2hlY2stc2l6ZSIsdGhpcy5fY2hlY2tTaXplLDJFMyl9LmJpbmQodGhpcykpfX0sX2dldFBhZ2VGb3JJbmRleDpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5mbG9vcihiL3RoaXMucGFnZVNpemUpfSwKY2xlYXJDYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NhY2hlPXt9O3RoaXMuX3BlbmRpbmdSZXF1ZXN0cz17fTt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YSYmdGhpcy4kLnNjcm9sbGVyLl91cGRhdGUoKTt0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCl9LF9mbHVzaEl0ZW1zRGVib3VuY2VyOmZ1bmN0aW9uKCl7dGhpcy5mbHVzaERlYm91bmNlcigibG9hZCIpfSxfcGFnZVNpemVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmYiE9PWQmJnRoaXMuY2xlYXJDYWNoZSgpfSxfY2hlY2tTaXplOmZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5zaXplJiZjb25zb2xlLndhcm4oJ1RoZSBceDNjdmFhZGluLWdyaWRceDNlIG5lZWRzIGEgdmFsdWUgZm9yICJzaXplIiBwcm9wZXJ0eSBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuJyl9LF9kYXRhUHJvdmlkZXJDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGF8fAoodGhpcy5fbG9hZGluZz0hMCx0aGlzLl9sb2FkUGFnZSgwLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGE9ITB9LmJpbmQodGhpcykpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNlbGVjdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5TZWxlY3Rpb25CZWhhdmlvcj17cHJvcGVydGllczp7c2VsZWN0ZWRJdGVtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbXNDaGFuZ2VkKHNlbGVjdGVkSXRlbXMuKikiXSxsaXN0ZW5lcnM6eyJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIjoiX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uIn0sX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uOmZ1bmN0aW9uKGIpe2lmKCJzZWxlY3RlZCI9PT1iLmRldGFpbC5wcm9wKXt2YXIgZD1iLmRldGFpbC5pbnN0Lml0ZW07KHRoaXMuX2lzU2VsZWN0ZWQoZCk/dGhpcy5kZXNlbGVjdEl0ZW06dGhpcy5zZWxlY3RJdGVtKS5iaW5kKHRoaXMpKGQpO3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6KHRoaXMuX2lzU2VsZWN0ZWQoZCk/IlNlbGVjdGVkIjoiRGVzZWxlY3RlZCIpKyIgUm93ICIrCihiLmRldGFpbC5pbnN0LmluZGV4KzEpKyIgb2YgIit0aGlzLnNpemV9KTtiLnN0b3BQcm9wYWdhdGlvbigpfX0sX2lzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcyYmLTE8dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYil9LHNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTt0aGlzLl9pc1NlbGVjdGVkKGIpfHx0aGlzLnB1c2goInNlbGVjdGVkSXRlbXMiLGIpfSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTtiPXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGIpOy0xPGImJnRoaXMuc3BsaWNlKCJzZWxlY3RlZEl0ZW1zIixiLDEpfSxfdG9nZ2xlSXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpOy0xPT09dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYik/dGhpcy5zZWxlY3RJdGVtKGIpOnRoaXMuZGVzZWxlY3RJdGVtKGIpfSxfdGFrZUl0ZW06ZnVuY3Rpb24oYil7cmV0dXJuIm51bWJlciI9PT0KdHlwZW9mIGImJjA8PWImJnRoaXMuaXRlbXMmJnRoaXMuaXRlbXMubGVuZ3RoPmI/dGhpcy5pdGVtc1tiXTpifSxfc2VsZWN0ZWRJdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYil7IXRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtc3x8InNlbGVjdGVkSXRlbXMiIT09Yi5wYXRoJiYic2VsZWN0ZWRJdGVtcy5zcGxpY2VzIiE9PWIucGF0aHx8dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5zZWxlY3RlZD10aGlzLl9pc1NlbGVjdGVkKGQuaXRlbSl9LmJpbmQodGhpcykpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQta2V5Ym9hcmQtbmF2aWdhdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiYXBwbGljYXRpb24iLHRhYmluZGV4OjB9LGtleUJpbmRpbmdzOnsiY3RybCtob21lIjoiX29uQ3RybEhvbWUiLCJjdHJsK2VuZCI6Il9vbkN0cmxFbmQiLGRvd246Il9vbkFycm93RG93biIsZW5kOiJfb25FbmQiLGVudGVyOiJfb25FbnRlciIsZXNjOiJfb25Fc2NhcGUiLGYyOiJfb25GMiIsaG9tZToiX29uSG9tZSIsbGVmdDoiX29uQXJyb3dMZWZ0IixwYWdlZG93bjoiX29uUGFnZURvd24iLHBhZ2V1cDoiX29uUGFnZVVwIixyaWdodDoiX29uQXJyb3dSaWdodCIsc3BhY2U6Il9vblNwYWNlIix0YWI6Il9vblRhYiIsdXA6Il9vbkFycm93VXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxwcm9wZXJ0aWVzOntfdmlydHVhbEZvY3VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3ZpcnR1YWxGb2N1c0NoYW5nZWQifSwKaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LG5hdmlnYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsImNlbGwtZm9jdXMiOiJfb25DZWxsRm9jdXMiLCJjZWxsLWNvbnRlbnQtZm9jdXMiOiJfb25DZWxsQ29udGVudEZvY3VzIn0scmVhZHk6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihiKXs5PT09Yi5rZXlDb2RlJiYodGhpcy5fdGFiYmVkPSEwKTs5PT09Yi5rZXlDb2RlJiZiLnNoaWZ0S2V5JiYodGhpcy5fc2hpZnRUYWJiZWQ9ITApfS5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oYil7OT09PWIua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMSk7OT09PWIua2V5Q29kZSYmYi5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPQohMSl9LmJpbmQodGhpcyksITApfSxfaXNGb290ZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kLmZvb3Rlci5fcm93cy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIWIuaGlkZGVufSkubGVuZ3RofSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3RhYmJlZCYmIXRoaXMuX3NoaWZ0VGFiYmVkJiZ0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKX0sX2FjdGl2YXRlTmF2aWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKX0sX29uRm9jdXNvdXQ6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nPXRoaXMubmF2aWdhdGluZz0hMX0sX29uRm9vdGVyRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLm5hdmlnYXRpbmc9ITA7dGhpcy5pbnRlcmFjdGluZz0hMTt0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy5fdmlydHVhbEZvY3VzfHwodGhpcy5fc2hpZnRUYWJiZWQ/dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/dGhpcy4kLmZvb3Rlcjp0aGlzLiQuaXRlbXM6CnRoaXMuJC5oZWFkZXIpfSxfdmlydHVhbEZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihkLmZvY3VzZWQ9ITEpO2ImJihiLl9mb2N1c2VkQ2VsbEluZGV4PWIuX2ZvY3VzZWRDZWxsSW5kZXh8fDAsYi5fZm9jdXNlZFJvd0luZGV4PWIuX2ZvY3VzZWRSb3dJbmRleHx8MCxiLmZvY3VzZWQ9ITAsYj09PXRoaXMuJC5pdGVtcyYmdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uVGFiOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmludGVyYWN0aW5nJiZ0aGlzLl92aXJ0dWFsRm9jdXMpaWYodGhpcy5uYXZpZ2F0aW5nKWlmKGIuZGV0YWlsLmtleWJvYXJkRXZlbnQuc2hpZnRLZXkpc3dpdGNoKHRoaXMuX3ZpcnR1YWxGb2N1cyl7Y2FzZSB0aGlzLiQuZm9vdGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaXRlbXM7Yi5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgdGhpcy4kLml0ZW1zOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaGVhZGVyO2IucHJldmVudERlZmF1bHQoKTsKYnJlYWs7Y2FzZSB0aGlzLiQuaGVhZGVyOnRoaXMuZm9jdXMoKSx0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2IucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl9pc0Zvb3RlclZpc2libGUoKT8odGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5mb290ZXIsYi5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9LDEpO2JyZWFrO2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHRoaXMuX2FjdGl2YXRlTmF2aWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKX0sX2lzQWJvdmVWaWV3cG9ydDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5maXJzdFZpc2libGVJbmRleD5ifSxfb25BcnJvd0Rvd246ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8CihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0Rvd24oKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfc2Nyb2xsUGFnZURvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlRG93bjpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXM/KGI9dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgsdGhpcy5fc2Nyb2xsUGFnZURvd24oKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCs9CnRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LWJ8fHRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZURvd24oKSl9LF9zY3JvbGxQYWdlVXA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3AtPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlVXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhiPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LAp0aGlzLl9zY3JvbGxQYWdlVXAoKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleC09Yi10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleHx8dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgsdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKTp0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNQYWdlVXAoKSl9LF9vbkFycm93VXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzVXAoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25BcnJvd1JpZ2h0OmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1JpZ2h0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sCl9vbkFycm93TGVmdDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMZWZ0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uSG9tZTpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNIb21lKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0VuZCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQ7CihiPWIucXVlcnlTZWxlY3RvcigiW2ZvY3VzLXRhcmdldF0iKXx8Yi5maXJzdEVsZW1lbnRDaGlsZCkmJmIuZm9jdXMoKX0sX29uRW50ZXI6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZz8iaW5wdXQiPT09Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQubG9jYWxOYW1lJiYidGV4dCI9PT1iLmRldGFpbC5rZXlib2FyZEV2ZW50LnRhcmdldC50eXBlJiZ0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6KGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0KCkpfSxfb25Fc2NhcGU6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nP3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTp0aGlzLm5hdmlnYXRpbmcmJih0aGlzLm5hdmlnYXRpbmc9ITEpfSxfb25GMjpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpfSwKX29uQ3RybEhvbWU6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRmlyc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25DdHJsRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0xhc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25TcGFjZTpmdW5jdGlvbihiKXtpZighdGhpcy5pbnRlcmFjdGluZyl7Yi5wcmV2ZW50RGVmYXVsdCgpO2I9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbDt2YXIgZD1iLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/InNsb3QiOiJjb250ZW50IilbMF0uZmlyc3RFbGVtZW50Q2hpbGQ7ZD9kLmNsaWNrKCk6dGhpcy5uYXZpZ2F0aW5nJiYKdGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6Yi5pbnN0YW5jZX0pfX0sX29uQ2VsbENvbnRlbnRGb2N1czpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nPSEwO3RoaXMuX29uQ2VsbEZvY3VzKGIpfSxfb25DZWxsRm9jdXM6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbC5jZWxsO3ZhciBkPWIucGFyZW50RWxlbWVudCxmPWQucGFyZW50RWxlbWVudCxoPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZikuY2hpbGRyZW4sZCk7Zj09PXRoaXMuJC5pdGVtcyYmKGg9ZC5pbmRleCk7Zi5fZm9jdXNlZFJvd0luZGV4PWg7Zi5fZm9jdXNlZENlbGxJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGIpO3RoaXMuX3ZpcnR1YWxGb2N1cz1mO2IuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpJiYoZi5fZm9jdXNlZENlbGxJbmRleD0wLGYuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LF9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCt0aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxTdGFydCxkPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4O3RoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcyYmKGQ8Ynx8ZD5iK3RoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxDb3VudCkmJih0aGlzLiQuc2Nyb2xsZXIuc2Nyb2xsVG9TY2FsZWRJbmRleChkKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsQ2hhbmdlZChkLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGxJbmRleCkpO3RoaXMuX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0KHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwpfSxfZW5zdXJlRWxlbWVudEluVmlld3BvcnQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMpe3ZhciBmPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLApoPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO2QuYm90dG9tPmY/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLmJvdHRvbS1mOmQudG9wPGgmJih0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWgpfWlmKCFiLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7Yj10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtmPXRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7aWYoaD10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3cucXVlcnlTZWxlY3RvcigiW2xhc3QtZnJvemVuXSIpKWY9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtkLnJpZ2h0PmI/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9ZC5yaWdodC1iOmQubGVmdDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9CmQubGVmdC1mKX19fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvckltcGwsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntfb3JkZXJCYXNlU2NvcGU6e3R5cGU6TnVtYmVyLHZhbHVlOjFFN319LGxpc3RlbmVyczp7ZHJhZ3N0YXJ0OiJfb25EcmFnU3RhcnQiLGRyYWdvdmVyOiJfb25EcmFnT3ZlciIsZHJhZ2VuZDoiX29uRHJhZ0VuZCJ9LG9ic2VydmVyczpbIl91cGRhdGVPcmRlcnMoY29sdW1uVHJlZSwgY29sdW1uVHJlZS4qKSJdLF91cGRhdGVPcmRlcnM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZiWzBdLmZvckVhY2goZnVuY3Rpb24oZixoKXtmLl9vcmRlcj0oaCsxKSp0aGlzLl9vcmRlckJhc2VTY29wZX0sdGhpcyl9LF9vbkRyYWdTdGFydDpmdW5jdGlvbihiKXtpZigidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWIudGFyZ2V0LmxvY2FsTmFtZSl7dmFyIGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoYi50YXJnZXQpO2QmJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsCiEwKSx0aGlzLl9kcmFnZ2VkQ29sdW1uPWQuY29sdW1uLHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCJhbGxvd2VkIiksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iZHJhZ2dpbmciLGIuZGF0YVRyYW5zZmVyJiYoYi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dCIsIiIpLGIuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiKSx0aGlzLl9hdXRvU2Nyb2xsZXIoKSl9fSxfc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzOmZ1bmN0aW9uKGIsZCl7QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGUpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe3JldHVybi9jb2x1bW4vLnRlc3QoZi5sb2NhbE5hbWUpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKGYsYil9LHRoaXMpLmZvckVhY2goZnVuY3Rpb24oZil7Zi5fcmVvcmRlclN0YXR1cz1kfSl9LF9vbkRyYWdPdmVyOmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2RyYWdnZWRDb2x1bW4pe3ZhciBkPQooUG9seW1lci5FbGVtZW50P2IuY29tcG9zZWRQYXRoKCk6UG9seW1lci5kb20oYikucGF0aCkuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09Zi5sb2NhbE5hbWV9KVswXTtkJiYoYi5wcmV2ZW50RGVmYXVsdCgpLGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoZCksKGQ9dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGQsdGhpcy5fZHJhZ2dlZENvbHVtbikpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKHRoaXMuX2RyYWdnZWRDb2x1bW4sZCkmJnRoaXMuX2lzU3dhcHBhYmxlQnlQb3NpdGlvbihkLGIuY2xpZW50WCkmJnRoaXMuX3N3YXBDb2x1bW5PcmRlcnModGhpcy5fZHJhZ2dlZENvbHVtbixkKSx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9Yi5jbGllbnRYKX19LF9hdXRvU2Nyb2xsZXI6ZnVuY3Rpb24oKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe3ZhciBiPXRoaXMuX2xhc3REcmFnQ2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Kwo1MCxkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC10aGlzLl9sYXN0RHJhZ0NsaWVudFgrNTA7MDxiP3RoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1iLzEwOjA8ZCYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0LT1kLzEwKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCl9dGhpcy5fZHJhZ2dlZENvbHVtbiYmdGhpcy5hc3luYyh0aGlzLl9hdXRvU2Nyb2xsZXIsMTApfSxfb25EcmFnRW5kOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMudG9nZ2xlQXR0cmlidXRlKCJyZW9yZGVyaW5nIiwhMSksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fbGFzdERyYWdDbGllbnRYPXRoaXMuX2RyYWdnZWRDb2x1bW49bnVsbCl9LF9pc1N3YXBBbGxvd2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiYmZCl7dmFyIGY9Yi5wYXJlbnRFbGVtZW50PT09ZC5wYXJlbnRFbGVtZW50LApoPWIuZnJvemVuPT09ZC5mcm96ZW47cmV0dXJuIGIhPT1kJiZmJiZofX0sX2lzU3dhcHBhYmxlQnlQb3NpdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyKS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGspe3JldHVybiBrLmNvbHVtbj09PWJ9KVswXSxoPXRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW3Jlb3JkZXItc3RhdHVzXHgzZGRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ+aC5sZWZ0P2Q+Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodC1oLndpZHRoOmQ8Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2gud2lkdGh9LF9nZXRDZWxsQnlDZWxsQ29udGVudDpmdW5jdGlvbihiKXtpZihQb2x5bWVyLkVsZW1lbnQpcmV0dXJuIGIuYXNzaWduZWRTbG90LnBhcmVudE5vZGU7CmI9UG9seW1lci5kb20oYikuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKVswXTtyZXR1cm4gUG9seW1lci5kb20oYikucGFyZW50Tm9kZX0sX3N3YXBDb2x1bW5PcmRlcnM6ZnVuY3Rpb24oYixkKXt2YXIgZj1iLl9vcmRlcjtiLl9vcmRlcj1kLl9vcmRlcjtkLl9vcmRlcj1mO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKTt0aGlzLl91cGRhdGVMYXN0Q29sdW1uKCl9LF9nZXRUYXJnZXRDb2x1bW46ZnVuY3Rpb24oYixkKXtpZihiJiZkKXtmb3IodmFyIGY9Yi5jb2x1bW47Zi5wYXJlbnRFbGVtZW50IT09ZC5wYXJlbnRFbGVtZW50JiZmIT09dGhpcy50YXJnZXQ7KWY9Zi5wYXJlbnRFbGVtZW50O3JldHVybiBmLnBhcmVudEVsZW1lbnQ9PT1kLnBhcmVudEVsZW1lbnQ/ZjpiLmNvbHVtbn19fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC9pcm9uLWxpc3QtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGw9ZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXTtyZXR1cm57aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7bWF4UGh5c2ljYWxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwfSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifX0sX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfcGh5c2ljYWxJbmRleEZvcktleTpudWxsLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCwKX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfaXRlbXNSZW5kZXJlZDohMSxfbGFzdFBhZ2U6bnVsbCxfbWF4UGFnZXM6MyxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtCnRoaXMuX3ZpZXdwb3J0SGVpZ2h0K3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcH0sX21pblZpcnR1YWxTdGFydDowLGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxfdmlydHVhbFN0YXJ0VmFsOjAsc2V0IF92aXJ0dWFsU3RhcnQoZil7dGhpcy5fdmlydHVhbFN0YXJ0VmFsPU1hdGgubWluKHRoaXMuX21heFZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLl9taW5WaXJ0dWFsU3RhcnQsZikpfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LF9waHlzaWNhbFN0YXJ0VmFsOjAsc2V0IF9waHlzaWNhbFN0YXJ0KGYpe3RoaXMuX3BoeXNpY2FsU3RhcnRWYWw9ZiV0aGlzLl9waHlzaWNhbENvdW50OzA+dGhpcy5fcGh5c2ljYWxTdGFydFZhbCYmKHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dGhpcy5fcGh5c2ljYWxDb3VudCt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsKTsKdGhpcy5fcGh5c2ljYWxFbmQ9KHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sX3BoeXNpY2FsQ291bnRWYWw6MCxzZXQgX3BoeXNpY2FsQ291bnQoZil7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD1mO3RoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx9LF9waHlzaWNhbEVuZDowLGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX29wdFBoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9tYXhQYWdlc30sCmdldCBfaXNWaXNpYmxlKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0JiYhKCF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aCYmIXRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCl7dmFyIGY9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ApO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoLGspe2YrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKTtpZihmPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiBrfSl8fDB9cmV0dXJuIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsKXt2YXIgZj10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCwKayl7aWYoZjx0aGlzLl9zY3JvbGxCb3R0b20pdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1rO2Vsc2UgcmV0dXJuITA7Zis9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGgpfSl9cmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWx9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKVsicGFkZGluZy10b3AiXXx8MCwxMCk7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0fSxfdXBkYXRlOmZ1bmN0aW9uKGYsaCl7dGhpcy5fYXNzaWduTW9kZWxzKGYpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoZik7aWYoaClmb3IoO2gubGVuZ3RoOylmPWgucG9wKCksdGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCk7CnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCl9LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbigpe2lmKDA9PT10aGlzLl92aWV3cG9ydEhlaWdodClyZXR1cm4hMTt2YXIgZj10aGlzLl9waHlzaWNhbFNpemVzLnJlZHVjZShmdW5jdGlvbihrLHQpe3JldHVybiBrKyh0fHwxMDApfSwwKSxoPWY+dGhpcy5fdmlld3BvcnRIZWlnaHQ7aWYoZj49dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZoKXJldHVybiExO2Y9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFNpemUvdGhpcy5fdmlld3BvcnRIZWlnaHQpOzA9PT1mP3RoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpKSk6dGhpcy5fbGFzdFBhZ2UhPT1mJiZoP1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsdGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyx0aGlzLl9pdGVtc1BlclJvdyksCjE2KSk6dGhpcy5fZGVib3VuY2VUZW1wbGF0ZSh0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC8odGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3BoeXNpY2FsQ291bnQpKnRoaXMuX21heFBhZ2VzLXRoaXMuX3BoeXNpY2FsQ291bnQpfHwxKSk7dGhpcy5fbGFzdFBhZ2U9ZjtyZXR1cm4hMH0sX2RlYm91bmNlVGVtcGxhdGU6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIixmKSl9LF9pbmNyZWFzZVBvb2w6ZnVuY3Rpb24oZil7dmFyIGg9dGhpcy5fcGh5c2ljYWxDb3VudDtmPU1hdGgubWluKHRoaXMuX3BoeXNpY2FsQ291bnQrZix0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LE1hdGgubWF4KHRoaXMubWF4UGh5c2ljYWxDb3VudCwyNSkpLWg7MD49Znx8KFtdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGYpKSwKW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbFNpemVzLEFycmF5KGYpKSx0aGlzLl9waHlzaWNhbENvdW50PWgrZix0aGlzLl91cGRhdGUoKSl9LF9yZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj0wPHRoaXMuX3ZpcnR1YWxDb3VudHx8MDx0aGlzLl9waHlzaWNhbENvdW50O3RoaXMuaXNBdHRhY2hlZCYmIXRoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2lzVmlzaWJsZSYmZiYmKHRoaXMuX2xhc3RQYWdlPTAsdGhpcy5fdXBkYXRlKCksdGhpcy5faXRlbXNSZW5kZXJlZD0hMCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oZixoKXt2YXIgayx0O2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZoKWZvcih0PTA7dDxoLmxlbmd0aDt0Kyspe3ZhciBsPWhbdF07dmFyIHA9dGhpcy5fY29tcHV0ZVZpZHgobCk7aWYobnVsbCE9KGs9Zi5jYWxsKHRoaXMsbCxwKSkpcmV0dXJuIGt9ZWxzZXtsPXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHA9dGhpcy5fdmlydHVhbFN0YXJ0O2w8dGhpcy5fcGh5c2ljYWxDb3VudDtsKyssCnArKylpZihudWxsIT0oaz1mLmNhbGwodGhpcyxsLHApKSlyZXR1cm4gaztmb3IobD0wO2w8dGhpcy5fcGh5c2ljYWxTdGFydDtsKysscCsrKWlmKG51bGwhPShrPWYuY2FsbCh0aGlzLGwscCkpKXJldHVybiBrfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGYpe3JldHVybiBmPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoZi10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrZn0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24oZil7dGhpcy5zY3JvbGxpbmcmJlBvbHltZXIuZG9tLmZsdXNoKCk7dmFyIGg9MCxrPTAsdD10aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCxsPXRoaXMuX3BoeXNpY2FsQXZlcmFnZTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCl7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXXx8MDt0aGlzLl9waHlzaWNhbFNpemVzW3BdPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0ub2Zmc2V0SGVpZ2h0OwpoKz10aGlzLl9waHlzaWNhbFNpemVzW3BdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3BdPzE6MH0sZik7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuX3BoeXNpY2FsU2l6ZT10aGlzLl9waHlzaWNhbFNpemUraC1rO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50IT09dCYmKHRoaXMuX3BoeXNpY2FsQXZlcmFnZT1NYXRoLnJvdW5kKChsKnQraCkvdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpKX0sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBmPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoKXt0aGlzLl9waHlzaWNhbEl0ZW1zW2hdLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoMCxmKTtmKz10aGlzLl9waHlzaWNhbFNpemVzW2hdfSl9LF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZXNbZl19LApfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihmKXtyZXR1cm4gZiV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBmPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7ZiYmKHRoaXMuX3BoeXNpY2FsVG9wLT1mLGR8fDA9PT10aGlzLl9waHlzaWNhbFRvcHx8dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxUb3AtZikpfSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihmKXt0aGlzLnNjcm9sbFRhcmdldCYmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcD1mKX0sX3VwZGF0ZVNjcm9sbGVyU2l6ZTpmdW5jdGlvbihmKXt0aGlzLl9lc3RTY3JvbGxIZWlnaHQ9dGhpcy5fcGh5c2ljYWxCb3R0b20rTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50LQp0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGY9KGY9Znx8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHR9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uZmx1c2goKTtmPU1hdGgubWluKE1hdGgubWF4KGYsMCksdGhpcy5fdmlydHVhbENvdW50LTEpO2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoZil8fGY+PXRoaXMuX21heFZpcnR1YWxTdGFydCl0aGlzLl92aXJ0dWFsU3RhcnQ9CmYtMTt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt0aGlzLl91cGRhdGVNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGg9dGhpcy5fcGh5c2ljYWxTdGFydCxrPXRoaXMuX3ZpcnR1YWxTdGFydCx0PTAsbD10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtrPGYmJnQ8PWw7KXQrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKSxoPShoKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsaysrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3QpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD0KbnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PXRoaXMuX3BoeXNpY2FsQXZlcmFnZT0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX3JlbmRlcigpO3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX3BoeXNpY2FsSXRlbXMmJnRoaXMuX2lzVmlzaWJsZSYmKHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KSl9LmJpbmQodGhpcyksMSkpfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihmKXtmPXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbZl07bnVsbCE9ZiYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW2ZdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCkpfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGYpe3JldHVybiBmPj0KdGhpcy5fdmlydHVhbFN0YXJ0JiZmPD10aGlzLl92aXJ0dWFsRW5kfSxfaXNJbmRleFZpc2libGU6ZnVuY3Rpb24oZil7cmV0dXJuIGY+PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJmY8PXRoaXMubGFzdFZpc2libGVJbmRleH19fSgpO3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3I9W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlIixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcixQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntzaXplOk51bWJlcixjb2x1bW5UcmVlOkFycmF5LGJpbmREYXRhOkZ1bmN0aW9uLHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNhZmFyaTp7dHlwZTpCb29sZWFuLHZhbHVlOi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LHNjcm9sbGJhcldpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpiLnN0eWxlLndpZHRoPSIxMDBweCI7Yi5zdHlsZS5oZWlnaHQ9IjEwMHB4IjtiLnN0eWxlLm92ZXJmbG93PSJzY3JvbGwiO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iLTk5OTlweCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD1iLm9mZnNldFdpZHRoLWIuY2xpZW50V2lkdGg7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTtyZXR1cm4gZH19LHRhcmdldDpPYmplY3QsaGFzRGF0YTpCb29sZWFufSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgX3BoeXNpY2FsSXRlbXMsIF9waHlzaWNhbENvdW50VmFsKSIsIl9zaXplQ2hhbmdlZChzaXplLCBiaW5kRGF0YSwgaGFzRGF0YSkiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChyb3dEZXRhaWxzVGVtcGxhdGUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwKYW5pbWF0aW9uZW5kOiJfb25BbmltYXRpb25FbmQiLCJjb2x1bW4tcmVzaXppbmciOiJfb25Db2x1bW5SZXNpemUifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuJD10aGlzLiR8fHt9O3RoaXMuJC5oZWFkZXI9dGhpcy5kb21Ib3N0LiQuaGVhZGVyO3RoaXMuJC5pdGVtcz10aGlzLmRvbUhvc3QuJC5pdGVtczt0aGlzLiQuZm9vdGVyPXRoaXMuZG9tSG9zdC4kLmZvb3Rlcn0sX29uQ29sdW1uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsdGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yKCJbY29sdW1uLXJlc2l6aW5nXSIpKTt0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oYil7L2FwcGVhci8udGVzdChiLmFuaW1hdGlvbk5hbWUpJiYodGhpcy5fcmVuZGVyKCksdGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljcygpLGIuc3RvcFByb3BhZ2F0aW9uKCkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7ImhlYWRlclRlbXBsYXRlIj09PQpiLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmhlYWRlcik7ImZvb3RlclRlbXBsYXRlIj09PWIuZGV0YWlsLnBhdGgmJnRoaXMudG9nZ2xlQXR0cmlidXRlKCJoYXMtdGVtcGxhdGVzIiwhMCx0aGlzLiQuZm9vdGVyKTsvZnJvemVufGhpZGRlbi8udGVzdChiLmRldGFpbC5wYXRoKSYmdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCk7ImhpZGRlbiI9PT1iLmRldGFpbC5wYXRoJiZ0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfaGlkZU91dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJiFkfSxfaGlkZVRhYmxlT3ZlcmZsb3c6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJmR9LF9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsZnVuY3Rpb24oaCl7aC5yb3dEZXRhaWxzVGVtcGxhdGU9CmJ9KX0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiYoUG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsdGhpcy5fdXBkYXRlKSx0aGlzLl9mcm96ZW5DZWxsc0NoYW5nZWQoKSx0aGlzLl9oYXNUZW1wbGF0ZXNDaGFuZ2VkKGIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCxmdW5jdGlvbihoKXtoLmNvbHVtbnM9YltiLmxlbmd0aC0xXX0pLHRoaXMuX2dyaWRSZXNpemVIYW5kbGVyKCksUG9seW1lci5kb20uZmx1c2godGhpcyksdGhpcy5fdXBkYXRlTGFzdENvbHVtbigpKX0sX3VwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZnVuY3Rpb24oYil7Yi51cGRhdGVMYXN0Q29sdW1uKCl9KX0sX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbFNpemVzJiYKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYygpO1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLiQuaGVhZGVyLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCYmdGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4KX0uYmluZCh0aGlzKSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0KyJweCIsZD10aGlzLiQuZm9vdGVyLmNsaWVudEhlaWdodCsicHgiO1t0aGlzLiQub3V0ZXJzaXplcix0aGlzLiQuZml4ZWRzaXplcix0aGlzLiQuaXRlbXNdLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zdHlsZS5ib3JkZXJUb3BXaWR0aD1iO2Yuc3R5bGUuYm9yZGVyQm90dG9tV2lkdGg9CmR9KX0sX2hhc1RlbXBsYXRlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9ITEsZj0hMTtiLmZvckVhY2goZnVuY3Rpb24oaCl7cmV0dXJuIGguZm9yRWFjaChmdW5jdGlvbihrKXtkPWR8fGsuaGVhZGVyVGVtcGxhdGU7Zj1mfHxrLmZvb3RlclRlbXBsYXRlfSl9KTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZCx0aGlzLiQuaGVhZGVyKTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZix0aGlzLiQuZm9vdGVyKX0sX2NyZWF0ZVBvb2w6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPUFycmF5KGIpLGY9MDtmPGI7ZisrKXt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciKTtoLnRhcmdldD10aGlzLmRvbUhvc3Q7ZFtmXT1oO2guc2V0QXR0cmlidXRlKCJoaWRkZW4iLCIiKTtQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmFwcGVuZENoaWxkKGgpfXJldHVybiBkfSxfc2l6ZUNoYW5nZWQ6ZnVuY3Rpb24oYiwKZCxmKXtpZih2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXt2YXIgaD10aGlzLl9zY3JvbGxUb3Asaz10aGlzLmZpcnN0VmlzaWJsZUluZGV4K3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbENvdW50PU1hdGgubWluKGIsMUU1KTt0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9O3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl92aWR4T2Zmc2V0PTA7dGhpcy5fcGh5c2ljYWxJdGVtc3x8KHRoaXMuX3BoeXNpY2FsQ291bnQ9TWF0aC5tYXgoMSxNYXRoLm1pbigyNSx0aGlzLl92aXJ0dWFsQ291bnQpKSx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX2NyZWF0ZVBvb2wodGhpcy5fcGh5c2ljYWxDb3VudCksdGhpcy5fcGh5c2ljYWxTaXplcz1BcnJheSh0aGlzLl9waHlzaWNhbENvdW50KSk7dGhpcy5faXRlbXNSZW5kZXJlZD0hMTt0aGlzLl9kZWJvdW5jZVRlbXBsYXRlKGZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyKCk7CnRoaXMuX3ZpZXdwb3J0SGVpZ2h0JiYodGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KE1hdGgubWluKGssdGhpcy5zaXplKSksdGhpcy5fc2Nyb2xsVG9wPWgsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLHRoaXMuZmx1c2hEZWJvdW5jZXIoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIpKX0pfX0sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbihiKXt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW09dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtfHx7fTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZCxmKXtkPXRoaXMuX3BoeXNpY2FsSXRlbXNbZF07ZC5pbmRleCYmZGVsZXRlIHRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbVtkLmluZGV4XTtkLmluZGV4PWYrdGhpcy5fdmlkeE9mZnNldDt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bZC5pbmRleF09ZDtkLnRvZ2dsZUF0dHJpYnV0ZSgib2RkIixkLmluZGV4JTIpO2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0cm93IixkLmluZGV4PT09dGhpcy5zaXplLTEpO2QudG9nZ2xlQXR0cmlidXRlKCJoaWRkZW4iLApkLmluZGV4Pj10aGlzLnNpemUpO3RoaXMuYmluZERhdGEoZC5pbmRleCxkKX0sYil9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKTt0aGlzLl9waHlzaWNhbFNpemVzJiYodGhpcy5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IudXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzKCl9KSx0aGlzLmRlYm91bmNlKCJ2YWFkaW4tZ3JpZC1yZXNpemluZyIsZnVuY3Rpb24oKXt0aGlzLl91cGRhdGUoKX0uYmluZCh0aGlzKSwxKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcj17cHJvcGVydGllczp7cmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ZnVuY3Rpb24oKXtpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMubG9jYWxOYW1lKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiBiJiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWIubG9jYWxOYW1lP2IucmVzaXphYmxlfHwhMTohMX19fSxoZWFkZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZvb3RlclRlbXBsYXRlOnt0eXBlOk9iamVjdH0sZnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxoaWRkZW46e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfb3JkZXI6TnVtYmVyLF9yZW9yZGVyU3RhdHVzOkJvb2xlYW59LG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2xhc3RGcm96ZW5DaGFuZ2VkKF9sYXN0RnJvemVuKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQpezA8PWQuYWRkZWROb2Rlcy5sZW5ndGgmJih0aGlzLmhlYWRlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpLHRoaXMuZm9vdGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCksdGhpcy50ZW1wbGF0ZT10aGlzLl9wcmVwYXJlQm9keVRlbXBsYXRlKCkpfXRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXI9UG9seW1lci5FbGVtZW50P25ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcyxiKTpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoYil9LF9wcmVwYXJlSGVhZGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuaGVhZGVyIil8fG51bGwsCnt9KX0sX3ByZXBhcmVGb290ZXJUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZS5mb290ZXIiKXx8bnVsbCx7fSl9LF9wcmVwYXJlQm9keVRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlOm5vdCguaGVhZGVyKTpub3QoLmZvb3RlcikiLHt9KSl9LF9wcmVwYXJlVGVtcGxhdGl6ZXI6ZnVuY3Rpb24oYixkKXtpZihiJiYhYi50ZW1wbGF0aXplcil7dmFyIGY9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2YuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtmLl9pbnN0YW5jZVByb3BzPWR8fGYuX2luc3RhbmNlUHJvcHM7Zi50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9Zn1yZXR1cm4gYn0sX3NlbGVjdEZpcnN0VGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKGIpLApmdW5jdGlvbihkKXtyZXR1cm4gUG9seW1lci5kb20oZCkucGFyZW50Tm9kZT09PXRoaXN9LmJpbmQodGhpcykpWzBdfSxfZmluZFRlbXBsYXRlOmZ1bmN0aW9uKGIpeyhiPXRoaXMuX3NlbGVjdEZpcnN0VGVtcGxhdGUoYikpJiZ0aGlzLmRhdGFIb3N0JiYoYi5fcm9vdERhdGFIb3N0PXRoaXMuZGF0YUhvc3QuX3Jvb3REYXRhSG9zdHx8dGhpcy5kYXRhSG9zdCk7cmV0dXJuIGJ9LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGVhZGVyVGVtcGxhdGUiLHZhbHVlOmJ9KX0sX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmb290ZXJUZW1wbGF0ZSIsdmFsdWU6Yn0pfSxfZmxleEdyb3dDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImZsZXhHcm93Iix2YWx1ZTpifSl9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6IndpZHRoIix2YWx1ZTpifSl9LF9sYXN0RnJvemVuQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJsYXN0RnJvemVuIix2YWx1ZTpifSl9fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnt3aWR0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IjEwMHB4In0sZmxleEdyb3c6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LHRlbXBsYXRlOnt0eXBlOk9iamVjdH19LG9ic2VydmVyczoiX2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X3dpZHRoQ2hhbmdlZCh3aWR0aCk7X3RlbXBsYXRlQ2hhbmdlZCh0ZW1wbGF0ZSk7X2Zyb3plbkNoYW5nZWQoZnJvemVuLCBpc0F0dGFjaGVkKTtfaGlkZGVuQ2hhbmdlZChoaWRkZW4pO19vcmRlckNoYW5nZWQoX29yZGVyKTtfcmVvcmRlclN0YXR1c0NoYW5nZWQoX3Jlb3JkZXJTdGF0dXMpO19yZXNpemFibGVDaGFuZ2VkKHJlc2l6YWJsZSkiLnNwbGl0KCI7IiksX2Zyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodm9pZCAwPT09dGhpcy5fb2xkRnJvemVuJiYhMT09PWJ8fHRoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJmcm96ZW4iLHZhbHVlOmJ9KSx0aGlzLl9vbGRGcm96ZW49Yil9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmYi50ZW1wbGF0aXplciYmUG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChiLnRlbXBsYXRpemVyKTt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJ0ZW1wbGF0ZSIsdmFsdWU6Yn0se2J1YmJsZXM6ITF9KX0sX2hpZGRlbkNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGlkZGVuIix2YWx1ZTpifSl9LF9vcmRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoib3JkZXIiLHZhbHVlOmJ9KX0sX3Jlb3JkZXJTdGF0dXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6InJlb3JkZXJTdGF0dXMiLHZhbHVlOmJ9KX0sX3Jlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6InJlc2l6YWJsZSIsdmFsdWU6Yn0pfX07dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLTIuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLWNvbHVtbiIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1hcnJheS1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2l0ZW1zOkFycmF5fSxvYnNlcnZlcnM6WyJfaXRlbXNDaGFuZ2VkKGl0ZW1zLCBpdGVtcy4qKSJdLF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5zaXplPShifHxbXSkubGVuZ3RoLHRoaXMuZGF0YVByb3ZpZGVyPXRoaXMuZGF0YVByb3ZpZGVyfHx0aGlzLl9hcnJheURhdGFQcm92aWRlcix0aGlzLmNsZWFyQ2FjaGUoKSl9LF9hcnJheURhdGFQcm92aWRlcjpmdW5jdGlvbihiLGQpe3ZhciBmPSh0aGlzLml0ZW1zfHxbXSkuc2xpY2UoMCk7dGhpcy5fY2hlY2tQYXRocyh0aGlzLl9maWx0ZXJzLCJmaWx0ZXJpbmciLGYpJiYoZj10aGlzLl9maWx0ZXIoZikpO3RoaXMuc2l6ZT1mLmxlbmd0aDtiLnNvcnRPcmRlcnMubGVuZ3RoJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX3NvcnRlcnMsInNvcnRpbmciLGYpJiYoZj1mLnNvcnQodGhpcy5fbXVsdGlTb3J0LmJpbmQodGhpcykpKTsKdmFyIGg9Yi5wYWdlKmIucGFnZVNpemU7ZChmLnNsaWNlKGgsaCtiLnBhZ2VTaXplKSxmLmxlbmd0aCl9LF9jaGVja1BhdGhzOmZ1bmN0aW9uKGIsZCxmKXtpZighZi5sZW5ndGgpcmV0dXJuITE7dmFyIGg9ITAsaztmb3IoayBpbiBiKXt2YXIgdD1iW2tdLnBhdGg7aWYodCYmLTEhPT10LmluZGV4T2YoIi4iKSl7dmFyIGw9dC5yZXBsYWNlKC9cLlteXC5dKiQvLCIiKTt2b2lkIDA9PT1Qb2x5bWVyLkJhc2UuZ2V0KGwsZlswXSkmJihjb25zb2xlLndhcm4oJ1BhdGggIicrdCsnIiB1c2VkIGZvciAnK2QrIiBkb2VzIG5vdCBleGlzdCBpbiBhbGwgb2YgdGhlIGl0ZW1zLCAiK2QrIiBpcyBkaXNhYmxlZC4iKSxoPSExKX19cmV0dXJuIGh9LF9tdWx0aVNvcnQ6ZnVuY3Rpb24oYixkKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oZil7cmV0dXJuImFzYyI9PT1mLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLGIpLFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLApkKSk6ImRlc2MiPT09Zi5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxkKSxQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxiKSk6MH0sdGhpcykucmVkdWNlKGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY/ZjpofSwwKX0sX25vcm1hbGl6ZUVtcHR5VmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PVt2b2lkIDAsbnVsbF0uaW5kZXhPZihiKT8iIjppc05hTihiKT9iLnRvU3RyaW5nKCk6Yn0sX2NvbXBhcmU6ZnVuY3Rpb24oYixkKXtiPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoYik7ZD10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGQpO3JldHVybiBiPGQ/LTE6Yj5kPzE6MH0sX2ZpbHRlcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIDA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoUG9seW1lci5CYXNlLmdldChmLnBhdGgsZCkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGYudmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKX0uYmluZCh0aGlzKSkubGVuZ3RofSwKdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1keW5hbWljLWNvbHVtbnMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcj17cmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKX0sX2hhc0NvbHVtbkdyb3VwczpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWJbZF0ubG9jYWxOYW1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0Q2hpbGRDb2x1bW5zOmZ1bmN0aW9uKGIpe3JldHVybiBQb2x5bWVyLmRvbShiKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIil9LF9mbGF0dGVuQ29sdW1uR3JvdXBzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWQubG9jYWxOYW1lP3RoaXMuX2dldENoaWxkQ29sdW1ucyhkKTpbZF19LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb25jYXQoZil9LFtdKX0sX2dldENvbHVtblRyZWU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZD10aGlzLnF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIik7Oyl7Yi5wdXNoKGQpO2lmKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoZCkpYnJlYWs7ZD10aGlzLl9mbGF0dGVuQ29sdW1uR3JvdXBzKGQpfXJldHVybiBifSxfdXBkYXRlQ29sdW1uVHJlZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyhiLHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT1iKX0sX2FkZE5vZGVPYnNlcnZlcjpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBmLm5vZGVUeXBlPT09Ck5vZGUuRUxFTUVOVF9OT0RFJiYvXnZhYWRpbi1ncmlkLShjb2x1bW58c2VsZWN0aW9uKS9pLnRlc3QoZi5sb2NhbE5hbWUpfSgwPGIuYWRkZWROb2Rlcy5maWx0ZXIoZCkubGVuZ3RofHwwPGIucmVtb3ZlZE5vZGVzLmZpbHRlcihkKS5sZW5ndGgpJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7KFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdykmJlBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuJC5mb290ZXJGb2N1c1RyYXApO3RoaXMuZGVib3VuY2UoImNoZWNrLWltcG9ydHMiLHRoaXMuX2NoZWNrSW1wb3J0cywyRTMpfS5iaW5kKHRoaXMpKX0sX2FycmF5RXF1YWxzOmZ1bmN0aW9uKGIsZCl7aWYoIWJ8fCFkfHxiLmxlbmd0aCE9ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBmPTAsaD1iLmxlbmd0aDtmPGg7ZisrKWlmKGJbZl1pbnN0YW5jZW9mIEFycmF5JiZkW2ZdaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuX2FycmF5RXF1YWxzKGJbZl0sCmRbZl0pKXJldHVybiExfWVsc2UgaWYoYltmXSE9ZFtmXSlyZXR1cm4hMTtyZXR1cm4hMH0sX2NoZWNrSW1wb3J0czpmdW5jdGlvbigpe1sidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiwidmFhZGluLWdyaWQtc29ydGVyIiwidmFhZGluLWdyaWQtZmlsdGVyIiwidmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiJdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcihiKTshZHx8KFBvbHltZXIuaXNJbnN0YW5jZT9Qb2x5bWVyLmlzSW5zdGFuY2UoZCk6ZCBpbnN0YW5jZW9mIFBvbHltZXIuRWxlbWVudCl8fGNvbnNvbGUud2FybigiTWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIHRoZSByZXF1aXJlZCBtb2R1bGUgZm9yIFx4M2MiK2IrIlx4M2UgZWxlbWVudC4iKX0sdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zb3J0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcj17cHJvcGVydGllczp7bXVsdGlTb3J0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcHJldmlvdXNTb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsic29ydGVyLWNoYW5nZWQiOiJfb25Tb3J0ZXJDaGFuZ2VkIn0scmVhZHk6ZnVuY3Rpb24oKXtQb2x5bWVyLkVsZW1lbnQmJiFQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvdyYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoInZhYWRpbi1ncmlkLXNvcnRlciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYixmdW5jdGlvbihkKXtkLmZpcmUmJmQuZmlyZSgic29ydGVyLWNoYW5nZWQiKX0pfSl9LF9vblNvcnRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O3RoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLGQpO2QuX29yZGVyPW51bGw7dGhpcy5tdWx0aVNvcnQ/KGQuZGlyZWN0aW9uJiZ0aGlzLl9zb3J0ZXJzLnVuc2hpZnQoZCksdGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Zi5fb3JkZXI9MTx0aGlzLl9zb3J0ZXJzLmxlbmd0aD9oOm51bGx9LHRoaXMpKToodGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuX29yZGVyPW51bGw7Zi5kaXJlY3Rpb249bnVsbH0pLGQuZGlyZWN0aW9uJiYodGhpcy5fc29ydGVycz1bZF0pKTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZKU09OLnN0cmluZ2lmeSh0aGlzLl9wcmV2aW91c1NvcnRlcnMpIT09SlNPTi5zdHJpbmdpZnkodGhpcy5fbWFwU29ydGVycygpKSYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX0sX21hcFNvcnRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLApkaXJlY3Rpb246Yi5kaXJlY3Rpb259fSl9LF9yZW1vdmVBcnJheUl0ZW06ZnVuY3Rpb24oYixkKXtkPWIuaW5kZXhPZihkKTstMTxkJiZiLnNwbGljZShkLDEpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZmlsdGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsiZmlsdGVyLWNoYW5nZWQiOiJfZmlsdGVyQ2hhbmdlZCJ9LF9maWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKGIudGFyZ2V0KSYmdGhpcy5fZmlsdGVycy5wdXNoKGIudGFyZ2V0KTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX21hcEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLHZhbHVlOmIudmFsdWV9fSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZCIscHJvcGVydGllczp7X2NvbHVtblRyZWU6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxzaXplOk51bWJlcixfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxfYmluZERhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEl0ZW0uYmluZCh0aGlzKX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EeW5hbWljQ29sdW1uc0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3IsCnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5GaWx0ZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwiaXJvbi1yZXNpemUiOiJfZ3JpZFJlc2l6ZUhhbmRsZXIifSxfdXBkYXRlSXRlbTpmdW5jdGlvbihiLGQpe2Iuc3R5bGUubWluSGVpZ2h0PWQ/IiI6dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UrInB4IjtiLml0ZW09ZDtiLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZCk7Yi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGQpO2IuYWN0aXZlPW51bGwhPT1kJiZkPT10aGlzLmFjdGl2ZUl0ZW07Yi5mb2N1c2VkPWIuaW5kZXg9PT10aGlzLiQuaXRlbXMuX2ZvY3VzZWRSb3dJbmRleH0sX2dldENvbnRlbnRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO3RoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZS5yb3ctZGV0YWlscyIpfHx2b2lkIDA7dGhpcy4kLnNjcm9sbGVyLnRhcmdldD10aGlzO251bGw9PT1kb2N1bWVudC5kb2N0eXBlJiZjb25zb2xlLndhcm4oJ1x4M2N2YWFkaW4tZ3JpZFx4M2UgcmVxdWlyZXMgdGhlICJzdGFuZGFyZHMgbW9kZSIgZGVjbGFyYXRpb24uIFBsZWFzZSBhZGQgXHgzYyFET0NUWVBFIGh0bWxceDNlIHRvIHRoZSBIVE1MIGRvY3VtZW50LicpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7Il9jaGlsZENvbHVtbnMiPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLHZpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cDpPYmplY3QsX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfbm9NdWx0aUV4cGVyaW1lbnRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbmRleE9mU2Vzc2lvbjpPYmplY3QsX3Nlc3Npb25Hcm91cE5hbWVIYXNoOk51bWJlcixfcmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oe3RhZzpiLHJ1bjpkfSk9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6ZCxtZXRyaWNOYW1lOmJ9KX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzY2FsZTpiPT57Yj1KU09OLnBhcnNlKGIpWzFdOwpiPXRoaXMuX2luZGV4T2ZTZXNzaW9uLmdldChiKTtjb25zdCBkPXBmLnN0YW5kYXJkO3JldHVybiBkWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCtiKSVkLmxlbmd0aF19fX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6InJlZHJhdyJ9LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cC4qKSJdLHJlZHJhdygpe1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGI9PmIucmVkcmF3KCkpfSxfc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoYixkKT0+W2IubmFtZSxkXSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPXRmLmhwYXJhbXMudXRpbHMuaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToKKHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCk7UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+e2NvbnN0IGQ9Yi5nZXQoInRhZyIpO2Iuc2V0KCJ0YWciLCIiKTtiLnNldCgidGFnIixkKX0pfSxfaGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJjA8dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aH0sX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfSxfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhiLGQpe3JldHVybiBudWxsPT09Ynx8bnVsbD09PWQ/W106Yi5zZXNzaW9ucy5maWx0ZXIoZj0+dm9pZCAwIT09dGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5TmFtZShmLm1ldHJpY1ZhbHVlcywKZC5uYW1lKSkubWFwKGY9Pih7dGFnOmQubmFtZSxydW46Zi5uYW1lfSkpfSxfY29tcHV0ZVRhZ01ldGFkYXRhKGIpe3JldHVybntkaXNwbGF5TmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUoYiksZGVzY3JpcHRpb246Yi5kZXNjcmlwdGlvbnx8IiJ9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdGFibGUtdmlldy90Zi1ocGFyYW1zLXRhYmxlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy10YWJsZS12aWV3Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LGVuYWJsZVNob3dNZXRyaWNzOkJvb2xlYW4sYmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nfSxvYnNlcnZlcnM6WyJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodmlzaWJsZVNjaGVtYS4qLCBzZXNzaW9uR3JvdXBzLiopIl0sX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7Y29uc3QgYj10aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLmdldCgiZXhwYW5kZWRJdGVtcyIpO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIixbXSk7UG9seW1lci5kb20uZmx1c2goKTtjb25zdCBkPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goZj0+e2Quc2V0KGYubmFtZSxmKX0pO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIiwKYi5tYXAoZj0+ZC5nZXQoZi5uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKX0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfc2Vzc2lvbkdyb3VwSFBhcmFtKGIsZCl7cmV0dXJuIG51bGwhPWImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLmhwYXJhbXMsZCk/dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChiLmhwYXJhbXNbZF0pOiIifSxfc2Vzc2lvbkdyb3VwTWV0cmljKGIsZCl7aWYobnVsbD09YilyZXR1cm4gbnVsbDtmb3IobGV0IGY9MDtmPGIubWV0cmljVmFsdWVzLmxlbmd0aDsrK2Ype2xldCBoPWIubWV0cmljVmFsdWVzW2ZdO2lmKGgubmFtZS5ncm91cD09PWQuZ3JvdXAmJmgubmFtZS50YWc9PWQudGFnKXJldHVybiB0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50KGgudmFsdWUpfXJldHVybiIifSxfcm93TnVtYmVyKGIpe3JldHVybiBiKzF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sdmlzaWJsZVNjaGVtYTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LF9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIHZvaWQgMCE9PWImJm51bGwhPT1iJiZ2b2lkIDAhPT1kJiZudWxsIT09ZH0sX3NpbmdsZXRvblNlc3Npb25Hcm91cHM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PT1ifHx2b2lkIDA9PT1iP1tdOltiXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3V0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChrLHQsbCl7ZnVuY3Rpb24gcCgpe2lmKDA9PT1rLmxlbmd0aClyZXR1cm5bMSwyXTtjb25zdCBbbSxuXT1kMy5leHRlbnQoayk7cmV0dXJuIG0hPT1uP1ttLG5dOjA8bT9bLjUqbSwxLjUqbV06MD5tP1sxLjUqbSwuNSptXTpbLTEsMV19aWYoIkxJTkVBUiI9PT1sKXJldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihwKCkpLnJhbmdlKFt0LDBdKTtpZigiTE9HIj09PWwpcmV0dXJuIGw9cCgpLDA+PWxbMF0mJjA8PWxbMV0/aChrLHQsIkxJTkVBUiIpOmQzLnNjYWxlTG9nKCkuZG9tYWluKGwpLnJhbmdlKFt0LDBdKTtpZigiUVVBTlRJTEUiPT09bClyZXR1cm4gbD1kMy5yYW5nZSgyMCkubWFwKG09PnQtbSp0LzE5KSwwPT09ay5sZW5ndGgmJihrPVsxXSksZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihfLnVuaXEoaykpLnJhbmdlKGwpO2lmKCJOT05fTlVNRVJJQyI9PT1sKXJldHVybiBkMy5zY2FsZVBvaW50KCkuZG9tYWluKF8udW5pcShrLnNvcnQoKSkpLnJhbmdlKFt0LAowXSkucGFkZGluZyguMSk7dGhyb3cgUmFuZ2VFcnJvcigiVW5rbm93biBzY2FsZTogIitsKTt9Zi5maW5kQ2xvc2VzdFBhdGg9ZnVuY3Rpb24oayx0LGwpe2Z1bmN0aW9uIHAoeSx3LEMsRyl7Y29uc3QgRD15LUMsQj13LUc7Qz1tLUM7Rz1uLUc7Y29uc3QgST0oRCpDK0IqRykvKEQqRCtCKkIpO3JldHVybiAwPj1JP2IuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKEMsRyk6MTw9ST9iLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZCh5LW0sdy1uKTpiLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLUkqRCxHLUkqQil9aWYoMj50Lmxlbmd0aClyZXR1cm4gY29uc29sZS5lcnJvcigiTGVzcyB0aGFuIHR3byBheGVzIGluIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuIiksbnVsbDtjb25zdCBtPWxbMF0sbj1sWzFdO2lmKG08PXRbMF18fG0+PXRbdC5sZW5ndGgtMV0pcmV0dXJuIG51bGw7Y29uc3QgcT1fLnNvcnRlZEluZGV4KHQsbSk7Y29uc29sZS5hc3NlcnQoMDxxKTsKY29uc29sZS5hc3NlcnQocTx0Lmxlbmd0aCk7Y29uc3QgdT1xLTE7bGV0IHg9bnVsbCxBPW51bGw7ay5mb3JFYWNoKHk9Pntjb25zdCB3PXAoeS5jb250cm9sUG9pbnRzW3VdWzBdLHkuY29udHJvbFBvaW50c1t1XVsxXSx5LmNvbnRyb2xQb2ludHNbcV1bMF0seS5jb250cm9sUG9pbnRzW3FdWzFdKTsxMDA8d3x8IShudWxsPT09eHx8dzx4KXx8KHg9dyxBPXkpfSk7cmV0dXJuIEF9O2YucG9pbnRTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuIGsuZG9tYWluKCkuZmlsdGVyKHA9PntwPWsocCk7cmV0dXJuIHQ8PXAmJnA8PWx9KX07Zi5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGssdCxsKXtjb25zdCBwPWsucmFuZ2UoKSxtPXAuZmlsdGVyKG49PnQ8PW4mJm48PWwpLm1hcChuPT57Y29uc3QgcT1rLmludmVydEV4dGVudChuKTtyZXR1cm4gbj09PXBbcC5sZW5ndGgtMV0/W3FbMF0scVsxXSsxXTpxfSk7cmV0dXJuIDA9PW0ubGVuZ3RoP1swLAowXTpkMy5leHRlbnQoZDMubWVyZ2UobSkpfTtmLmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuW2suaW52ZXJ0KHQpLGsuaW52ZXJ0KGwpXS5zb3J0KChwLG0pPT5wLW0pfTtmLmNyZWF0ZUF4aXNTY2FsZT1ofSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvYXhlcy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKHEpe3JldHVybiBudWxsIT09cS5zb3VyY2VFdmVudH1sZXQgazsoZnVuY3Rpb24ocSl7cS5MSU5FQVI9IkxJTkVBUiI7cS5MT0c9IkxPRyI7cS5RVUFOVElMRT0iUVVBTlRJTEUiO3EuTk9OX05VTUVSSUM9Ik5PTl9OVU1FUklDIn0pKGs9Zi5TY2FsZVR5cGV8fChmLlNjYWxlVHlwZT17fSkpO2NsYXNzIHR7aXNQYXNzaW5nKCl7cmV0dXJuITB9fWNsYXNzIGx7Y29uc3RydWN0b3IocSx1LHgsQSl7dGhpcy5fbG93ZXI9cTt0aGlzLl91cHBlcj11O3RoaXMuX2xvd2VyT3Blbj14O3RoaXMuX3VwcGVyT3Blbj1BfWlzUGFzc2luZyhxKXtyZXR1cm4gdGhpcy5fYmVmb3JlKHRoaXMuX2xvd2VyLHEsIXRoaXMuX2xvd2VyT3BlbikmJnRoaXMuX2JlZm9yZShxLHRoaXMuX3VwcGVyLCF0aGlzLl91cHBlck9wZW4pfV9iZWZvcmUocSx1LHgpe3JldHVybiB4P3E8PXU6cTx1fX1jbGFzcyBwe2NvbnN0cnVjdG9yKHEpe3RoaXMuX2RvbWFpblNldD0KcX1pc1Bhc3NpbmcocSl7cmV0dXJuLTEhPT10aGlzLl9kb21haW5TZXQuZmluZEluZGV4KHU9PnU9PT1xKX19Y2xhc3MgbXtjb25zdHJ1Y3RvcihxLHUseCxBKXt0aGlzLl9zdmdQcm9wcz1xO3RoaXMuX3NjaGVtYT11O3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj14O3RoaXMuX2NvbEluZGV4PUE7dGhpcy5faXNEaXNwbGF5ZWQ9ITE7dGhpcy5fc2NhbGVUeXBlPXRoaXMuX3lTY2FsZT1udWxsO3RoaXMuc2V0QnJ1c2hTZWxlY3Rpb24obnVsbCl9Y29sSW5kZXgoKXtyZXR1cm4gdGhpcy5fY29sSW5kZXh9eVNjYWxlKCl7cmV0dXJuIHRoaXMuX3lTY2FsZX1zY2FsZVR5cGUoKXtyZXR1cm4gdGhpcy5fc2NhbGVUeXBlfWJydXNoU2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2JydXNoU2VsZWN0aW9ufWlzRGlzcGxheWVkKCl7cmV0dXJuIHRoaXMuX2lzRGlzcGxheWVkfXNldEJydXNoU2VsZWN0aW9uKHEpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXE7dGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksCnRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9c2V0RG9tYWluQW5kU2NhbGUocSx1KXt0aGlzLl9zY2FsZVR5cGU9dTt0aGlzLl95U2NhbGU9Yi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNyZWF0ZUF4aXNTY2FsZShxLnNsaWNlKCksdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0LHRoaXMuc2NhbGVUeXBlKCkpO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLHRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9YnJ1c2hGaWx0ZXIoKXtyZXR1cm4gdGhpcy5fYnJ1c2hGaWx0ZXJ9dXBkYXRlRE9NKHEpe3ZhciB1PWQzLmF4aXNMZWZ0KHRoaXMueVNjYWxlKCkpO3RoaXMuc2NhbGVUeXBlKCk9PT1rLlFVQU5USUxFJiYodT11LnRpY2tWYWx1ZXModGhpcy55U2NhbGUoKS5xdWFudGlsZXMoKSkudGlja0Zvcm1hdChkMy5mb3JtYXQoIi0uNmciKSkpO3ZhciB4PWQzLnNlbGVjdChxKTt4LnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpOwp4LmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMiLCEwKS5jYWxsKHUpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoImF4aXMtdGl0bGUiLCEwKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoInkiLC05KS50ZXh0KEE9PmIuaHBhcmFtcy51dGlscy5zY2hlbWFDb2x1bW5OYW1lKHRoaXMuX3NjaGVtYSxBKSk7eC5jYWxsKGQzLmRyYWcoKS5vbigic3RhcnQiLCgpPT57cS5zZXRBdHRyaWJ1dGUoImlzLWRyYWdnaW5nIiwiIik7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ1N0YXJ0KHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZHJhZyIsKCk9PnRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWcoZDMuZXZlbnQueCkpLm9uKCJlbmQiLCgpPT57dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ0VuZCgpO3EucmVtb3ZlQXR0cmlidXRlKCJpcy1kcmFnZ2luZyIpfSkpO3U9ZDMuYnJ1c2hZKCkuZXh0ZW50KFtbLTgsMF0sCls4LHRoaXMuX3N2Z1Byb3BzLmhlaWdodCsxXV0pLm9uKCJzdGFydCIsKCk9PntoKGQzLmV2ZW50KSYmKHEuc2V0QXR0cmlidXRlKCJpcy1icnVzaGluZyIsIiIpLHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCkpKX0pLm9uKCJicnVzaCIsKCk9PntpZihoKGQzLmV2ZW50KSl0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKX0pLm9uKCJlbmQiLCgpPT57aChkMy5ldmVudCkmJih0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSxxLnJlbW92ZUF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciKSl9KTt4PWQzLnNlbGVjdChxKS5hcHBlbmQoImciKS5jbGFzc2VkKCJicnVzaCIsITApO3guY2FsbCh1KTt1Lm1vdmUoeCx0aGlzLmJydXNoU2VsZWN0aW9uKCkpfXNldERpc3BsYXllZChxKXt0aGlzLl9pc0Rpc3BsYXllZD1xfV9idWlsZEJydXNoRmlsdGVyKHEsCnUseCl7aWYobnVsbD09PXEpcmV0dXJuIG5ldyB0O2lmKG51bGw9PT11KXJldHVybiBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIixxKSxuZXcgdDtzd2l0Y2godSl7Y2FzZSBrLkxJTkVBUjpjYXNlIGsuTE9HOntjb25zdCBbQSx5XT1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuY29udGludW91c1NjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCExKX1jYXNlIGsuUVVBTlRJTEU6e2NvbnN0IFtBLHldPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCEwKX1jYXNlIGsuTk9OX05VTUVSSUM6cmV0dXJuIG5ldyBwKGIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5wb2ludFNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKSl9Y29uc29sZS5lcnJvcigiVW5rbm93biBzY2FsZSB0eXBlOiAiLAp1KTtyZXR1cm4gbmV3IHR9fWYuQXhpcz1tO2NsYXNzIG57Y29uc3RydWN0b3IocSx1LHgpe3RoaXMuX3N2Z1Byb3BzPXE7dGhpcy5fc2NoZW1hPXU7dGhpcy5fYXhlcz10aGlzLl9jcmVhdGVBeGVzKHgpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zPWQzLnNjYWxlUG9pbnQoKS5yYW5nZShbMSx0aGlzLl9zdmdQcm9wcy53aWR0aC0xXSkucGFkZGluZyguNSk7dGhpcy5fZHJhZ2dlZEF4aXM9bnVsbDt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5heGlzLXBhcmVudCIpLnJlbW92ZSgpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoIi5heGlzLXBhcmVudCIpfXVwZGF0ZUF4ZXMocSx1KXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zdCB4PW5ldyBTZXQ7cS5jb2x1bW5zLmZvckVhY2goeT0+e2NvbnN0IHc9eS5hYnNvbHV0ZUluZGV4O2xldCBDPXRoaXMuX2F4ZXNbd107Qy5zZXREaXNwbGF5ZWQoITApOwpjb25zdCBHPXUubWFwKEQ9PmIuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLEQsdykpO0Muc2V0RG9tYWluQW5kU2NhbGUoRyx5LnNjYWxlKTt4LmFkZCh3KX0pO3RoaXMuX2F4ZXMuZm9yRWFjaCh5PT57eC5oYXMoeS5jb2xJbmRleCgpKXx8eS5zZXREaXNwbGF5ZWQoITEpfSk7dGhpcy5fdXBkYXRlU3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMoeCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmRhdGEoQXJyYXkuZnJvbSh4KSx5PT55KTt0aGlzLl9wYXJlbnRzU2VsLmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzLXBhcmVudCIsITApLm1lcmdlKHRoaXMuX3BhcmVudHNTZWwpO2NvbnN0IEE9dGhpczt0aGlzLl9wYXJlbnRzU2VsLmNhbGwoeT0+dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHkpKS5lYWNoKGZ1bmN0aW9uKHkpe0EuX2F4ZXNbeV0udXBkYXRlRE9NKHRoaXMpfSl9bWFwVmlzaWJsZUF4ZXMocSl7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLm1hcCh1PT4KcSh0aGlzLmdldEF4aXNQb3NpdGlvbih1KSx0aGlzLl9heGVzW3VdKSl9YWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KHEpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5ldmVyeSh1PT5xKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpLHRoaXMuX2F4ZXNbdV0pKX1nZXRBeGlzRm9yQ29sSW5kZXgocSl7cmV0dXJuIHRoaXMuX2F4ZXNbcV19ZHJhZ1N0YXJ0KHEpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO2NvbnNvbGUuYXNzZXJ0KHRoaXMuX2F4ZXNbcV0uaXNEaXNwbGF5ZWQoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fYXhlc1txXTt0aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpfWRyYWcocSl7dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1xPU1hdGgubWluKE1hdGgubWF4KHEsMCksdGhpcy5fc3ZnUHJvcHMud2lkdGgpO3E9dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCk7CnEuc29ydCgodSx4KT0+dGhpcy5nZXRBeGlzUG9zaXRpb24odSktdGhpcy5nZXRBeGlzUG9zaXRpb24oeCkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbihxKTt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbCl9ZHJhZ0VuZCgpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1udWxsO3RoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApKX1pc0F4aXNEcmFnZ2luZygpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXN9Z2V0QXhpc1Bvc2l0aW9uKHEpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXMmJnRoaXMuX2RyYWdnZWRBeGlzLmNvbEluZGV4KCk9PT1xP3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb246dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMocSl9X3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpe3ZhciB1PQp0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5maWx0ZXIoeD0+cS5oYXMoeCkpO3U9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi51LC4uLkFycmF5LmZyb20ocSldKSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKHUpfV91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00ocSl7cS5hdHRyKCJ0cmFuc2Zvcm0iLHU9PmIuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIodGhpcy5nZXRBeGlzUG9zaXRpb24odSkpKX1fY3JlYXRlQXhlcyhxKXtyZXR1cm4gZDMucmFuZ2UoYi5ocGFyYW1zLnV0aWxzLm51bUNvbHVtbnModGhpcy5fc2NoZW1hKSkubWFwKHU9Pm5ldyBtKHRoaXMuX3N2Z1Byb3BzLHRoaXMuX3NjaGVtYSxxLHUpKX19Zi5BeGVzQ29sbGVjdGlvbj1ufSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvbGluZXMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7bGV0IGg7KGZ1bmN0aW9uKGwpe2xbbC5GT1JFR1JPVU5EPTBdPSJGT1JFR1JPVU5EIjtsW2wuQkFDS0dST1VORD0xXT0iQkFDS0dST1VORCJ9KShoPWYuTGluZVR5cGV8fChmLkxpbmVUeXBlPXt9KSk7Y2xhc3Mga3tjb25zdHJ1Y3RvcihsKXt2b2lkIDA9PT1sJiYobD1kMy5zZWxlY3RBbGwobnVsbCkpO2NvbnNvbGUuYXNzZXJ0KDE+PWwuc2l6ZSgpKTt0aGlzLl9zZXNzaW9uR3JvdXBTZWw9bH1zZXNzaW9uR3JvdXAoKXtyZXR1cm4gMT09PXRoaXMuX3Nlc3Npb25Hcm91cFNlbC5zaXplKCk/dGhpcy5fc2Vzc2lvbkdyb3VwU2VsLmRhdHVtKCk6bnVsbH1pc051bGwoKXtyZXR1cm4gbnVsbD09PXRoaXMuc2Vzc2lvbkdyb3VwKCl9c2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nlc3Npb25Hcm91cFNlbH1lcXVhbHNUbyhsKXtyZXR1cm4gdGhpcy5pc051bGwoKT9sLmlzTnVsbCgpOmwuaXNOdWxsKCk/ITE6bC5zZXNzaW9uR3JvdXAoKS5uYW1lPT0KdGhpcy5zZXNzaW9uR3JvdXAoKS5uYW1lfX1mLlNlc3Npb25Hcm91cEhhbmRsZT1rO2NsYXNzIHR7Y29uc3RydWN0b3IobCxwLG0pe3RoaXMuX3N2Z1Byb3BzPWw7dGhpcy5fc2NoZW1hPXA7dGhpcy5fYXhlc0NvbGxlY3Rpb249bTt0aGlzLl9zZXNzaW9uR3JvdXBzPVtdO3RoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCJnLmJhY2tncm91bmQiKS5yZW1vdmUoKTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5mb3JlZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fYmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJhY2tncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl9mZ1BhdGhzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuYXBwZW5kKCJnIikuY2xhc3NlZCgiZm9yZWdyb3VuZCIsITApLnNlbGVjdEFsbCgicGF0aCIpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPQpuZXcgazt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZT1uZXcgazt0aGlzLl9kM2xpbmU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlTGluZWFyKX1nZXRTZXNzaW9uR3JvdXBIYW5kbGUobCl7cmV0dXJuIG51bGw9PT1sfHx2b2lkIDA9PT1sP25ldyBrOm5ldyBrKHRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKHA9PnAubmFtZT09PWwubmFtZSkpfWhpZGVCYWNrZ3JvdW5kTGluZXMoKXt0aGlzLl9iZ1BhdGhzU2VsLmF0dHIoInZpc2liaWxpdHkiLCJoaWRkZW4iKX1zaG93QmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IixudWxsKX1wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKXtyZXR1cm4gdGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlfXNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlfXJlY29tcHV0ZUNvbnRyb2xQb2ludHMobCxwPTApeyhsPT09aC5GT1JFR1JPVU5EPwp0aGlzLl9mZ1BhdGhzU2VsOnRoaXMuX2JnUGF0aHNTZWwpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihwKS5hdHRyKCJkIixtPT50aGlzLl9wYXRoREF0dHJpYnV0ZShtKSk7bD09PWguRk9SRUdST1VORCYmd2luZG93LnNldFRpbWVvdXQoKCk9Pntjb25zdCBtPXRoaXM7dGhpcy5fZmdQYXRoc1NlbC5lYWNoKGZ1bmN0aW9uKG4pe20uX3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eSh0aGlzLG4pfSl9KX1yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl7dGhpcy5fZmdQYXRoc1NlbC5jbGFzc2VkKCJpbnZpc2libGUtcGF0aCIsbD0+IXRoaXMuX2F4ZXNDb2xsZWN0aW9uLmFsbFZpc2libGVBeGVzU2F0aXNmeSgocCxtKT0+bS5icnVzaEZpbHRlcigpLmlzUGFzc2luZyhiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxsLG0uY29sSW5kZXgoKSkpKSk7dGhpcy5fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKX1zZXRGb3JlZ3JvdW5kTGluZXNDb2xvcihsLApwLG0pe2w9dGhpcy5fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pO3RoaXMuX2ZnUGF0aHNTZWwuYXR0cigic3Ryb2tlIixsKX1yZWRyYXcobCxwLG0sbil7Y29uc3QgcT10aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCksdT10aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTt0aGlzLl9zZXNzaW9uR3JvdXBzPWw7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2ZnUGF0aHNTZWwpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9iZ1BhdGhzU2VsKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUocSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUodSk7dGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGguRk9SRUdST1VORCk7CnRoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhoLkJBQ0tHUk9VTkQpO3RoaXMucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpO3RoaXMuc2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IocCxtLG4pfXVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCExKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9bDt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCEwKX1jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpe3RoaXMudXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKG5ldyBrKX11cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZWxlY3Rpb24oKS5jbGFzc2VkKCJzZWxlY3RlZC1wYXRoIiwhMSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9Cmw7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITApfWZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKGwscCl7Y29uc3QgbT10aGlzLl9heGVzQ29sbGVjdGlvbi5tYXBWaXNpYmxlQXhlcyhuPT5uKTtsPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5maW5kQ2xvc2VzdFBhdGgodGhpcy5fdmlzaWJsZUZnUGF0aHNTZWwubm9kZXMoKSxtLFtsLHBdKTtyZXR1cm4gbnVsbD09PWw/bmV3IGs6bmV3IGsoZDMuc2VsZWN0KGwpKX1fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pe2lmKG51bGw9PT1sKXJldHVybigpPT4icmVkIjtjb25zdCBuPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGIuaHBhcmFtcy51dGlscy5udW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuX3NjaGVtYSx0aGlzLl9zZXNzaW9uR3JvdXBzLGwpKS5yYW5nZShbcCxtXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVMYWIpO3JldHVybiBxPT4KbihiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxxLGwpKX1fcmVjb21wdXRlUGF0aFNlbGVjdGlvbihsKXtsPWwuZGF0YSh0aGlzLl9zZXNzaW9uR3JvdXBzLHA9PnAubmFtZSk7bC5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIGwuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5tZXJnZShsKX1fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KGwscCl7bC5jb250cm9sUG9pbnRzPXRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKHApfV9jb21wdXRlQ29udHJvbFBvaW50cyhsKXtyZXR1cm4gdGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKHAsbSk9PltwLG0ueVNjYWxlKCkoYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsbCxtLmNvbEluZGV4KCkpKV0pfV9wYXRoREF0dHJpYnV0ZShsKXtyZXR1cm4gdGhpcy5fZDNsaW5lKHRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKGwpKX1fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKXt0aGlzLl92aXNpYmxlRmdQYXRoc1NlbD0KdGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoIjpub3QoLmludmlzaWJsZS1wYXRoKSIpfX1mLkxpbmVzQ29sbGVjdGlvbj10fSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvaW50ZXJhY3Rpb25fbWFuYWdlci5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKHQsbCl7dGhpcy5zdmc9ZDMuc2VsZWN0KHQpO3Q9MTAwKmwrMjA7dGhpcy5zdmcuYXR0cigidmlld0JveCIsYDAgMCAke3R9ICR7MjQwfWApO3RoaXMuc3ZnLmF0dHIoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4td2lkdGgiLHQrInB4Iik7dGhpcy5zdmcuc3R5bGUoIm1pbi1oZWlnaHQiLCIyNDBweCIpO3RoaXMud2lkdGg9dC0xMC0xMDt0aGlzLmhlaWdodD0yMDA7dGhpcy5zdmdHPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYi5ocGFyYW1zLnV0aWxzLnRyYW5zbGF0ZVN0cigxMCwzMCkpfX1mLlNWR1Byb3BlcnRpZXM9aDtjbGFzcyBre2NvbnN0cnVjdG9yKHQsbCxwLG0pe3RoaXMuX3N2Z1Byb3BzPXQ7dGhpcy5fc2NoZW1hPWw7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPXA7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9Cm07dGhpcy5fYXhlc0NvbGxlY3Rpb249bmV3IGYuQXhlc0NvbGxlY3Rpb24odCxsLHRoaXMpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgZi5MaW5lc0NvbGxlY3Rpb24odCxsLHRoaXMuX2F4ZXNDb2xsZWN0aW9uKTt0aGlzLl9zdmdQcm9wcy5zdmcub24oImNsaWNrIiwoKT0+dGhpcy5vbkNsaWNrKCkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCk9Pntjb25zdCBbbixxXT1kMy5tb3VzZSh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQobixxKX0pLm9uKCJtb3VzZWxlYXZlIiwoKT0+dGhpcy5vbk1vdXNlTGVhdmUoKSl9b25EcmFnU3RhcnQodCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KHQpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcodCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5GT1JFR1JPVU5EKX1vbkRyYWdFbmQoKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnRW5kKCk7CnRoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuRk9SRUdST1VORCw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KCgpPT57dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5CQUNLR1JPVU5EKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSw1MDApfW9uQnJ1c2hDaGFuZ2VkKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleCh0KS5zZXRCcnVzaFNlbGVjdGlvbihkMy5ldmVudC5zZWxlY3Rpb24pO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl9b25Nb3VzZU1vdmVkKHQsbCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24uZmluZENsb3Nlc3RTZXNzaW9uR3JvdXAodCxsKSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25Nb3VzZUxlYXZlKCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLmlzTnVsbCgpfHwKKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgZi5TZXNzaW9uR3JvdXBIYW5kbGUpOnRoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHQsCmwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXModCxsKTtjb25zdCBwPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxtPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcobCx2b2lkIDAhPT10LmNvbG9yQnlDb2x1bW5JbmRleD90LmNvbHVtbnNbdC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCx0Lm1pbkNvbG9yLHQubWF4Q29sb3IpO3AuZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSk7bS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fAp0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9c2NoZW1hKCl7cmV0dXJuIHRoaXMuX3NjaGVtYX19Zi5JbnRlcmFjdGlvbk1hbmFnZXI9a30pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdCIscHJvcGVydGllczp7c2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOk9iamVjdCxzZWxlY3RlZFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LGNsb3Nlc3RTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxyZWRyYXdDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3ZhbGlkU2Vzc2lvbkdyb3VwczpBcnJheSxfaW50ZXJhY3Rpb25NYW5hZ2VyOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKG9wdGlvbnMuKiwgc2Vzc2lvbkdyb3Vwcy4qKSJdLF9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2lmKG51bGwhPT10aGlzLm9wdGlvbnMpe3ZhciBiPXRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8CiFfLmlzRXF1YWwodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLnNjaGVtYSgpLGIuc2NoZW1hKSl7ZDMuc2VsZWN0KHRoaXMuJC5zdmcpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2NvbnN0IGQ9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuU1ZHUHJvcGVydGllcyh0aGlzLiQuc3ZnLHRmLmhwYXJhbXMudXRpbHMubnVtQ29sdW1ucyhiLnNjaGVtYSkpO3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj1uZXcgdGYuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5JbnRlcmFjdGlvbk1hbmFnZXIoZCxiLnNjaGVtYSxmPT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpLGY9PnRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCk7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLAp0aGlzLl92YWxpZFNlc3Npb25Hcm91cHMpO3RoaXMucmVkcmF3Q291bnQrK319LGNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGIpe3RoaXMuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAoYil9LHNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChiKXt0aGlzLl9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChiKX0sX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDA7ZWxzZXt2YXIgZD10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5zY2hlbWE7dGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzPXRoaXMuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoZj0+e2ZvcihsZXQgaD0wO2g8Yi5udW1Db2x1bW5zKGQpOysraClpZih0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eVtoXSYmdm9pZCAwPT09Yi5jb2x1bW5WYWx1ZUJ5SW5kZXgoZCwKZixoKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihiLGQpe3JldHVybiBudWxsIT09Yj9iOmR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2NvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3N2Zzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2JydXNoZWRDZWxsSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9icnVzaFNlbGVjdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZChzZXNzaW9uR3JvdXBzLiopIiwKIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiopIiwiX3JlZHJhdyhvcHRpb25zLiopIl0scmVhZHkoKXt0aGlzLl9jb250YWluZXI9dGhpcy4kLmNvbnRhaW5lcjt0aGlzLl9zdmc9ZDMuc2VsZWN0KHRoaXMuJC5zdmcpO3RoaXMuX3JlZHJhdygpfSxfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmdGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAodGYuaHBhcmFtcy51dGlscy5zZXNzaW9uR3JvdXBXaXRoTmFtZSh0aGlzLnNlc3Npb25Hcm91cHMsdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cC5uYW1lKXx8bnVsbCk7dGhpcy5fcmVkcmF3KCl9LF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXRoaXMuX2JydXNoZWRDZWxsSW5kZXg9bnVsbDt0aGlzLl9yZWRyYXcoKX0sX3JlZHJhdygpe3RoaXMuZGVib3VuY2UoIl9yZWRyYXciLCgpPT57Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzOwp0aGlzLndpZHRoPU1hdGgubWF4KDE1MCpiLm51bVZpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZVNjaGVtYSksMTIwMCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgoMTEyLjUqYi5udW1WaXNpYmxlTWV0cmljcyh0aGlzLnZpc2libGVTY2hlbWEpLDQ4MCk7dGhpcy5fY29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4Ijt0aGlzLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCI7dGhpcy5fc3ZnLmF0dHIoIndpZHRoIix0aGlzLndpZHRoKS5hdHRyKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dGhpcy5fZHJhdygpfSwxMDApfSxfZHJhdygpe2Z1bmN0aW9uIGIoa2Epe3JldHVybiJ4LWF4aXMtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZChrYSl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZihrYSl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIitrYX1mdW5jdGlvbiBoKGthKXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIisKa2F9ZnVuY3Rpb24gayhrYSxZLEVhLHZhLHhhKXtFYT1NYXRoLmZsb29yKEVhL3ZhKTt2YT1ZLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXhhKXtsZXQgQWE9dmEucXVhbnRpbGVzKCk7QWE9ZDMucmFuZ2UoMCxBYS5sZW5ndGgsTWF0aC5jZWlsKEFhLmxlbmd0aC9FYSkpLm1hcChGYT0+QWFbRmFdKTtZLnRpY2tWYWx1ZXMoQWEpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjJnIikpfSJMSU5FQVIiIT09eGEmJiJMT0ciIT09eGF8fFkudGlja3MoRWEpO2thLmNhbGwoWSk7a2Euc2VsZWN0QWxsKCIuZG9tYWluIikucmVtb3ZlKCk7a2Euc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfWZ1bmN0aW9uIHQoa2EsWSl7cmV0dXJuIE9bWV0ody5fY29sVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIGwoa2EsWSl7cmV0dXJuIEhbWV0ody5fbWV0cmljVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIHAoa2EsWSl7Y29uc3QgRWE9W107VFtrYV1bWV0uZWFjaChmdW5jdGlvbigpe0VhLnB1c2godGhpcyl9KTsKcmV0dXJuIGQzLnF1YWR0cmVlKCkueCh2YT0+ZDMuc2VsZWN0KHZhKS5kYXR1bSgpLngpLnkodmE9PmQzLnNlbGVjdCh2YSkuZGF0dW0oKS55KS5hZGRBbGwoRWEpfWZ1bmN0aW9uIG0oKXtsZXQga2E9bmV3IFNldChRLm5vZGVzKCkpO3goKXx8KGthPW4ody5fYnJ1c2hlZENlbGxJbmRleCx3Ll9icnVzaFNlbGVjdGlvbikpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHkuZmlsdGVyU2V0KGthLFk9PiFaLmhhcyhZKSkpKS5hdHRyKCJmaWxsIixMKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChaLFk9PiFrYS5oYXMoWSkpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTtaPWthfWZ1bmN0aW9uIG4oa2EsWSl7Y29uc29sZS5hc3NlcnQobnVsbCE9PWthKTtjb25zb2xlLmFzc2VydChudWxsIT09WSk7Y29uc3QgW0VhLHZhXT1rYSx4YT1uZXcgU2V0O3kucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChhYVtFYV1bdmFdLFlbMF1bMF0sWVswXVsxXSxZWzFdWzBdLFlbMV1bMV0sCkFhPT57ZDMuc2VsZWN0KEFhKS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaChGYT0+e3hhLmFkZChGYSl9KX0pO3JldHVybiB4YX1mdW5jdGlvbiBxKGthKXtjb25zdCBZPWQzLmJydXNoU2VsZWN0aW9uKGthKTshdSgpJiZudWxsPT09WXx8dSgpJiZrYT09PWxhLm5vZGUoKSYmXy5pc0VxdWFsKFksdy5fYnJ1c2hTZWxlY3Rpb24pfHwody5fYnJ1c2hTZWxlY3Rpb249WSxudWxsIT09WT8obGE9ZDMuc2VsZWN0KGthKSx3Ll9icnVzaGVkQ2VsbEluZGV4PWxhLmRhdHVtKCkpOihsYT1udWxsLHcuX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksbSgpKX1mdW5jdGlvbiB1KCl7cmV0dXJuIG51bGwhPT13Ll9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09dy5fYnJ1c2hTZWxlY3Rpb259ZnVuY3Rpb24geCgpe3JldHVybiF1KCl8fHcuX2JydXNoU2VsZWN0aW9uWzBdWzBdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMF18fHcuX2JydXNoU2VsZWN0aW9uWzBdWzFdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMV19CmZ1bmN0aW9uIEEoa2EsWSxFYSx2YSx4YSl7bGV0IEFhPUluZmluaXR5LEZhPW51bGw7eS5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKGFhW2thXVtZXSxFYSx2YSx4YSwoeWEsU2EpPT57Wi5oYXMoeWEpJiZTYTxBYSYmKHlhPWQzLnNlbGVjdCh5YSkuZGF0dW0oKSxBYT1TYSxGYT15YS5zZXNzaW9uR3JvdXApfSk7cmV0dXJuIG51bGw9PT1GYT9udWxsOmQzLnNlbGVjdEFsbChYLmdldChGYSkpfWNvbnN0IHk9dGYuaHBhcmFtcy51dGlscyx3PXRoaXM7aWYodGhpcy5zZXNzaW9uR3JvdXBzJiYwIT10aGlzLnNlc3Npb25Hcm91cHMubGVuZ3RoJiZ0aGlzLnZpc2libGVTY2hlbWEmJjAhPXRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpe3ZhciBDPWQzLnJhbmdlKHkubnVtVmlzaWJsZUNvbHVtbnMody52aXNpYmxlU2NoZW1hKSksRz1kMy5yYW5nZSh5Lm51bVZpc2libGVNZXRyaWNzKHcudmlzaWJsZVNjaGVtYSkpLEQ9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEMpLnJhbmdlKFs4NSwKdGhpcy53aWR0aC0xLTVdKS5wYWRkaW5nSW5uZXIoLjEpLEI9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEcpLnJhbmdlKFt0aGlzLmhlaWdodC0xLTUtNTAsNV0pLnBhZGRpbmdJbm5lciguMSksST1ELmJhbmR3aWR0aCgpLE49Qi5iYW5kd2lkdGgoKSxPPUMubWFwKGthPT53Ll9jZWxsU2NhbGUoa2EsWzAsSS0xXSkpLEg9Ry5tYXAoa2E9PncuX2NlbGxTY2FsZShrYSt5Lm51bVZpc2libGVIUGFyYW1zKHcudmlzaWJsZVNjaGVtYSksW04tMSwwXSkpLEs9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLngtYXhpcyIpLmRhdGEoQykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cihEKGthKSwwKSk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGIpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC01KS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsSSsxMCkuYXR0cigiaGVpZ2h0Iix3LmhlaWdodC0yNSk7CksuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixkKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5Iix3LmhlaWdodC0yNSkuYXR0cigid2lkdGgiLEkpLmF0dHIoImhlaWdodCIsMjUpO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitiKGthKSsiKSIpLmVhY2goZnVuY3Rpb24oa2Epe2QzLnNlbGVjdCh0aGlzKS5jYWxsKGssZDMuYXhpc0JvdHRvbShPW2thXSkudGlja1NpemUody5oZWlnaHQtNTApLEksNDAsdy5vcHRpb25zLmNvbHVtbnNba2FdLnNjYWxlKX0pO0suYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitkKGthKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsSS8yKS5hdHRyKCJ5Iix3LmhlaWdodC0xLTEyLjUpLnRleHQoa2E9Pnkuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUody52aXNpYmxlU2NoZW1hLAprYSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KGthPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHcudmlzaWJsZVNjaGVtYSxrYSkpO0s9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLnktYXhpcyIpLmRhdGEoRykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cih3LndpZHRoLTEsQihrYSkpKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZikuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLSh3LndpZHRoLTQwLTEpKS5hdHRyKCJ5IiwtNSkuYXR0cigid2lkdGgiLHcud2lkdGgtNDApLmF0dHIoImhlaWdodCIsTisxMCk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGgpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0ody53aWR0aC0xKSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLE4pO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIisKZihrYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGthKXtkMy5zZWxlY3QodGhpcykuY2FsbChrLGQzLmF4aXNMZWZ0KEhba2FdKS50aWNrU2l6ZSh3LndpZHRoLTgwKSxOLDIwLHcub3B0aW9ucy5jb2x1bW5zW2thK3kubnVtVmlzaWJsZUhQYXJhbXMody52aXNpYmxlU2NoZW1hKV0uc2NhbGUpfSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLGthPT4idXJsKCMiK2goa2EpKyIpIikuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IiwtKHcud2lkdGgtMjAtMSkpLmF0dHIoInkiLE4vMikuYXR0cigidHJhbnNmb3JtIix5LnJvdGF0ZVN0cigtKHcud2lkdGgtMjAtMSksTi8yKSkudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKS5hcHBlbmQoInRpdGxlIikudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKTsKSz10aGlzLl9zdmcuc2VsZWN0QWxsKCIuY2VsbCIpLmRhdGEoZDMuY3Jvc3MoQyxHKSkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJjZWxsIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoW2thLFldKT0+eS50cmFuc2xhdGVTdHIoRChrYSksQihZKSkpO0suYXBwZW5kKCJnIikuY2xhc3NlZCgiZnJhbWUiLCEwKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIixJKzEwKS5hdHRyKCJoZWlnaHQiLE4rMTApLmF0dHIoInN0cm9rZSIsIiMwMDAiKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgTT1udWxsO3ZvaWQgMCE9PXcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgmJihNPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKHRoaXMuX2NvbEV4dGVudCh0aGlzLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSkucmFuZ2UoW3RoaXMub3B0aW9ucy5taW5Db2xvcix0aGlzLm9wdGlvbnMubWF4Q29sb3JdKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUxhYikpOwp2YXIgTD12b2lkIDA9PT13Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4PygpPT4icmVkIjooe3Nlc3Npb25Hcm91cDprYX0pPT5NKHRoaXMuX2NvbFZhbHVlKGthLHcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKSxbUSxULFhdPWZ1bmN0aW9uKGthLFkpe2NvbnN0IEVhPWthLnNlbGVjdEFsbCgiLmRhdGEtbWFya2VyIikuZGF0YSgoW3hhLEFhXSk9Pncuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoRmE9PnZvaWQgMCE9PXcuX2NvbFZhbHVlKEZhLHhhKSYmdm9pZCAwIT09dy5fbWV0cmljVmFsdWUoRmEsQWEpKS5tYXAoRmE9Pih7Y29sOnhhLG1ldHJpYzpBYSxzZXNzaW9uR3JvdXA6RmEseDp0KEZhLHhhKSx5OmwoRmEsQWEpLHNlc3Npb25Hcm91cE1hcmtlcnM6bnVsbH0pKSkuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoImRhdGEtbWFya2VyIiwhMCkuYXR0cigiY3giLCh7eDp4YX0pPT54YSkuYXR0cigiY3kiLCh7eTp4YX0pPT54YSkuYXR0cigiciIsMikuYXR0cigiZmlsbCIsClkpLHZhPW5ldyBNYXA7dy5zZXNzaW9uR3JvdXBzLmZvckVhY2goeGE9Pnt2YS5zZXQoeGEsW10pfSk7RWEuZWFjaChmdW5jdGlvbih4YSl7dmEuZ2V0KHhhLnNlc3Npb25Hcm91cCkucHVzaCh0aGlzKX0pO0VhLmVhY2goeGE9Pntjb25zdCBBYT12YS5nZXQoeGEuc2Vzc2lvbkdyb3VwKTt4YS5zZXNzaW9uR3JvdXBNYXJrZXJzPW5ldyBTZXQoQWEpfSk7a2E9Qy5tYXAoeGE9PkcubWFwKEFhPT5FYS5maWx0ZXIoRmE9PkZhLmNvbD09eGEmJkZhLm1ldHJpYz09QWEpKSk7cmV0dXJuW0VhLGthLHZhXX0oSy5hcHBlbmQoImciKSxMKSxhYT1DLm1hcChrYT0+Ry5tYXAoWT0+cChrYSxZKSkpLGxhPW51bGw7dSgpJiYobGE9Sy5maWx0ZXIoa2E9Pl8uaXNFcXVhbChrYSx3Ll9icnVzaGVkQ2VsbEluZGV4KSksY29uc29sZS5hc3NlcnQoMT09bGEuc2l6ZSgpLGxhKSk7dmFyIFo9bmV3IFNldChRLm5vZGVzKCkpO20oKTt2YXIgYmE9ZDMuYnJ1c2goKS5leHRlbnQoW1stNCwtNF0sW0ktMSs1LQoxLE4tMSs1LTFdXSkub24oInN0YXJ0IixmdW5jdGlvbigpe3UoKSYmbGEubm9kZSgpIT10aGlzJiZiYS5tb3ZlKGxhLG51bGwpO3EodGhpcyl9KS5vbigiYnJ1c2giLGZ1bmN0aW9uKCl7cSh0aGlzKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cSh0aGlzKX0pO0suY2FsbChiYSk7dSgpJiZiYS5tb3ZlKGxhLHcuX2JydXNoU2VsZWN0aW9uKTt2YXIgZWE9bnVsbCxjYT1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoY2E9ZDMuc2VsZWN0QWxsKFguZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Sy5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPWVhPT09Y2E/bnVsbDplYTtrYSE9PWNhJiYobnVsbCE9PWNhJiZjYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxjYT1rYSxudWxsIT09Y2EmJmNhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGthPW51bGw9PT1jYT9udWxsOmNhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp3Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChrYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihba2EsWV0pe2NvbnN0IFtFYSx2YV09ZDMubW91c2UodGhpcyk7a2E9QShrYSxZLEVhLHZhLDIwKTtlYSE9PWthJiYobnVsbCE9PWVhJiZlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPWthLG51bGwhPT1lYT8oZWEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx3Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGVhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6dy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09ZWEmJihlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPW51bGwsdy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGIsZCl7dmFyIGY9dGhpcy5fY29sRXh0ZW50KGIpO2NvbnN0IGg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSlyZXR1cm4gaDtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXJldHVybiAwPj1mWzBdJiYwPD1mWzFdP2g6ZDMuc2NhbGVMb2coKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXtjb25zdCBrPShkWzFdLWRbMF0pLzE5O2Y9ZDMucmFuZ2UoMjApLm1hcCh0PT5kWzBdK2sqdCk7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAodD0+dGhpcy5fY29sVmFsdWUodCxiKSkpKS5yYW5nZShmKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYl0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoaz0+CnRoaXMuX2NvbFZhbHVlKGssYikpLnNvcnQoKSkpLnJhbmdlKGQpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIitiKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX21ldHJpY1ZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX2NvbEV4dGVudChiKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIG51bGwhPT1iP2I6ZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyIixoYW5kbGVFdmVudDpmdW5jdGlvbigpe319KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1tYWluL3RmLWhwYXJhbXMtbWFpbi5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLW1haW4iLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx0cmFja2luZ0lkOlN0cmluZyxoZWxwVXJsOlN0cmluZyxidWdSZXBvcnRVcmw6U3RyaW5nLF9jb25maWd1cmF0aW9uOk9iamVjdCxfc2Vzc2lvbkdyb3VwczpBcnJheSxfdGhyb3R0bGVkU2VuZEV2ZW50VG9HQTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Xy50aHJvdHRsZShmdW5jdGlvbigpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6IlVzZXJJbnRlcmFjdGlvbiIsZXZlbnRMYWJlbDoiRXhwZXJpbWVudDogIit0aGlzLmV4cGVyaW1lbnROYW1lfX0pfSw2RTQse2xlYWRpbmc6ITB9KX19LGxpc3RlbmVyczp7bW91c2Vtb3ZlOiJfc2VuZEV2ZW50VG9HQSIsdGFwOiJfc2VuZEV2ZW50VG9HQSIsImdvb2dsZS1hbmFseXRpY3MtdHJhY2tpbmciOiJfaGFuZGxlR0FFdmVudCJ9LGF0dGFjaGVkKCl7dGhpcy5faGFuZGxlR0FFdmVudCh7ZGV0YWlsOntoaXRUeXBlOiJwYWdldmlldyJ9fSl9LApyZWxvYWQoKXt0aGlzLiRbInF1ZXJ5LXBhbmUiXS5yZWxvYWQoKX0sX3NlbmRFdmVudFRvR0EoKXt0aGlzLl90aHJvdHRsZWRTZW5kRXZlbnRUb0dBKHRoaXMpfSxfaGFuZGxlR0FFdmVudChiKXt0aGlzLiQudHJhY2tlci5oYW5kbGVFdmVudChiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWJhY2tlbmQvdGYtaHBhcmFtcy1iYWNrZW5kLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtjbGFzcyBme2NvbnN0cnVjdG9yKGgsayx0PSEwKXt0aGlzLl9hcGlVcmw9aDt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX3VzZUh0dHBHZXQ9dH1nZXRFeHBlcmltZW50KGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsaCl9Z2V0RG93bmxvYWRVcmwoaCxrLHQpe3JldHVybiB0aGlzLl9hcGlVcmwrIi9kb3dubG9hZF9kYXRhPyIrbmV3IFVSTFNlYXJjaFBhcmFtcyh7Zm9ybWF0OmgsY29sdW1uc1Zpc2liaWxpdHk6SlNPTi5zdHJpbmdpZnkodCkscmVxdWVzdDpKU09OLnN0cmluZ2lmeShrKX0pfWxpc3RTZXNzaW9uR3JvdXBzKGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgic2Vzc2lvbl9ncm91cHMiLGgpfWxpc3RNZXRyaWNFdmFscyhoKXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoIm1ldHJpY19ldmFscyIsaCl9X3NlbmRSZXF1ZXN0KGgsayl7aWYodGhpcy5fdXNlSHR0cEdldClyZXR1cm4gaz1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoaykpLAp0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHRoaXMuX2FwaVVybCsiLyIraCsiP3JlcXVlc3RceDNkIitrKTtjb25zdCB0PW5ldyB2Yy5SZXF1ZXN0T3B0aW9uczt0LndpdGhDcmVkZW50aWFscz0hMDt0Lm1ldGhvZFR5cGU9IlBPU1QiO3QuY29udGVudFR5cGU9InRleHQvcGxhaW4iO3QuYm9keT1KU09OLnN0cmluZ2lmeShrKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdFdpdGhPcHRpb25zKHRoaXMuX2FwaVVybCsiLyIraCx0KX19ZC5CYWNrZW5kPWZ9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWRhc2hib2FyZC90Zi1ocGFyYW1zLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLWRhc2hib2FyZCIscHJvcGVydGllczp7X2JhY2tlbmQ6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdGYuaHBhcmFtcy5CYWNrZW5kKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJocGFyYW1zIiwiIiksbmV3IHZjLlJlcXVlc3RNYW5hZ2VyLCEhKHdpbmRvdy5URU5TT1JCT0FSRF9FTlZ8fHt9KS5JTl9DT0xBQil9fSxyZWxvYWQoKXt0aGlzLiRbImhwYXJhbXMtbWFpbiJdLnJlbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbXBvcnRzL3RocmVlLmpzCihmdW5jdGlvbihiLGQpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIG1vZHVsZT9kKGV4cG9ydHMpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxkKTooYj1ifHxzZWxmLGQoYi5USFJFRT17fSkpfSkodGhpcyxmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7fWZ1bmN0aW9uIGYoYSxjKXt0aGlzLng9YXx8MDt0aGlzLnk9Y3x8MH1mdW5jdGlvbiBoKGEsYyxlLGcpe3RoaXMuX3g9YXx8MDt0aGlzLl95PWN8fDA7dGhpcy5fej1lfHwwO3RoaXMuX3c9dm9pZCAwIT09Zz9nOjF9ZnVuY3Rpb24gayhhLGMsZSl7dGhpcy54PWF8fDA7dGhpcy55PWN8fDA7dGhpcy56PWV8fDB9ZnVuY3Rpb24gdCgpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9CmZ1bmN0aW9uIGwoYSxjLGUsZyxyLHYseixFLEYsSil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6TmsrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy5pbWFnZT12b2lkIDAhPT1hP2E6bC5ERUZBVUxUX0lNQUdFO3RoaXMubWlwbWFwcz1bXTt0aGlzLm1hcHBpbmc9dm9pZCAwIT09Yz9jOmwuREVGQVVMVF9NQVBQSU5HO3RoaXMud3JhcFM9dm9pZCAwIT09ZT9lOjEwMDE7dGhpcy53cmFwVD12b2lkIDAhPT1nP2c6MTAwMTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwODt0aGlzLmFuaXNvdHJvcHk9dm9pZCAwIT09Rj9GOjE7dGhpcy5mb3JtYXQ9dm9pZCAwIT09ej96OjEwMjM7dGhpcy50eXBlPXZvaWQgMCE9PUU/RToxMDA5O3RoaXMub2Zmc2V0PW5ldyBmKDAsMCk7dGhpcy5yZXBlYXQ9bmV3IGYoMSwxKTt0aGlzLmNlbnRlcj1uZXcgZigwLDApOwp0aGlzLnJvdGF0aW9uPTA7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwO3RoaXMubWF0cml4PW5ldyB0O3RoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwO3RoaXMucHJlbXVsdGlwbHlBbHBoYT0hMTt0aGlzLmZsaXBZPSEwO3RoaXMudW5wYWNrQWxpZ25tZW50PTQ7dGhpcy5lbmNvZGluZz12b2lkIDAhPT1KP0o6M0UzO3RoaXMudmVyc2lvbj0wO3RoaXMub25VcGRhdGU9bnVsbH1mdW5jdGlvbiBwKGEsYyxlLGcpe3RoaXMueD1hfHwwO3RoaXMueT1jfHwwO3RoaXMuej1lfHwwO3RoaXMudz12b2lkIDAhPT1nP2c6MX1mdW5jdGlvbiBtKGEsYyxlKXt0aGlzLndpZHRoPWE7dGhpcy5oZWlnaHQ9Yzt0aGlzLnNjaXNzb3I9bmV3IHAoMCwwLGEsYyk7dGhpcy5zY2lzc29yVGVzdD0hMTt0aGlzLnZpZXdwb3J0PW5ldyBwKDAsMCxhLGMpO2U9ZXx8e307dGhpcy50ZXh0dXJlPW5ldyBsKHZvaWQgMCx2b2lkIDAsZS53cmFwUyxlLndyYXBULGUubWFnRmlsdGVyLGUubWluRmlsdGVyLGUuZm9ybWF0LGUudHlwZSwKZS5hbmlzb3Ryb3B5LGUuZW5jb2RpbmcpO3RoaXMudGV4dHVyZS5pbWFnZT17fTt0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YTt0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWM7dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1lLmdlbmVyYXRlTWlwbWFwcz9lLmdlbmVyYXRlTWlwbWFwczohMTt0aGlzLnRleHR1cmUubWluRmlsdGVyPXZvaWQgMCE9PWUubWluRmlsdGVyP2UubWluRmlsdGVyOjEwMDY7dGhpcy5kZXB0aEJ1ZmZlcj12b2lkIDAhPT1lLmRlcHRoQnVmZmVyP2UuZGVwdGhCdWZmZXI6ITA7dGhpcy5zdGVuY2lsQnVmZmVyPXZvaWQgMCE9PWUuc3RlbmNpbEJ1ZmZlcj9lLnN0ZW5jaWxCdWZmZXI6ITA7dGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09ZS5kZXB0aFRleHR1cmU/ZS5kZXB0aFRleHR1cmU6bnVsbH1mdW5jdGlvbiBuKGEsYyxlKXttLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5zYW1wbGVzPTR9ZnVuY3Rpb24gcSgpe3RoaXMuZWxlbWVudHM9ClsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9ZnVuY3Rpb24gdShhLGMsZSxnKXt0aGlzLl94PWF8fDA7dGhpcy5feT1jfHwwO3RoaXMuX3o9ZXx8MDt0aGlzLl9vcmRlcj1nfHx1LkRlZmF1bHRPcmRlcn1mdW5jdGlvbiB4KCl7dGhpcy5tYXNrPTF9ZnVuY3Rpb24gQSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk9rKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iT2JqZWN0M0QiO3RoaXMucGFyZW50PW51bGw7dGhpcy5jaGlsZHJlbj1bXTt0aGlzLnVwPUEuRGVmYXVsdFVwLmNsb25lKCk7dmFyIGE9bmV3IGssYz1uZXcgdSxlPW5ldyBoLGc9bmV3IGsoMSwxLDEpO2MuX29uQ2hhbmdlKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tRXVsZXIoYywKITEpfSk7ZS5fb25DaGFuZ2UoZnVuY3Rpb24oKXtjLnNldEZyb21RdWF0ZXJuaW9uKGUsdm9pZCAwLCExKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTphfSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y30scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmd9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHF9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IHR9fSk7dGhpcy5tYXRyaXg9bmV3IHE7dGhpcy5tYXRyaXhXb3JsZD1uZXcgcTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9QS5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITE7dGhpcy5sYXllcnM9bmV3IHg7dGhpcy52aXNpYmxlPSEwOwp0aGlzLnJlY2VpdmVTaGFkb3c9dGhpcy5jYXN0U2hhZG93PSExO3RoaXMuZnJ1c3R1bUN1bGxlZD0hMDt0aGlzLnJlbmRlck9yZGVyPTA7dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB5KCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2NlbmUiO3RoaXMub3ZlcnJpZGVNYXRlcmlhbD10aGlzLmZvZz10aGlzLmJhY2tncm91bmQ9bnVsbDt0aGlzLmF1dG9VcGRhdGU9ITA7InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB3KGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBrKEluZmluaXR5LEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGsoLUluZmluaXR5LC1JbmZpbml0eSwtSW5maW5pdHkpfWZ1bmN0aW9uIEMoYSxjLGUsZyxyKXt2YXIgdjt2YXIgej0wO2Zvcih2PWEubGVuZ3RoLQozO3o8PXY7eis9Myl7S2QuZnJvbUFycmF5KGEseik7dmFyIEU9Yy5kb3QoS2QpLEY9ZS5kb3QoS2QpLEo9Zy5kb3QoS2QpO2lmKE1hdGgubWF4KC1NYXRoLm1heChFLEYsSiksTWF0aC5taW4oRSxGLEopKT5yLngqTWF0aC5hYnMoS2QueCkrci55Kk1hdGguYWJzKEtkLnkpK3IueipNYXRoLmFicyhLZC56KSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBHKGEsYyl7dGhpcy5jZW50ZXI9dm9pZCAwIT09YT9hOm5ldyBrO3RoaXMucmFkaXVzPXZvaWQgMCE9PWM/YzowfWZ1bmN0aW9uIEQoYSxjKXt0aGlzLm9yaWdpbj12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5kaXJlY3Rpb249dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIEIoYSxjLGUpe3RoaXMuYT12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5iPXZvaWQgMCE9PWM/YzpuZXcgazt0aGlzLmM9dm9pZCAwIT09ZT9lOm5ldyBrfWZ1bmN0aW9uIEkoYSxjLGUpe3JldHVybiB2b2lkIDA9PT1jJiZ2b2lkIDA9PT1lP3RoaXMuc2V0KGEpOgp0aGlzLnNldFJHQihhLGMsZSl9ZnVuY3Rpb24gTihhLGMsZSl7MD5lJiYoZSs9MSk7MTxlJiYtLWU7cmV0dXJuIGU8MS82P2ErNiooYy1hKSplOi41PmU/YzplPDIvMz9hKzYqKGMtYSkqKDIvMy1lKTphfWZ1bmN0aW9uIE8oYSl7cmV0dXJuLjA0MDQ1PmE/LjA3NzM5OTM4MDgqYTpNYXRoLnBvdyguOTQ3ODY3Mjk4NiphKy4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gSChhKXtyZXR1cm4uMDAzMTMwOD5hPzEyLjkyKmE6MS4wNTUqTWF0aC5wb3coYSwuNDE2NjYpLS4wNTV9ZnVuY3Rpb24gSyhhLGMsZSxnLHIsdil7dGhpcy5hPWE7dGhpcy5iPWM7dGhpcy5jPWU7dGhpcy5ub3JtYWw9ZyYmZy5pc1ZlY3RvcjM/ZzpuZXcgazt0aGlzLnZlcnRleE5vcm1hbHM9QXJyYXkuaXNBcnJheShnKT9nOltdO3RoaXMuY29sb3I9ciYmci5pc0NvbG9yP3I6bmV3IEk7dGhpcy52ZXJ0ZXhDb2xvcnM9QXJyYXkuaXNBcnJheShyKT9yOltdO3RoaXMubWF0ZXJpYWxJbmRleD12b2lkIDAhPT12P3Y6MH0KZnVuY3Rpb24gTSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlBrKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iTWF0ZXJpYWwiO3RoaXMubGlnaHRzPXRoaXMuZm9nPSEwO3RoaXMuYmxlbmRpbmc9MTt0aGlzLnNpZGU9MDt0aGlzLnZlcnRleFRhbmdlbnRzPXRoaXMuZmxhdFNoYWRpbmc9ITE7dGhpcy52ZXJ0ZXhDb2xvcnM9MDt0aGlzLm9wYWNpdHk9MTt0aGlzLnRyYW5zcGFyZW50PSExO3RoaXMuYmxlbmRTcmM9MjA0O3RoaXMuYmxlbmREc3Q9MjA1O3RoaXMuYmxlbmRFcXVhdGlvbj0xMDA7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmRTcmNBbHBoYT1udWxsO3RoaXMuZGVwdGhGdW5jPTM7dGhpcy5kZXB0aFdyaXRlPXRoaXMuZGVwdGhUZXN0PSEwO3RoaXMuc3RlbmNpbEZ1bmM9NTE5O3RoaXMuc3RlbmNpbFJlZj0wO3RoaXMuc3RlbmNpbE1hc2s9CjI1NTt0aGlzLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxGYWlsPTc2ODA7dGhpcy5zdGVuY2lsV3JpdGU9ITE7dGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsO3RoaXMuY2xpcFNoYWRvd3M9dGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExO3RoaXMuc2hhZG93U2lkZT1udWxsO3RoaXMuY29sb3JXcml0ZT0hMDt0aGlzLnByZWNpc2lvbj1udWxsO3RoaXMucG9seWdvbk9mZnNldD0hMTt0aGlzLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MDt0aGlzLmRpdGhlcmluZz0hMTt0aGlzLmFscGhhVGVzdD0wO3RoaXMucHJlbXVsdGlwbGllZEFscGhhPSExO3RoaXMudG9uZU1hcHBlZD10aGlzLnZpc2libGU9ITA7dGhpcy51c2VyRGF0YT17fTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIEwoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9CnRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUShhLGMsZSl7aWYoQXJyYXkuaXNBcnJheShhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMubmFtZT0iIjt0aGlzLmFycmF5PWE7dGhpcy5pdGVtU2l6ZT0KYzt0aGlzLmNvdW50PXZvaWQgMCE9PWE/YS5sZW5ndGgvYzowO3RoaXMubm9ybWFsaXplZD0hMD09PWU7dGhpcy5keW5hbWljPSExO3RoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfTt0aGlzLnZlcnNpb249MH1mdW5jdGlvbiBUKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgSW50OEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWChhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBhYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gbGEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWihhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gYmEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQzMkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gZWEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBVaW50MzJBcnJheShhKSwKYyxlKX1mdW5jdGlvbiBjYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IEZsb2F0MzJBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGthKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgRmxvYXQ2NEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWSgpe3RoaXMudmVydGljZXM9W107dGhpcy5ub3JtYWxzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMudXZzPVtdO3RoaXMudXZzMj1bXTt0aGlzLmdyb3Vwcz1bXTt0aGlzLm1vcnBoVGFyZ2V0cz17fTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBFYShhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuLUluZmluaXR5O2Zvcih2YXIgYz1hWzBdLGU9MSxnPQphLmxlbmd0aDtlPGc7KytlKWFbZV0+YyYmKGM9YVtlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpRays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSI7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDpJbmZpbml0eX07dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB4YShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2giO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgTCh7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMuZHJhd01vZGU9CjA7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1mdW5jdGlvbiBBYShhLGMsZSxnLHIsdix6LEUpe2lmKG51bGw9PT0oMT09PWMuc2lkZT9nLmludGVyc2VjdFRyaWFuZ2xlKHosdixyLCEwLEUpOmcuaW50ZXJzZWN0VHJpYW5nbGUocix2LHosMiE9PWMuc2lkZSxFKSkpcmV0dXJuIG51bGw7c2cuY29weShFKTtzZy5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCk7Yz1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhzZyk7cmV0dXJuIGM8ZS5uZWFyfHxjPmUuZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6c2cuY2xvbmUoKSxvYmplY3Q6YX19ZnVuY3Rpb24gRmEoYSxjLGUsZyxyLHYseixFLEYsSixQKXtMZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsRik7TWQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLEopO05kLmZyb21CdWZmZXJBdHRyaWJ1dGUocixQKTtyPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGMubW9ycGhUYXJnZXRzJiZ2JiZyKXtJaC5zZXQoMCwwLDApO0poLnNldCgwLDAsMCk7CktoLnNldCgwLDAsMCk7Zm9yKHZhciBSPTAsUz12Lmxlbmd0aDtSPFM7UisrKXt2YXIgVj1yW1JdLFc9dltSXTswIT09ViYmKCRpLmZyb21CdWZmZXJBdHRyaWJ1dGUoVyxGKSxhai5mcm9tQnVmZmVyQXR0cmlidXRlKFcsSiksYmouZnJvbUJ1ZmZlckF0dHJpYnV0ZShXLFApLEloLmFkZFNjYWxlZFZlY3RvcigkaS5zdWIoTGQpLFYpLEpoLmFkZFNjYWxlZFZlY3Rvcihhai5zdWIoTWQpLFYpLEtoLmFkZFNjYWxlZFZlY3Rvcihiai5zdWIoTmQpLFYpKX1MZC5hZGQoSWgpO01kLmFkZChKaCk7TmQuYWRkKEtoKX1pZihhPUFhKGEsYyxlLGcsTGQsTWQsTmQsc2YpKXomJihvZS5mcm9tQnVmZmVyQXR0cmlidXRlKHosRikscGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LEopLHFlLmZyb21CdWZmZXJBdHRyaWJ1dGUoeixQKSxhLnV2PUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSxFJiYob2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLEYpLHBlLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSwKSikscWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLFApLGEudXYyPUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSx6PW5ldyBLKEYsSixQKSxCLmdldE5vcm1hbChMZCxNZCxOZCx6Lm5vcm1hbCksYS5mYWNlPXo7cmV0dXJuIGF9ZnVuY3Rpb24geWEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpSays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJHZW9tZXRyeSI7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9CnRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT10aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBTYShhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJveEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsZGVwdGg6ZSx3aWR0aFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixkZXB0aFNlZ21lbnRzOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYYShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFhhKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KFcsaGEsZmEscmEscGEscWEsdWEsb2EsdGEsQmEsVGEpe3ZhciBVYT1xYS90YSxDYT11YS9CYSxIYT1xYS8yLERhPXVhLzIsTWE9b2EvMjt1YT10YSsxO3ZhciBkYj1CYSsxLHRiPXFhPTAsS2EsYmIsamI9bmV3IGs7Zm9yKGJiPQowO2JiPGRiO2JiKyspe3ZhciBFYj1iYipDYS1EYTtmb3IoS2E9MDtLYTx1YTtLYSsrKWpiW1ddPShLYSpVYS1IYSkqcmEsamJbaGFdPUViKnBhLGpiW2ZhXT1NYSxKLnB1c2goamIueCxqYi55LGpiLnopLGpiW1ddPTAsamJbaGFdPTAsamJbZmFdPTA8b2E/MTotMSxQLnB1c2goamIueCxqYi55LGpiLnopLFIucHVzaChLYS90YSksUi5wdXNoKDEtYmIvQmEpLHFhKz0xfWZvcihiYj0wO2JiPEJhO2JiKyspZm9yKEthPTA7S2E8dGE7S2ErKylXPVMrS2ErdWEqKGJiKzEpLGhhPVMrKEthKzEpK3VhKihiYisxKSxmYT1TKyhLYSsxKSt1YSpiYixGLnB1c2goUytLYSt1YSpiYixXLGZhKSxGLnB1c2goVyxoYSxmYSksdGIrPTY7RS5hZGRHcm91cChWLHRiLFRhKTtWKz10YjtTKz1xYX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94QnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6YyxkZXB0aDplLHdpZHRoU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czpyLApkZXB0aFNlZ21lbnRzOnZ9O3ZhciBFPXRoaXM7YT1hfHwxO2M9Y3x8MTtlPWV8fDE7Zz1NYXRoLmZsb29yKGcpfHwxO3I9TWF0aC5mbG9vcihyKXx8MTt2PU1hdGguZmxvb3Iodil8fDE7dmFyIEY9W10sSj1bXSxQPVtdLFI9W10sUz0wLFY9MDt6KCJ6IiwieSIsIngiLC0xLC0xLGUsYyxhLHYsciwwKTt6KCJ6IiwieSIsIngiLDEsLTEsZSxjLC1hLHYsciwxKTt6KCJ4IiwieiIsInkiLDEsMSxhLGUsYyxnLHYsMik7eigieCIsInoiLCJ5IiwxLC0xLGEsZSwtYyxnLHYsMyk7eigieCIsInkiLCJ6IiwxLC0xLGEsYyxlLGcsciw0KTt6KCJ4IiwieSIsInoiLC0xLC0xLGEsYywtZSxnLHIsNSk7dGhpcy5zZXRJbmRleChGKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShKLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoUiwyKSl9ZnVuY3Rpb24gdWIoYSl7dmFyIGM9e30sZTtmb3IoZSBpbiBhKXtjW2VdPQp7fTtmb3IodmFyIGcgaW4gYVtlXSl7dmFyIHI9YVtlXVtnXTtjW2VdW2ddPXImJihyLmlzQ29sb3J8fHIuaXNNYXRyaXgzfHxyLmlzTWF0cml4NHx8ci5pc1ZlY3RvcjJ8fHIuaXNWZWN0b3IzfHxyLmlzVmVjdG9yNHx8ci5pc1RleHR1cmUpP3IuY2xvbmUoKTpBcnJheS5pc0FycmF5KHIpP3Iuc2xpY2UoKTpyfX1yZXR1cm4gY31mdW5jdGlvbiBCYihhKXtmb3IodmFyIGM9e30sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz11YihhW2VdKSxyO2ZvcihyIGluIGcpY1tyXT1nW3JdfXJldHVybiBjfWZ1bmN0aW9uIHFiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIjt0aGlzLmRlZmluZXM9e307dGhpcy51bmlmb3Jtcz17fTt0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Ijt0aGlzLmZyYWdtZW50U2hhZGVyPQoidm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0iO3RoaXMubGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMuY2xpcHBpbmc9dGhpcy5saWdodHM9dGhpcy5mb2c9ITE7dGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX07dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX07dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMDt0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMTt2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSwKdGhpcy5zZXRWYWx1ZXMoYSkpfWZ1bmN0aW9uIHpiKCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2FtZXJhIjt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgcTt0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IHE7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiB2YihhLGMsZSxnKXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiO3RoaXMuZm92PXZvaWQgMCE9PWE/YTo1MDt0aGlzLnpvb209MTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOi4xO3RoaXMuZmFyPXZvaWQgMCE9PWc/ZzoyRTM7dGhpcy5mb2N1cz0xMDt0aGlzLmFzcGVjdD12b2lkIDAhPT1jP2M6MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmZpbG1HYXVnZT0zNTt0aGlzLmZpbG1PZmZzZXQ9MDt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBHYihhLGMsZSxnKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJlQ2FtZXJhIjt2YXIgcj1uZXcgdmIoOTAsCjEsYSxjKTtyLnVwLnNldCgwLC0xLDApO3IubG9va0F0KG5ldyBrKDEsMCwwKSk7dGhpcy5hZGQocik7dmFyIHY9bmV3IHZiKDkwLDEsYSxjKTt2LnVwLnNldCgwLC0xLDApO3YubG9va0F0KG5ldyBrKC0xLDAsMCkpO3RoaXMuYWRkKHYpO3ZhciB6PW5ldyB2Yig5MCwxLGEsYyk7ei51cC5zZXQoMCwwLDEpO3oubG9va0F0KG5ldyBrKDAsMSwwKSk7dGhpcy5hZGQoeik7dmFyIEU9bmV3IHZiKDkwLDEsYSxjKTtFLnVwLnNldCgwLDAsLTEpO0UubG9va0F0KG5ldyBrKDAsLTEsMCkpO3RoaXMuYWRkKEUpO3ZhciBGPW5ldyB2Yig5MCwxLGEsYyk7Ri51cC5zZXQoMCwtMSwwKTtGLmxvb2tBdChuZXcgaygwLDAsMSkpO3RoaXMuYWRkKEYpO3ZhciBKPW5ldyB2Yig5MCwxLGEsYyk7Si51cC5zZXQoMCwtMSwwKTtKLmxvb2tBdChuZXcgaygwLDAsLTEpKTt0aGlzLmFkZChKKTtnPWd8fHtmb3JtYXQ6MTAyMixtYWdGaWx0ZXI6MTAwNixtaW5GaWx0ZXI6MTAwNn07dGhpcy5yZW5kZXJUYXJnZXQ9Cm5ldyBOYihlLGUsZyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhIjt0aGlzLnVwZGF0ZT1mdW5jdGlvbihQLFIpe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO3ZhciBTPVAuZ2V0UmVuZGVyVGFyZ2V0KCksVj10aGlzLnJlbmRlclRhcmdldCxXPVYudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7Vi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMTtQLnNldFJlbmRlclRhcmdldChWLDApO1AucmVuZGVyKFIscik7UC5zZXRSZW5kZXJUYXJnZXQoViwxKTtQLnJlbmRlcihSLHYpO1Auc2V0UmVuZGVyVGFyZ2V0KFYsMik7UC5yZW5kZXIoUix6KTtQLnNldFJlbmRlclRhcmdldChWLDMpO1AucmVuZGVyKFIsRSk7UC5zZXRSZW5kZXJUYXJnZXQoViw0KTtQLnJlbmRlcihSLEYpO1YudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9VztQLnNldFJlbmRlclRhcmdldChWLDUpO1AucmVuZGVyKFIsSik7UC5zZXRSZW5kZXJUYXJnZXQoUyl9Owp0aGlzLmNsZWFyPWZ1bmN0aW9uKFAsUixTLFYpe2Zvcih2YXIgVz1QLmdldFJlbmRlclRhcmdldCgpLGhhPXRoaXMucmVuZGVyVGFyZ2V0LGZhPTA7Nj5mYTtmYSsrKVAuc2V0UmVuZGVyVGFyZ2V0KGhhLGZhKSxQLmNsZWFyKFIsUyxWKTtQLnNldFJlbmRlclRhcmdldChXKX19ZnVuY3Rpb24gTmIoYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKX1mdW5jdGlvbiBBYihhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsUik7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUY/RjoxMDAzO3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PUo/SjoxMDAzO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MX1mdW5jdGlvbiBIYihhLGMpe3RoaXMubm9ybWFsPXZvaWQgMCE9PWE/YTpuZXcgaygxLDAsMCk7dGhpcy5jb25zdGFudD12b2lkIDAhPT0KYz9jOjB9ZnVuY3Rpb24gaWMoYSxjLGUsZyxyLHYpe3RoaXMucGxhbmVzPVt2b2lkIDAhPT1hP2E6bmV3IEhiLHZvaWQgMCE9PWM/YzpuZXcgSGIsdm9pZCAwIT09ZT9lOm5ldyBIYix2b2lkIDAhPT1nP2c6bmV3IEhiLHZvaWQgMCE9PXI/cjpuZXcgSGIsdm9pZCAwIT09dj92Om5ldyBIYl19ZnVuY3Rpb24gYmMoKXtmdW5jdGlvbiBhKHIsdil7ITEhPT1lJiYoZyhyLHYpLGMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpKX12YXIgYz1udWxsLGU9ITEsZz1udWxsO3JldHVybntzdGFydDpmdW5jdGlvbigpeyEwIT09ZSYmbnVsbCE9PWcmJihjLnJlcXVlc3RBbmltYXRpb25GcmFtZShhKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe2U9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocil7Zz1yfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHIpe2M9cn19fWZ1bmN0aW9uIE9kKGEpe2Z1bmN0aW9uIGMocix2KXt2YXIgej1yLmFycmF5LEU9ci5keW5hbWljPzM1MDQ4OjM1MDQ0LEY9YS5jcmVhdGVCdWZmZXIoKTsKYS5iaW5kQnVmZmVyKHYsRik7YS5idWZmZXJEYXRhKHYseixFKTtyLm9uVXBsb2FkQ2FsbGJhY2soKTt2PTUxMjY7eiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT92PTUxMjY6eiBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6eiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P3Y9NTEyMzp6IGluc3RhbmNlb2YgSW50MTZBcnJheT92PTUxMjI6eiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Y9NTEyNTp6IGluc3RhbmNlb2YgSW50MzJBcnJheT92PTUxMjQ6eiBpbnN0YW5jZW9mIEludDhBcnJheT92PTUxMjA6eiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih2PTUxMjEpO3JldHVybntidWZmZXI6Rix0eXBlOnYsYnl0ZXNQZXJFbGVtZW50OnouQllURVNfUEVSX0VMRU1FTlQsdmVyc2lvbjpyLnZlcnNpb259fWZ1bmN0aW9uIGUocix2LHope3ZhciBFPQp2LmFycmF5LEY9di51cGRhdGVSYW5nZTthLmJpbmRCdWZmZXIoeixyKTshMT09PXYuZHluYW1pYz9hLmJ1ZmZlckRhdGEoeixFLDM1MDQ0KTotMT09PUYuY291bnQ/YS5idWZmZXJTdWJEYXRhKHosMCxFKTowPT09Ri5jb3VudD9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LiIpOihhLmJ1ZmZlclN1YkRhdGEoeixGLm9mZnNldCpFLkJZVEVTX1BFUl9FTEVNRU5ULEUuc3ViYXJyYXkoRi5vZmZzZXQsRi5vZmZzZXQrRi5jb3VudCkpLEYuY291bnQ9LTEpfXZhciBnPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24ocil7ci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYocj1yLmRhdGEpO3JldHVybiBnLmdldChyKX0sCnJlbW92ZTpmdW5jdGlvbihyKXtyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihyPXIuZGF0YSk7dmFyIHY9Zy5nZXQocik7diYmKGEuZGVsZXRlQnVmZmVyKHYuYnVmZmVyKSxnLmRlbGV0ZShyKSl9LHVwZGF0ZTpmdW5jdGlvbihyLHYpe3IuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHI9ci5kYXRhKTt2YXIgej1nLmdldChyKTt2b2lkIDA9PT16P2cuc2V0KHIsYyhyLHYpKTp6LnZlcnNpb248ci52ZXJzaW9uJiYoZSh6LmJ1ZmZlcixyLHYpLHoudmVyc2lvbj1yLnZlcnNpb24pfX19ZnVuY3Rpb24gcmQoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IExjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBMYyhhLGMsZSxnKXt2YS5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IlBsYW5lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307YT1hfHwxO2M9Y3x8MTt2YXIgcj1hLzIsdj1jLzI7ZT1NYXRoLmZsb29yKGUpfHwxO2c9TWF0aC5mbG9vcihnKXx8MTt2YXIgej1lKzEsRT1nKzEsRj1hL2UsSj1jL2csUD1bXSxSPVtdLFM9W10sVj1bXTtmb3IoYT0wO2E8RTthKyspe3ZhciBXPWEqSi12O2ZvcihjPTA7Yzx6O2MrKylSLnB1c2goYypGLXIsLVcsMCksUy5wdXNoKDAsMCwxKSxWLnB1c2goYy9lKSxWLnB1c2goMS1hL2cpfWZvcihhPTA7YTxnO2ErKylmb3IoYz0wO2M8ZTtjKyspcj1jK3oqKGErMSksdj1jKzEreiooYSsxKSxFPWMrMSt6KmEsUC5wdXNoKGMreiphLHIsRSksUC5wdXNoKHIsdixFKTt0aGlzLnNldEluZGV4KFApO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLApuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gc2QoYSxjLGUsZyl7ZnVuY3Rpb24gcihSLFMpe2MuYnVmZmVycy5jb2xvci5zZXRDbGVhcihSLnIsUi5nLFIuYixTLGcpfXZhciB2PW5ldyBJKDApLHo9MCxFLEYsSj1udWxsLFA9MDtyZXR1cm57Z2V0Q2xlYXJDb2xvcjpmdW5jdGlvbigpe3JldHVybiB2fSxzZXRDbGVhckNvbG9yOmZ1bmN0aW9uKFIsUyl7di5zZXQoUik7ej12b2lkIDAhPT1TP1M6MTtyKHYseil9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gen0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbihSKXt6PVI7cih2LHopfSxyZW5kZXI6ZnVuY3Rpb24oUixTLFYsVyl7Uz1TLmJhY2tncm91bmQ7Vj1hLnZyOyhWPVYuZ2V0U2Vzc2lvbiYmVi5nZXRTZXNzaW9uKCkpJiYiYWRkaXRpdmUiPT09Vi5lbnZpcm9ubWVudEJsZW5kTW9kZSYmKFM9bnVsbCk7bnVsbD09PVM/KHIodix6KSxKPW51bGwsUD0wKTpTJiZTLmlzQ29sb3ImJgoocihTLDEpLFc9ITAsSj1udWxsLFA9MCk7KGEuYXV0b0NsZWFyfHxXKSYmYS5jbGVhcihhLmF1dG9DbGVhckNvbG9yLGEuYXV0b0NsZWFyRGVwdGgsYS5hdXRvQ2xlYXJTdGVuY2lsKTtpZihTJiYoUy5pc0N1YmVUZXh0dXJlfHxTLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSl7dm9pZCAwPT09RiYmKEY9bmV3IHhhKG5ldyBYYSgxLDEsMSksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczp1YihNYy5jdWJlLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6TWMuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6TWMuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEYuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxGLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgidXYiKSxGLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKGhhLGZhLHJhKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihyYS5tYXRyaXhXb3JsZCl9LApPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudEN1YmUudmFsdWV9fSksZS51cGRhdGUoRikpO1c9Uy5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT9TLnRleHR1cmU6UztGLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlPVc7Ri5tYXRlcmlhbC51bmlmb3Jtcy50RmxpcC52YWx1ZT1TLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzE6LTE7aWYoSiE9PVN8fFAhPT1XLnZlcnNpb24pRi5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1XLnZlcnNpb247Ui51bnNoaWZ0KEYsRi5nZW9tZXRyeSxGLm1hdGVyaWFsLDAsMCxudWxsKX1lbHNlIGlmKFMmJlMuaXNUZXh0dXJlKXt2b2lkIDA9PT1FJiYoRT1uZXcgeGEobmV3IExjKDIsMiksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOnViKE1jLmJhY2tncm91bmQudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpNYy5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlciwKZnJhZ21lbnRTaGFkZXI6TWMuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEUuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGUudXBkYXRlKEUpKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1TOyEwPT09Uy5tYXRyaXhBdXRvVXBkYXRlJiZTLnVwZGF0ZU1hdHJpeCgpO0UubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShTLm1hdHJpeCk7aWYoSiE9PVN8fFAhPT1TLnZlcnNpb24pRS5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1TLnZlcnNpb247Ui51bnNoaWZ0KEUsRS5nZW9tZXRyeSxFLm1hdGVyaWFsLDAsMCxudWxsKX19fX1mdW5jdGlvbiBzYShhLGMsZSxnKXt2YXIgcjt0aGlzLnNldE1vZGU9CmZ1bmN0aW9uKHYpe3I9dn07dGhpcy5yZW5kZXI9ZnVuY3Rpb24odix6KXthLmRyYXdBcnJheXMocix2LHopO2UudXBkYXRlKHoscil9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKHYseixFKXtpZihnLmlzV2ViR0wyKXt2YXIgRj1hO3ZhciBKPSJkcmF3QXJyYXlzSW5zdGFuY2VkIn1lbHNlIGlmKEY9Yy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxKPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1GKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59RltKXShyLHosRSx2Lm1heEluc3RhbmNlZENvdW50KTtlLnVwZGF0ZShFLHIsdi5tYXhJbnN0YW5jZWRDb3VudCl9fWZ1bmN0aW9uIE1iKGEsYyxlKXtmdW5jdGlvbiBnKHFhKXtpZigiaGlnaHAiPT09CnFhKXtpZigwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24mJjA8YS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbilyZXR1cm4iaGlnaHAiO3FhPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1xYSYmMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uJiYwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24/Im1lZGl1bXAiOiJsb3dwIn12YXIgcix2PSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJmEgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LHo9dm9pZCAwIT09ZS5wcmVjaXNpb24/ZS5wcmVjaXNpb246ImhpZ2hwIixFPWcoeik7RSE9PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6Iix6LCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsRSwiaW5zdGVhZC4iKSwKej1FKTtlPSEwPT09ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyO0U9YS5nZXRQYXJhbWV0ZXIoMzQ5MzApO3ZhciBGPWEuZ2V0UGFyYW1ldGVyKDM1NjYwKSxKPWEuZ2V0UGFyYW1ldGVyKDMzNzkpLFA9YS5nZXRQYXJhbWV0ZXIoMzQwNzYpLFI9YS5nZXRQYXJhbWV0ZXIoMzQ5MjEpLFM9YS5nZXRQYXJhbWV0ZXIoMzYzNDcpLFY9YS5nZXRQYXJhbWV0ZXIoMzYzNDgpLFc9YS5nZXRQYXJhbWV0ZXIoMzYzNDkpLGhhPTA8RixmYT12fHwhIWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpLHJhPWhhJiZmYSxwYT12P2EuZ2V0UGFyYW1ldGVyKDM2MTgzKTowO3JldHVybntpc1dlYkdMMjp2LGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1yKXJldHVybiByO3ZhciBxYT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7cmV0dXJuIHI9bnVsbCE9PXFhP2EuZ2V0UGFyYW1ldGVyKHFhLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCk6MH0sCmdldE1heFByZWNpc2lvbjpnLHByZWNpc2lvbjp6LGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6ZSxtYXhUZXh0dXJlczpFLG1heFZlcnRleFRleHR1cmVzOkYsbWF4VGV4dHVyZVNpemU6SixtYXhDdWJlbWFwU2l6ZTpQLG1heEF0dHJpYnV0ZXM6UixtYXhWZXJ0ZXhVbmlmb3JtczpTLG1heFZhcnlpbmdzOlYsbWF4RnJhZ21lbnRVbmlmb3JtczpXLHZlcnRleFRleHR1cmVzOmhhLGZsb2F0RnJhZ21lbnRUZXh0dXJlczpmYSxmbG9hdFZlcnRleFRleHR1cmVzOnJhLG1heFNhbXBsZXM6cGF9fWZ1bmN0aW9uIHdjKCl7ZnVuY3Rpb24gYSgpe0oudmFsdWUhPT1nJiYoSi52YWx1ZT1nLEoubmVlZHNVcGRhdGU9MDxyKTtlLm51bVBsYW5lcz1yO2UubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gYyhQLFIsUyxWKXt2YXIgVz1udWxsIT09UD9QLmxlbmd0aDowLGhhPW51bGw7aWYoMCE9PVcpe2hhPUoudmFsdWU7aWYoITAhPT1WfHxudWxsPT09aGEpe1Y9Uys0Klc7Uj1SLm1hdHJpeFdvcmxkSW52ZXJzZTsKRi5nZXROb3JtYWxNYXRyaXgoUik7aWYobnVsbD09PWhhfHxoYS5sZW5ndGg8ViloYT1uZXcgRmxvYXQzMkFycmF5KFYpO2ZvcihWPTA7ViE9PVc7KytWLFMrPTQpRS5jb3B5KFBbVl0pLmFwcGx5TWF0cml4NChSLEYpLEUubm9ybWFsLnRvQXJyYXkoaGEsUyksaGFbUyszXT1FLmNvbnN0YW50fUoudmFsdWU9aGE7Si5uZWVkc1VwZGF0ZT0hMH1lLm51bVBsYW5lcz1XO3JldHVybiBoYX12YXIgZT10aGlzLGc9bnVsbCxyPTAsdj0hMSx6PSExLEU9bmV3IEhiLEY9bmV3IHQsSj17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07dGhpcy51bmlmb3JtPUo7dGhpcy5udW1JbnRlcnNlY3Rpb249dGhpcy5udW1QbGFuZXM9MDt0aGlzLmluaXQ9ZnVuY3Rpb24oUCxSLFMpe3ZhciBWPTAhPT1QLmxlbmd0aHx8Unx8MCE9PXJ8fHY7dj1SO2c9YyhQLFMsMCk7cj1QLmxlbmd0aDtyZXR1cm4gVn07dGhpcy5iZWdpblNoYWRvd3M9ZnVuY3Rpb24oKXt6PSEwO2MobnVsbCl9O3RoaXMuZW5kU2hhZG93cz0KZnVuY3Rpb24oKXt6PSExO2EoKX07dGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihQLFIsUyxWLFcsaGEpe2lmKCF2fHxudWxsPT09UHx8MD09PVAubGVuZ3RofHx6JiYhUyl6P2MobnVsbCk6YSgpO2Vsc2V7Uz16PzA6cjt2YXIgZmE9NCpTLHJhPVcuY2xpcHBpbmdTdGF0ZXx8bnVsbDtKLnZhbHVlPXJhO3JhPWMoUCxWLGZhLGhhKTtmb3IoUD0wO1AhPT1mYTsrK1ApcmFbUF09Z1tQXTtXLmNsaXBwaW5nU3RhdGU9cmE7dGhpcy5udW1JbnRlcnNlY3Rpb249Uj90aGlzLm51bVBsYW5lczowO3RoaXMubnVtUGxhbmVzKz1TfX19ZnVuY3Rpb24gYmQoYSl7dmFyIGM9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT1jW2VdKXJldHVybiBjW2VdO3N3aXRjaChlKXtjYXNlICJXRUJHTF9kZXB0aF90ZXh0dXJlIjp2YXIgZz1hLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxhLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7CmJyZWFrO2Nhc2UgIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6Zz1hLmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6Zz1hLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fAphLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6Zz1hLmdldEV4dGVuc2lvbihlKX1udWxsPT09ZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK2UrIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKTtyZXR1cm4gY1tlXT1nfX19ZnVuY3Rpb24gdGQoYSxjLGUpe2Z1bmN0aW9uIGcoRSl7dmFyIEY9RS50YXJnZXQ7RT12LmdldChGKTtudWxsIT09RS5pbmRleCYmYy5yZW1vdmUoRS5pbmRleCk7Zm9yKHZhciBKIGluIEUuYXR0cmlidXRlcyljLnJlbW92ZShFLmF0dHJpYnV0ZXNbSl0pO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7di5kZWxldGUoRik7aWYoSj16LmdldChFKSljLnJlbW92ZShKKSx6LmRlbGV0ZShFKTtlLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gcihFKXt2YXIgRj1bXSxKPUUuaW5kZXgsUD1FLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PQpKKXt2YXIgUj1KLmFycmF5O0o9Si52ZXJzaW9uO1A9MDtmb3IodmFyIFM9Ui5sZW5ndGg7UDxTO1ArPTMpe3ZhciBWPVJbUCswXSxXPVJbUCsxXSxoYT1SW1ArMl07Ri5wdXNoKFYsVyxXLGhhLGhhLFYpfX1lbHNlIGZvcihSPVAuYXJyYXksSj1QLnZlcnNpb24sUD0wLFM9Ui5sZW5ndGgvMy0xO1A8UztQKz0zKVY9UCswLFc9UCsxLGhhPVArMixGLnB1c2goVixXLFcsaGEsaGEsVik7Rj1uZXcgKDY1NTM1PEVhKEYpP2VhOlopKEYsMSk7Ri52ZXJzaW9uPUo7Yy51cGRhdGUoRiwzNDk2Myk7KFI9ei5nZXQoRSkpJiZjLnJlbW92ZShSKTt6LnNldChFLEYpfXZhciB2PW5ldyBXZWFrTWFwLHo9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEYpe3ZhciBKPXYuZ2V0KEYpO2lmKEopcmV0dXJuIEo7Ri5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtGLmlzQnVmZmVyR2VvbWV0cnk/Sj1GOkYuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUYuX2J1ZmZlckdlb21ldHJ5JiYoRi5fYnVmZmVyR2VvbWV0cnk9CihuZXcgdmEpLnNldEZyb21PYmplY3QoRSkpLEo9Ri5fYnVmZmVyR2VvbWV0cnkpO3Yuc2V0KEYsSik7ZS5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBKfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEY9RS5pbmRleCxKPUUuYXR0cmlidXRlcztudWxsIT09RiYmYy51cGRhdGUoRiwzNDk2Myk7Zm9yKHZhciBQIGluIEopYy51cGRhdGUoSltQXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoUCBpbiBFKXtGPUVbUF07Sj0wO2Zvcih2YXIgUj1GLmxlbmd0aDtKPFI7SisrKWMudXBkYXRlKEZbSl0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBGPXouZ2V0KEUpO2lmKEYpe3ZhciBKPUUuaW5kZXg7bnVsbCE9PUomJkYudmVyc2lvbjxKLnZlcnNpb24mJnIoRSl9ZWxzZSByKEUpO3JldHVybiB6LmdldChFKX19fWZ1bmN0aW9uIHRnKGEsYyxlLGcpe3ZhciByLHYsejt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7cj1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt2PUUudHlwZTt6PUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEYpe2EuZHJhd0VsZW1lbnRzKHIsRix2LEUqeik7ZS51cGRhdGUoRixyKX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxGLEope2lmKGcuaXNXZWJHTDIpe3ZhciBQPWE7dmFyIFI9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihQPWMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUj0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1QKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufVBbUl0ocixKLHYsRip6LEUubWF4SW5zdGFuY2VkQ291bnQpO2UudXBkYXRlKEoscixFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIFNrKCl7dmFyIGE9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmEscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXthLmZyYW1lKys7YS5jYWxscz0wO2EudHJpYW5nbGVzPTA7YS5wb2ludHM9MDthLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7Zz1nfHwxO2EuY2FsbHMrKztzd2l0Y2goZSl7Y2FzZSA0OmEudHJpYW5nbGVzKz1jLzMqZzticmVhaztjYXNlIDU6Y2FzZSA2OmEudHJpYW5nbGVzKz1nKihjLTIpO2JyZWFrO2Nhc2UgMTphLmxpbmVzKz1jLzIqZzticmVhaztjYXNlIDM6YS5saW5lcys9ZyooYy0xKTticmVhaztjYXNlIDI6YS5saW5lcys9ZypjO2JyZWFrO2Nhc2UgMDphLnBvaW50cys9ZypjO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLAplKX19fX1mdW5jdGlvbiBUayhhLGMpe3JldHVybiBNYXRoLmFicyhjWzFdKS1NYXRoLmFicyhhWzFdKX1mdW5jdGlvbiBVayhhKXt2YXIgYz17fSxlPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihnLHIsdix6KXt2YXIgRT1nLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxGPUUubGVuZ3RoO2c9Y1tyLmlkXTtpZih2b2lkIDA9PT1nKXtnPVtdO2Zvcih2YXIgSj0wO0o8RjtKKyspZ1tKXT1bSiwwXTtjW3IuaWRdPWd9dmFyIFA9di5tb3JwaFRhcmdldHMmJnIubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3Y9di5tb3JwaE5vcm1hbHMmJnIubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoSj0wO0o8RjtKKyspe3ZhciBSPWdbSl07MCE9PVJbMV0mJihQJiZyLnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0opLHYmJnIucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSikpfWZvcihKPTA7SjxGO0orKylSPWdbSl0sUlswXT1KLFJbMV09RVtKXTtnLnNvcnQoVGspOwpmb3IoSj0wOzg+SjtKKyspe2lmKFI9Z1tKXSlpZihFPVJbMF0sRj1SWzFdKXtQJiZyLmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0osUFtFXSk7diYmci5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitKLHZbRV0pO2VbSl09Rjtjb250aW51ZX1lW0pdPTB9ei5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGEsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsZSl9fX1mdW5jdGlvbiBWayhhLGMpe3ZhciBlPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24oZyl7dmFyIHI9Yy5yZW5kZXIuZnJhbWUsdj1nLmdlb21ldHJ5LHo9YS5nZXQoZyx2KTtlW3ouaWRdIT09ciYmKHYuaXNHZW9tZXRyeSYmei51cGRhdGVGcm9tT2JqZWN0KGcpLGEudXBkYXRlKHopLGVbei5pZF09cik7cmV0dXJuIHp9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPXt9fX19ZnVuY3Rpb24gY2QoYSxjLGUsZyxyLHYseixFLEYsSil7YT12b2lkIDAhPT1hP2E6W107bC5jYWxsKHRoaXMsYSx2b2lkIDAhPT1jP2M6MzAxLGUsZyxyLHYsCnZvaWQgMCE9PXo/ejoxMDIyLEUsRixKKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIHJlKGEsYyxlLGcpe2wuY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplLGRlcHRoOmd9O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gc2UoYSxjLGUsZyl7bC5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmUsZGVwdGg6Z307dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiB0ZShhLGMsZSl7dmFyIGc9YVswXTtpZigwPj1nfHwwPGcpcmV0dXJuIGE7dmFyIHI9YyplLHY9Y2pbcl07dm9pZCAwPT09diYmKHY9bmV3IEZsb2F0MzJBcnJheShyKSxjaltyXT12KTtpZigwIT09Yylmb3IoZy50b0FycmF5KHYsCjApLGc9MSxyPTA7ZyE9PWM7KytnKXIrPWUsYVtnXS50b0FycmF5KHYscik7cmV0dXJuIHZ9ZnVuY3Rpb24gc2MoYSxjKXtpZihhLmxlbmd0aCE9PWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKylpZihhW2VdIT09Y1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtYyhhLGMpe2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKylhW2VdPWNbZV19ZnVuY3Rpb24gZGooYSxjKXt2YXIgZT1laltjXTt2b2lkIDA9PT1lJiYoZT1uZXcgSW50MzJBcnJheShjKSxlaltjXT1lKTtmb3IodmFyIGc9MDtnIT09YzsrK2cpZVtnXT1hLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gZX1mdW5jdGlvbiBXayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7ZVswXSE9PWMmJihhLnVuaWZvcm0xZih0aGlzLmFkZHIsYyksZVswXT1jKX1mdW5jdGlvbiBYayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09CmMueSlhLnVuaWZvcm0yZih0aGlzLmFkZHIsYy54LGMueSksZVswXT1jLngsZVsxXT1jLnl9ZWxzZSBzYyhlLGMpfHwoYS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBZayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09Yy55fHxlWzJdIT09Yy56KWEudW5pZm9ybTNmKHRoaXMuYWRkcixjLngsYy55LGMueiksZVswXT1jLngsZVsxXT1jLnksZVsyXT1jLnp9ZWxzZSBpZih2b2lkIDAhPT1jLnIpe2lmKGVbMF0hPT1jLnJ8fGVbMV0hPT1jLmd8fGVbMl0hPT1jLmIpYS51bmlmb3JtM2YodGhpcy5hZGRyLGMucixjLmcsYy5iKSxlWzBdPWMucixlWzFdPWMuZyxlWzJdPWMuYn1lbHNlIHNjKGUsYyl8fChhLnVuaWZvcm0zZnYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIFprKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1jLngpe2lmKGVbMF0hPT1jLnh8fGVbMV0hPT1jLnl8fAplWzJdIT09Yy56fHxlWzNdIT09Yy53KWEudW5pZm9ybTRmKHRoaXMuYWRkcixjLngsYy55LGMueixjLncpLGVbMF09Yy54LGVbMV09Yy55LGVbMl09Yy56LGVbM109Yy53fWVsc2Ugc2MoZSxjKXx8KGEudW5pZm9ybTRmdih0aGlzLmFkZHIsYyksbWMoZSxjKSl9ZnVuY3Rpb24gJGsoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChmai5zZXQoZyksYS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxmaiksbWMoZSxnKSl9ZnVuY3Rpb24gYWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChnai5zZXQoZyksYS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxnaiksbWMoZSxnKSl9CmZ1bmN0aW9uIGJsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz9zYyhlLGMpfHwoYS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxjKSxtYyhlLGMpKTpzYyhlLGcpfHwoaGouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsaGopLG1jKGUsZykpfWZ1bmN0aW9uIGNsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7Z1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNhZmVTZXRUZXh0dXJlMkQoY3x8aWoscil9ZnVuY3Rpb24gZGwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtnWzBdIT09ciYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxnWzBdPXIpO2Uuc2V0VGV4dHVyZTJEQXJyYXkoY3x8ZWwscil9ZnVuY3Rpb24gZmwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKZ1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNldFRleHR1cmUzRChjfHxnbCxyKX1mdW5jdGlvbiBobChhLGMsZSl7dmFyIGc9dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2dbMF0hPT1yJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGdbMF09cik7ZS5zYWZlU2V0VGV4dHVyZUN1YmUoY3x8amoscil9ZnVuY3Rpb24gaWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2VbMF0hPT1jJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLGMpLGVbMF09Yyl9ZnVuY3Rpb24gamwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO3NjKGUsYyl8fChhLnVuaWZvcm0yaXYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIGtsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtzYyhlLGMpfHwoYS51bmlmb3JtM2l2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBsbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7c2MoZSxjKXx8KGEudW5pZm9ybTRpdih0aGlzLmFkZHIsCmMpLG1jKGUsYykpfWZ1bmN0aW9uIG1sKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIFdrO2Nhc2UgMzU2NjQ6cmV0dXJuIFhrO2Nhc2UgMzU2NjU6cmV0dXJuIFlrO2Nhc2UgMzU2NjY6cmV0dXJuIFprO2Nhc2UgMzU2NzQ6cmV0dXJuICRrO2Nhc2UgMzU2NzU6cmV0dXJuIGFsO2Nhc2UgMzU2NzY6cmV0dXJuIGJsO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4gY2w7Y2FzZSAzNTY3OTpyZXR1cm4gZmw7Y2FzZSAzNTY4MDpyZXR1cm4gaGw7Y2FzZSAzNjI4OTpyZXR1cm4gZGw7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGlsO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gamw7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBrbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIGxsfX1mdW5jdGlvbiBubChhLGMpe2EudW5pZm9ybTFmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gb2woYSxjKXthLnVuaWZvcm0xaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHBsKGEsCmMpe2EudW5pZm9ybTJpdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gcWwoYSxjKXthLnVuaWZvcm0zaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHJsKGEsYyl7YS51bmlmb3JtNGl2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBzbChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMik7YS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB0bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMyk7YS51bmlmb3JtM2Z2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB1bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtNGZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB2bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB3bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsOSk7YS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB4bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMTYpO2EudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGMpfWZ1bmN0aW9uIHlsKGEsYyxlKXt2YXIgZz1jLmxlbmd0aCxyPWRqKGUsZyk7YS51bmlmb3JtMWl2KHRoaXMuYWRkcixyKTtmb3IoYT0wO2EhPT1nOysrYSllLnNhZmVTZXRUZXh0dXJlMkQoY1thXXx8aWosclthXSl9ZnVuY3Rpb24gemwoYSxjLGUpe3ZhciBnPWMubGVuZ3RoLHI9ZGooZSxnKTthLnVuaWZvcm0xaXYodGhpcy5hZGRyLHIpO2ZvcihhPTA7YSE9PWc7KythKWUuc2FmZVNldFRleHR1cmVDdWJlKGNbYV18fGpqLHJbYV0pfWZ1bmN0aW9uIEFsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIG5sO2Nhc2UgMzU2NjQ6cmV0dXJuIHNsO2Nhc2UgMzU2NjU6cmV0dXJuIHRsO2Nhc2UgMzU2NjY6cmV0dXJuIHVsO2Nhc2UgMzU2NzQ6cmV0dXJuIHZsO2Nhc2UgMzU2NzU6cmV0dXJuIHdsO2Nhc2UgMzU2NzY6cmV0dXJuIHhsO2Nhc2UgMzU2Nzg6cmV0dXJuIHlsO2Nhc2UgMzU2ODA6cmV0dXJuIHpsO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBvbDtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIHBsOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIHFsO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gcmx9fWZ1bmN0aW9uIEJsKGEsYyxlKXt0aGlzLmlkPWE7dGhpcy5hZGRyPWU7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPW1sKGMudHlwZSl9ZnVuY3Rpb24ga2ooYSxjLGUpe3RoaXMuaWQ9YTt0aGlzLmFkZHI9ZTt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1jLnNpemU7dGhpcy5zZXRWYWx1ZT1BbChjLnR5cGUpfWZ1bmN0aW9uIGxqKGEpe3RoaXMuaWQ9YTt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiBtaihhLGMpe2Euc2VxLnB1c2goYyk7YS5tYXBbYy5pZF09Y31mdW5jdGlvbiBDbChhLGMsZSl7dmFyIGc9YS5uYW1lLHI9Zy5sZW5ndGg7Zm9yKExoLmxhc3RJbmRleD0wOzspe3ZhciB2PUxoLmV4ZWMoZyksej1MaC5sYXN0SW5kZXgsRT12WzFdLEY9dlszXTsiXSI9PT12WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09Rnx8IlsiPT09RiYmeisyPT09cil7bWooZSwKdm9pZCAwPT09Rj9uZXcgQmwoRSxhLGMpOm5ldyBraihFLGEsYykpO2JyZWFrfWVsc2Ugdj1lLm1hcFtFXSx2b2lkIDA9PT12JiYodj1uZXcgbGooRSksbWooZSx2KSksZT12fX1mdW5jdGlvbiB1ZChhLGMpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgZT1hLmdldFByb2dyYW1QYXJhbWV0ZXIoYywzNTcxOCksZz0wO2c8ZTsrK2cpe3ZhciByPWEuZ2V0QWN0aXZlVW5pZm9ybShjLGcpO0NsKHIsYS5nZXRVbmlmb3JtTG9jYXRpb24oYyxyLm5hbWUpLHRoaXMpfX1mdW5jdGlvbiBuaihhLGMsZSl7Yz1hLmNyZWF0ZVNoYWRlcihjKTthLnNoYWRlclNvdXJjZShjLGUpO2EuY29tcGlsZVNoYWRlcihjKTtyZXR1cm4gY31mdW5jdGlvbiBEbChhKXthPWEuc3BsaXQoIlxuIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXT1jKzErIjogIithW2NdO3JldHVybiBhLmpvaW4oIlxuIil9ZnVuY3Rpb24gb2ooYSl7c3dpdGNoKGEpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2EpO319ZnVuY3Rpb24gcGooYSxjLGUpe3ZhciBnPWEuZ2V0U2hhZGVyUGFyYW1ldGVyKGMsMzU3MTMpLHI9YS5nZXRTaGFkZXJJbmZvTG9nKGMpLnRyaW0oKTtyZXR1cm4gZyYmIiI9PT1yPyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmUrIlxuIityK0RsKGEuZ2V0U2hhZGVyU291cmNlKGMpKX1mdW5jdGlvbiB1ZyhhLGMpe2M9b2ooYyk7cmV0dXJuInZlYzQgIithKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2NbMF0rIlRvTGluZWFyIitjWzFdKyI7IH0ifWZ1bmN0aW9uIEVsKGEsYyl7Yz1vaihjKTtyZXR1cm4idmVjNCAiK2ErIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitjWzBdK2NbMV0rIjsgfSJ9ZnVuY3Rpb24gRmwoYSxjKXtzd2l0Y2goYyl7Y2FzZSAxOmM9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmM9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6Yz0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmM9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmM9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2MpO31yZXR1cm4idmVjMyAiK2ErIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrYysiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBHbChhLGMsZSl7YT1hfHx7fTtyZXR1cm5bYS5kZXJpdmF0aXZlc3x8Yy5lbnZNYXBDdWJlVVZ8fGMuYnVtcE1hcHx8Yy50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGMuY2xlYXJjb2F0Tm9ybWFsTWFwfHxjLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGEuZnJhZ0RlcHRofHxjLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZlLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYS5kcmF3QnVmZmVycyYmZS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYS5zaGFkZXJUZXh0dXJlTE9EfHxjLmVudk1hcCkmJmUuZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcih1Zikuam9pbigiXG4iKX0KZnVuY3Rpb24gSGwoYSl7dmFyIGM9W10sZTtmb3IoZSBpbiBhKXt2YXIgZz1hW2VdOyExIT09ZyYmYy5wdXNoKCIjZGVmaW5lICIrZSsiICIrZyl9cmV0dXJuIGMuam9pbigiXG4iKX1mdW5jdGlvbiBJbChhLGMpe2Zvcih2YXIgZT17fSxnPWEuZ2V0UHJvZ3JhbVBhcmFtZXRlcihjLDM1NzIxKSxyPTA7cjxnO3IrKyl7dmFyIHY9YS5nZXRBY3RpdmVBdHRyaWIoYyxyKS5uYW1lO2Vbdl09YS5nZXRBdHRyaWJMb2NhdGlvbihjLHYpfXJldHVybiBlfWZ1bmN0aW9uIHVmKGEpe3JldHVybiIiIT09YX1mdW5jdGlvbiBxaihhLGMpe3JldHVybiBhLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csYy5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGMubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxjLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csYy5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmMubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csYy5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxjLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csYy5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gcmooYSxjKXtyZXR1cm4gYS5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcy1jLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIE1oKGEpe3JldHVybiBhLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihjLGUpe2M9cmJbZV07aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2UrIlx4M2UiKTtyZXR1cm4gTWgoYyl9KX0KZnVuY3Rpb24gc2ooYSl7cmV0dXJuIGEucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGMsZSxnLHIpe2M9IiI7Zm9yKGU9cGFyc2VJbnQoZSk7ZTxwYXJzZUludChnKTtlKyspYys9ci5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitlKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxlKTtyZXR1cm4gY30pfWZ1bmN0aW9uIEpsKGEsYyxlLGcscix2LHope3ZhciBFPWEuZ2V0Q29udGV4dCgpLEY9Zy5kZWZpbmVzLEo9ci52ZXJ0ZXhTaGFkZXIsUD1yLmZyYWdtZW50U2hhZGVyLFI9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09di5zaGFkb3dNYXBUeXBlP1I9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXYuc2hhZG93TWFwVHlwZT9SPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXYuc2hhZG93TWFwVHlwZSYmKFI9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgUz0iRU5WTUFQX1RZUEVfQ1VCRSIsVj0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsVz0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih2LmVudk1hcCl7c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlM9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlM9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlM9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlM9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0OlY9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChnLmNvbWJpbmUpe2Nhc2UgMDpXPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpXPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6Vz0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBoYT0KMDxhLmdhbW1hRmFjdG9yP2EuZ2FtbWFGYWN0b3I6MSxmYT16LmlzV2ViR0wyPyIiOkdsKGcuZXh0ZW5zaW9ucyx2LGMpLHJhPUhsKEYpLHBhPUUuY3JlYXRlUHJvZ3JhbSgpO2cuaXNSYXdTaGFkZXJNYXRlcmlhbD8oRj1bcmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPEYubGVuZ3RoJiYoRis9IlxuIiksYz1bZmEscmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPGMubGVuZ3RoJiYoYys9IlxuIikpOihGPVsicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT12LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdi5tYXhCb25lcyx2LnVzZUZvZyYmCnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrVjoiIix2LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHYuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix2LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdi5kaXNwbGFjZW1lbnRNYXAmJnYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHYudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHYubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHYubW9ycGhOb3JtYWxzJiYhMT09PXYuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHYuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitSOiIiLHYuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKHouaXNXZWJHTDJ8fGMuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHVmKS5qb2luKCJcbiIpLGM9W2ZhLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3YucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXYucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdi5hbHBoYVRlc3QrKHYuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsdi51c2VGb2cmJnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrUzoiIix2LmVudk1hcD8iI2RlZmluZSAiK1Y6IiIsdi5lbnZNYXA/IiNkZWZpbmUgIitXOiIiLHYubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix2LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHYuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix2LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdi52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix2LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHYuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1I6IiIsdi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooei5pc1dlYkdMMnx8Yy5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChnLmV4dGVuc2lvbnMmJmcuZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx2LmVudk1hcCkmJih6LmlzV2ViR0wyfHxjLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09di50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT12LnRvbmVNYXBwaW5nP3JiLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXYudG9uZU1hcHBpbmc/RmwoInRvbmVNYXBwaW5nIix2LnRvbmVNYXBwaW5nKToiIix2LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHYub3V0cHV0RW5jb2Rpbmd8fHYubWFwRW5jb2Rpbmd8fHYubWF0Y2FwRW5jb2Rpbmd8fHYuZW52TWFwRW5jb2Rpbmd8fAp2LmVtaXNzaXZlTWFwRW5jb2Rpbmc/cmIuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdi5tYXBFbmNvZGluZz91ZygibWFwVGV4ZWxUb0xpbmVhciIsdi5tYXBFbmNvZGluZyk6IiIsdi5tYXRjYXBFbmNvZGluZz91ZygibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdi5tYXRjYXBFbmNvZGluZyk6IiIsdi5lbnZNYXBFbmNvZGluZz91ZygiZW52TWFwVGV4ZWxUb0xpbmVhciIsdi5lbnZNYXBFbmNvZGluZyk6IiIsdi5lbWlzc2l2ZU1hcEVuY29kaW5nP3VnKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHYuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdi5vdXRwdXRFbmNvZGluZz9FbCgibGluZWFyVG9PdXRwdXRUZXhlbCIsdi5vdXRwdXRFbmNvZGluZyk6IiIsdi5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2cuZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcih1Zikuam9pbigiXG4iKSk7Sj1NaChKKTtKPXFqKEosdik7Sj1yaihKLHYpO1A9TWgoUCk7UD1xaihQLAp2KTtQPXJqKFAsdik7Sj1zaihKKTtQPXNqKFApO3ouaXNXZWJHTDImJiFnLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJih6PSExLFI9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLGcuaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUoubWF0Y2goUikmJm51bGwhPT1QLm1hdGNoKFIpJiYoej0hMCxKPUoucmVwbGFjZShSLCIiKSxQPVAucmVwbGFjZShSLCIiKSksRj0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0YsYz1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLHo/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLHo/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrYyk7UD1jK1A7Sj1uaihFLDM1NjMzLEYrSik7UD1uaihFLDM1NjMyLFApO0UuYXR0YWNoU2hhZGVyKHBhLEopO0UuYXR0YWNoU2hhZGVyKHBhLFApO3ZvaWQgMCE9PWcuaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihwYSwwLGcuaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT12Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocGEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHBhKTtpZihhLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXthPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocGEpLnRyaW0oKTt2PUUuZ2V0U2hhZGVySW5mb0xvZyhKKS50cmltKCk7ej1FLmdldFNoYWRlckluZm9Mb2coUCkudHJpbSgpO1M9Uj0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNCkpUj0hMSxWPXBqKEUsSiwidmVydGV4IiksVz1waihFLFAsImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixhLFYsVyk7ZWxzZSBpZigiIiE9PWEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGEpO2Vsc2UgaWYoIiI9PT12fHwiIj09PXopUz0hMTtTJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UixtYXRlcmlhbDpnLHByb2dyYW1Mb2c6YSx2ZXJ0ZXhTaGFkZXI6e2xvZzp2LHByZWZpeDpGfSxmcmFnbWVudFNoYWRlcjp7bG9nOnoscHJlZml4OmN9fSl9RS5kZWxldGVTaGFkZXIoSik7RS5kZWxldGVTaGFkZXIoUCk7dmFyIHFhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1xYSYmKHFhPW5ldyB1ZChFLHBhKSk7cmV0dXJuIHFhfTt2YXIgdWE7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dWEmJih1YT1JbChFLHBhKSk7cmV0dXJuIHVhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHBhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9ci5uYW1lO3RoaXMuaWQ9S2wrKzt0aGlzLmNvZGU9ZTt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1wYTt0aGlzLnZlcnRleFNoYWRlcj1KO3RoaXMuZnJhZ21lbnRTaGFkZXI9UDtyZXR1cm4gdGhpc31mdW5jdGlvbiBMbChhLGMsZSl7ZnVuY3Rpb24gZyhGKXtGPUYuc2tlbGV0b24uYm9uZXM7aWYoZS5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBKPU1hdGgubWluKE1hdGguZmxvb3IoKGUubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEYubGVuZ3RoKTtyZXR1cm4gSjxGLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitGLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0orIi4iKSwwKTpKfWZ1bmN0aW9uIHIoRixKKXtpZihGKUYuaXNUZXh0dXJlP1A9Ri5lbmNvZGluZzpGLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksUD1GLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIFA9M0UzOzNFMz09PVAmJkomJihQPTMwMDcpO3JldHVybiBQfXZhciB2PVtdLHo9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihGLEosUCxSLFMsVixXKXt2YXIgaGE9eltGLnR5cGVdLGZhPVcuaXNTa2lubmVkTWVzaD9nKFcpOjAscmE9ZS5wcmVjaXNpb247bnVsbCE9PUYucHJlY2lzaW9uJiYocmE9ZS5nZXRNYXhQcmVjaXNpb24oRi5wcmVjaXNpb24pLHJhIT09Ri5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixGLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHJhLCJpbnN0ZWFkLiIpKTt2YXIgcGE9YS5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6aGEscHJlY2lzaW9uOnJhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZS52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzpyKHBhP3BhLnRleHR1cmU6bnVsbCxhLmdhbW1hT3V0cHV0KSxtYXA6ISFGLm1hcCxtYXBFbmNvZGluZzpyKEYubWFwLGEuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRi5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6cihGLm1hdGNhcCwKYS5nYW1tYUlucHV0KSxlbnZNYXA6ISFGLmVudk1hcCxlbnZNYXBNb2RlOkYuZW52TWFwJiZGLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnIoRi5lbnZNYXAsYS5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFGLmVudk1hcCYmKDMwNj09PUYuZW52TWFwLm1hcHBpbmd8fDMwNz09PUYuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRi5saWdodE1hcCxhb01hcDohIUYuYW9NYXAsZW1pc3NpdmVNYXA6ISFGLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6cihGLmVtaXNzaXZlTWFwLGEuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUYuYnVtcE1hcCxub3JtYWxNYXA6ISFGLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ri5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ri5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUYuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUYuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFGLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFGLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUYuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFGLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRi5ncmFkaWVudE1hcCxzaGVlbjohIUYuc2hlZW4sY29tYmluZTpGLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ri5ub3JtYWxNYXAmJkYudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkYudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUYubWFwfHwhIUYuYnVtcE1hcHx8ISFGLm5vcm1hbE1hcHx8ISFGLnNwZWN1bGFyTWFwfHwhIUYuYWxwaGFNYXB8fCEhRi5lbWlzc2l2ZU1hcHx8ISFGLnJvdWdobmVzc01hcHx8ISFGLm1ldGFsbmVzc01hcHx8ISFGLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFSLHVzZUZvZzpGLmZvZyxmb2dFeHAyOlImJlIuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkYuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkYuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpGLnNraW5uaW5nJiYwPGZhLG1heEJvbmVzOmZhLHVzZVZlcnRleFRleHR1cmU6ZS5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpGLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ri5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmEubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczphLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6Si5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6Si5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpKLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkoucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6Si5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6Si5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6Si5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpKLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpTLG51bUNsaXBJbnRlcnNlY3Rpb246VixkaXRoZXJpbmc6Ri5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDphLnNoYWRvd01hcC5lbmFibGVkJiZXLnJlY2VpdmVTaGFkb3cmJjA8UC5sZW5ndGgsc2hhZG93TWFwVHlwZTphLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkYudG9uZU1hcHBlZD9hLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6YS5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ri5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkYuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1GLnNpZGUsZmxpcFNpZGVkOjE9PT1GLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUYuZGVwdGhQYWNraW5nP0YuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihGLEope3ZhciBQPVtdO0ouc2hhZGVySUQ/UC5wdXNoKEouc2hhZGVySUQpOihQLnB1c2goRi5mcmFnbWVudFNoYWRlciksClAucHVzaChGLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUYuZGVmaW5lcylmb3IodmFyIFIgaW4gRi5kZWZpbmVzKVAucHVzaChSKSxQLnB1c2goRi5kZWZpbmVzW1JdKTtmb3IoUj0wO1I8RS5sZW5ndGg7UisrKVAucHVzaChKW0VbUl1dKTtQLnB1c2goRi5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7UC5wdXNoKGEuZ2FtbWFPdXRwdXQpO1AucHVzaChhLmdhbW1hRmFjdG9yKTtyZXR1cm4gUC5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRixKLFAsUil7Zm9yKHZhciBTLFY9MCxXPXYubGVuZ3RoO1Y8VztWKyspe3ZhciBoYT12W1ZdO2lmKGhhLmNvZGU9PT1SKXtTPWhhOysrUy51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVMmJihTPW5ldyBKbChhLGMsUixGLEosUCxlKSx2LnB1c2goUykpO3JldHVybiBTfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEYpezA9PT0tLUYudXNlZFRpbWVzJiYodlt2LmluZGV4T2YoRildPXZbdi5sZW5ndGgtMV0sCnYucG9wKCksRi5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXZ9ZnVuY3Rpb24gTWwoKXt2YXIgYT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBlPWEuZ2V0KGMpO3ZvaWQgMD09PWUmJihlPXt9LGEuc2V0KGMsZSkpO3JldHVybiBlfSxyZW1vdmU6ZnVuY3Rpb24oYyl7YS5kZWxldGUoYyl9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7YS5nZXQoYylbZV09Z30sZGlzcG9zZTpmdW5jdGlvbigpe2E9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBObChhLGMpe3JldHVybiBhLmdyb3VwT3JkZXIhPT1jLmdyb3VwT3JkZXI/YS5ncm91cE9yZGVyLWMuZ3JvdXBPcmRlcjphLnJlbmRlck9yZGVyIT09Yy5yZW5kZXJPcmRlcj9hLnJlbmRlck9yZGVyLWMucmVuZGVyT3JkZXI6YS5wcm9ncmFtIT09Yy5wcm9ncmFtP2EucHJvZ3JhbS5pZC1jLnByb2dyYW0uaWQ6YS5tYXRlcmlhbC5pZCE9PWMubWF0ZXJpYWwuaWQ/YS5tYXRlcmlhbC5pZC1jLm1hdGVyaWFsLmlkOmEueiE9PQpjLno/YS56LWMuejphLmlkLWMuaWR9ZnVuY3Rpb24gT2woYSxjKXtyZXR1cm4gYS5ncm91cE9yZGVyIT09Yy5ncm91cE9yZGVyP2EuZ3JvdXBPcmRlci1jLmdyb3VwT3JkZXI6YS5yZW5kZXJPcmRlciE9PWMucmVuZGVyT3JkZXI/YS5yZW5kZXJPcmRlci1jLnJlbmRlck9yZGVyOmEueiE9PWMuej9jLnotYS56OmEuaWQtYy5pZH1mdW5jdGlvbiB0aigpe2Z1bmN0aW9uIGEoeixFLEYsSixQLFIpe3ZhciBTPWNbZV07dm9pZCAwPT09Uz8oUz17aWQ6ei5pZCxvYmplY3Q6eixnZW9tZXRyeTpFLG1hdGVyaWFsOkYscHJvZ3JhbTpGLnByb2dyYW18fHYsZ3JvdXBPcmRlcjpKLHJlbmRlck9yZGVyOnoucmVuZGVyT3JkZXIsejpQLGdyb3VwOlJ9LGNbZV09Uyk6KFMuaWQ9ei5pZCxTLm9iamVjdD16LFMuZ2VvbWV0cnk9RSxTLm1hdGVyaWFsPUYsUy5wcm9ncmFtPUYucHJvZ3JhbXx8dixTLmdyb3VwT3JkZXI9SixTLnJlbmRlck9yZGVyPXoucmVuZGVyT3JkZXIsUy56PVAsUy5ncm91cD1SKTsKZSsrO3JldHVybiBTfXZhciBjPVtdLGU9MCxnPVtdLHI9W10sdj17aWQ6LTF9O3JldHVybntvcGFxdWU6Zyx0cmFuc3BhcmVudDpyLGluaXQ6ZnVuY3Rpb24oKXtlPTA7Zy5sZW5ndGg9MDtyLmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS5wdXNoKHopfSx1bnNoaWZ0OmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS51bnNoaWZ0KHopfSxzb3J0OmZ1bmN0aW9uKCl7MTxnLmxlbmd0aCYmZy5zb3J0KE5sKTsxPHIubGVuZ3RoJiZyLnNvcnQoT2wpfX19ZnVuY3Rpb24gUGwoKXtmdW5jdGlvbiBhKGUpe2U9ZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7dmFyIHI9Yy5nZXQoZSk7aWYodm9pZCAwPT09CnIpe3ZhciB2PW5ldyB0ajtjLnNldChlLG5ldyBXZWFrTWFwKTtjLmdldChlKS5zZXQoZyx2KTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpfWVsc2Ugdj1yLmdldChnKSx2b2lkIDA9PT12JiYodj1uZXcgdGosci5zZXQoZyx2KSk7cmV0dXJuIHZ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gUWwoKXt2YXIgYT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWFbYy5pZF0pcmV0dXJuIGFbYy5pZF07c3dpdGNoKGMudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGU9e2RpcmVjdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGZ9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6ZT17cG9zaXRpb246bmV3IGssZGlyZWN0aW9uOm5ldyBrLGNvbG9yOm5ldyBJLGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmfTticmVhaztjYXNlICJQb2ludExpZ2h0IjplPXtwb3NpdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmU9e2RpcmVjdGlvbjpuZXcgayxza3lDb2xvcjpuZXcgSSxncm91bmRDb2xvcjpuZXcgSX07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6ZT17Y29sb3I6bmV3IEkscG9zaXRpb246bmV3IGssaGFsZldpZHRoOm5ldyBrLGhhbGZIZWlnaHQ6bmV3IGt9fXJldHVybiBhW2MuaWRdPWV9fX1mdW5jdGlvbiBSbChhLGMpe3JldHVybihjLmNhc3RTaGFkb3c/MTowKS0oYS5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gU2woKXtmb3IodmFyIGE9Cm5ldyBRbCxjPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGU9MDs5PmU7ZSsrKWMucHJvYmUucHVzaChuZXcgayk7dmFyIGc9bmV3IGsscj1uZXcgcSx2PW5ldyBxO3JldHVybntzZXR1cDpmdW5jdGlvbih6LApFLEYpe2Zvcih2YXIgSj0wLFA9MCxSPTAsUz0wOzk+UztTKyspYy5wcm9iZVtTXS5zZXQoMCwwLDApO3ZhciBWPUU9MCxXPTAsaGE9MCxmYT0wLHJhPTAscGE9MCxxYT0wO0Y9Ri5tYXRyaXhXb3JsZEludmVyc2U7ei5zb3J0KFJsKTtTPTA7Zm9yKHZhciB1YT16Lmxlbmd0aDtTPHVhO1MrKyl7dmFyIG9hPXpbU10sdGE9b2EuY29sb3IsQmE9b2EuaW50ZW5zaXR5LFRhPW9hLmRpc3RhbmNlLFVhPW9hLnNoYWRvdyYmb2Euc2hhZG93Lm1hcD9vYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihvYS5pc0FtYmllbnRMaWdodClKKz10YS5yKkJhLFArPXRhLmcqQmEsUis9dGEuYipCYTtlbHNlIGlmKG9hLmlzTGlnaHRQcm9iZSlmb3IoVWE9MDs5PlVhO1VhKyspYy5wcm9iZVtVYV0uYWRkU2NhbGVkVmVjdG9yKG9hLnNoLmNvZWZmaWNpZW50c1tVYV0sQmEpO2Vsc2UgaWYob2EuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgQ2E9YS5nZXQob2EpO0NhLmNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKG9hLmludGVuc2l0eSk7CkNhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO2cuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLnRhcmdldC5tYXRyaXhXb3JsZCk7Q2EuZGlyZWN0aW9uLnN1YihnKTtDYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEYpO2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1VYSxjLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPW9hLnNoYWRvdy5tYXRyaXgscmErKztjLmRpcmVjdGlvbmFsW0VdPUNhO0UrK31lbHNlIGlmKG9hLmlzU3BvdExpZ2h0KXtDYT1hLmdldChvYSk7Q2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRik7Q2EuY29sb3IuY29weSh0YSkubXVsdGlwbHlTY2FsYXIoQmEpOwpDYS5kaXN0YW5jZT1UYTtDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtnLnNldEZyb21NYXRyaXhQb3NpdGlvbihvYS50YXJnZXQubWF0cml4V29ybGQpO0NhLmRpcmVjdGlvbi5zdWIoZyk7Q2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihGKTtDYS5jb25lQ29zPU1hdGguY29zKG9hLmFuZ2xlKTtDYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhvYS5hbmdsZSooMS1vYS5wZW51bWJyYSkpO0NhLmRlY2F5PW9hLmRlY2F5O2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5zcG90U2hhZG93TWFwW1ddPVVhLGMuc3BvdFNoYWRvd01hdHJpeFtXXT1vYS5zaGFkb3cubWF0cml4LHFhKys7Yy5zcG90W1ddPUNhO1crK31lbHNlIGlmKG9hLmlzUmVjdEFyZWFMaWdodClDYT1hLmdldChvYSksCkNhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKEJhKSxDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKSx2LmlkZW50aXR5KCksci5jb3B5KG9hLm1hdHJpeFdvcmxkKSxyLnByZW11bHRpcGx5KEYpLHYuZXh0cmFjdFJvdGF0aW9uKHIpLENhLmhhbGZXaWR0aC5zZXQoLjUqb2Eud2lkdGgsMCwwKSxDYS5oYWxmSGVpZ2h0LnNldCgwLC41Km9hLmhlaWdodCwwKSxDYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHYpLENhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHYpLGMucmVjdEFyZWFbaGFdPUNhLGhhKys7ZWxzZSBpZihvYS5pc1BvaW50TGlnaHQpe0NhPWEuZ2V0KG9hKTtDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO0NhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKTtDYS5jb2xvci5jb3B5KG9hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihvYS5pbnRlbnNpdHkpOwpDYS5kaXN0YW5jZT1vYS5kaXN0YW5jZTtDYS5kZWNheT1vYS5kZWNheTtpZihDYS5zaGFkb3c9b2EuY2FzdFNoYWRvdylCYT1vYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLENhLnNoYWRvd0NhbWVyYU5lYXI9QmEuY2FtZXJhLm5lYXIsQ2Euc2hhZG93Q2FtZXJhRmFyPUJhLmNhbWVyYS5mYXIsYy5wb2ludFNoYWRvd01hcFtWXT1VYSxjLnBvaW50U2hhZG93TWF0cml4W1ZdPW9hLnNoYWRvdy5tYXRyaXgscGErKztjLnBvaW50W1ZdPUNhO1YrK31lbHNlIG9hLmlzSGVtaXNwaGVyZUxpZ2h0JiYoQ2E9YS5nZXQob2EpLENhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRiksQ2EuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLENhLnNreUNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKEJhKSwKQ2EuZ3JvdW5kQ29sb3IuY29weShvYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQmEpLGMuaGVtaVtmYV09Q2EsZmErKyl9Yy5hbWJpZW50WzBdPUo7Yy5hbWJpZW50WzFdPVA7Yy5hbWJpZW50WzJdPVI7ej1jLmhhc2g7aWYoei5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fHoucG9pbnRMZW5ndGghPT1WfHx6LnNwb3RMZW5ndGghPT1XfHx6LnJlY3RBcmVhTGVuZ3RoIT09aGF8fHouaGVtaUxlbmd0aCE9PWZhfHx6Lm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXJhfHx6Lm51bVBvaW50U2hhZG93cyE9PXBhfHx6Lm51bVNwb3RTaGFkb3dzIT09cWEpYy5kaXJlY3Rpb25hbC5sZW5ndGg9RSxjLnNwb3QubGVuZ3RoPVcsYy5yZWN0QXJlYS5sZW5ndGg9aGEsYy5wb2ludC5sZW5ndGg9VixjLmhlbWkubGVuZ3RoPWZhLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXJhLGMucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hcC5sZW5ndGg9cWEsYy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnJhLGMucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cWEsei5kaXJlY3Rpb25hbExlbmd0aD1FLHoucG9pbnRMZW5ndGg9Vix6LnNwb3RMZW5ndGg9Vyx6LnJlY3RBcmVhTGVuZ3RoPWhhLHouaGVtaUxlbmd0aD1mYSx6Lm51bURpcmVjdGlvbmFsU2hhZG93cz1yYSx6Lm51bVBvaW50U2hhZG93cz1wYSx6Lm51bVNwb3RTaGFkb3dzPXFhLGMudmVyc2lvbj1UbCsrfSxzdGF0ZTpjfX1mdW5jdGlvbiB1aigpe3ZhciBhPW5ldyBTbCxjPVtdLGU9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtjLmxlbmd0aD0wO2UubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTpjLHNoYWRvd3NBcnJheTplLGxpZ2h0czphfSxzZXR1cExpZ2h0czpmdW5jdGlvbihnKXthLnNldHVwKGMsZSxnKX0scHVzaExpZ2h0OmZ1bmN0aW9uKGcpe2MucHVzaChnKX0scHVzaFNoYWRvdzpmdW5jdGlvbihnKXtlLnB1c2goZyl9fX1mdW5jdGlvbiBVbCgpe2Z1bmN0aW9uIGEoZSl7ZT0KZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7aWYoITE9PT1jLmhhcyhlKSl7dmFyIHI9bmV3IHVqO2Muc2V0KGUsbmV3IFdlYWtNYXApO2MuZ2V0KGUpLnNldChnLHIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSl9ZWxzZSExPT09Yy5nZXQoZSkuaGFzKGcpPyhyPW5ldyB1aixjLmdldChlKS5zZXQoZyxyKSk6cj1jLmdldChlKS5nZXQoZyk7cmV0dXJuIHJ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gdmQoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHdkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBrO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHZqKGEsYyxlKXtmdW5jdGlvbiBnKHRhLEJhKXt2YXIgVGE9Yy51cGRhdGUocmEpO1cudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnRhLm1hcC50ZXh0dXJlO1cudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT10YS5tYXBTaXplO1cudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXBQYXNzKTthLmNsZWFyKCk7YS5yZW5kZXJCdWZmZXJEaXJlY3QoQmEsbnVsbCxUYSxXLHJhLG51bGwpO2hhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXRhLm1hcFBhc3MudGV4dHVyZTtoYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXRhLm1hcFNpemU7aGEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXApO2EuY2xlYXIoKTthLnJlbmRlckJ1ZmZlckRpcmVjdChCYSxudWxsLFRhLGhhLHJhLG51bGwpfWZ1bmN0aW9uIHIodGEsQmEsVGEsVWEsQ2EsSGEpe3ZhciBEYT10YS5nZW9tZXRyeTt2YXIgTWE9UDt2YXIgZGI9dGEuY3VzdG9tRGVwdGhNYXRlcmlhbDtUYS5pc1BvaW50TGlnaHQmJihNYT1SLGRiPXRhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpkYj9NYT1kYjooZGI9ITEsQmEubW9ycGhUYXJnZXRzJiYoRGEmJkRhLmlzQnVmZmVyR2VvbWV0cnk/ZGI9RGEubW9ycGhBdHRyaWJ1dGVzJiZEYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RGEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpEYSYmRGEuaXNHZW9tZXRyeSYmKGRiPURhLm1vcnBoVGFyZ2V0cyYmMDxEYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdGEuaXNTa2lubmVkTWVzaCYmITE9PT1CYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix0YSksdGE9dGEuaXNTa2lubmVkTWVzaCYmQmEuc2tpbm5pbmcsRGE9MCxkYiYmKERhfD0xKSx0YSYmKERhfD0yKSxNYT1NYVtEYV0pO2EubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09QmEuY2xpcFNoYWRvd3MmJjAhPT1CYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihEYT1NYS51dWlkLApkYj1CYS51dWlkLHRhPVNbRGFdLHZvaWQgMD09PXRhJiYodGE9e30sU1tEYV09dGEpLERhPXRhW2RiXSx2b2lkIDA9PT1EYSYmKERhPU1hLmNsb25lKCksdGFbZGJdPURhKSxNYT1EYSk7TWEudmlzaWJsZT1CYS52aXNpYmxlO01hLndpcmVmcmFtZT1CYS53aXJlZnJhbWU7TWEuc2lkZT0zPT09SGE/bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOkJhLnNpZGU6bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOlZbQmEuc2lkZV07TWEuY2xpcFNoYWRvd3M9QmEuY2xpcFNoYWRvd3M7TWEuY2xpcHBpbmdQbGFuZXM9QmEuY2xpcHBpbmdQbGFuZXM7TWEuY2xpcEludGVyc2VjdGlvbj1CYS5jbGlwSW50ZXJzZWN0aW9uO01hLndpcmVmcmFtZUxpbmV3aWR0aD1CYS53aXJlZnJhbWVMaW5ld2lkdGg7TWEubGluZXdpZHRoPUJhLmxpbmV3aWR0aDtUYS5pc1BvaW50TGlnaHQmJk1hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihNYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVGEubWF0cml4V29ybGQpLApNYS5uZWFyRGlzdGFuY2U9VWEsTWEuZmFyRGlzdGFuY2U9Q2EpO3JldHVybiBNYX1mdW5jdGlvbiB2KHRhLEJhLFRhLFVhLENhKXtpZighMSE9PXRhLnZpc2libGUpe2lmKHRhLmxheWVycy50ZXN0KEJhLmxheWVycykmJih0YS5pc01lc2h8fHRhLmlzTGluZXx8dGEuaXNQb2ludHMpJiYodGEuY2FzdFNoYWRvd3x8dGEucmVjZWl2ZVNoYWRvdyYmMz09PUNhKSYmKCF0YS5mcnVzdHVtQ3VsbGVkfHx6LmludGVyc2VjdHNPYmplY3QodGEpKSl7dGEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVGEubWF0cml4V29ybGRJbnZlcnNlLHRhLm1hdHJpeFdvcmxkKTt2YXIgSGE9Yy51cGRhdGUodGEpLERhPXRhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRGEpKWZvcih2YXIgTWE9SGEuZ3JvdXBzLGRiPTAsdGI9TWEubGVuZ3RoO2RiPHRiO2RiKyspe3ZhciBLYT1NYVtkYl0sYmI9RGFbS2EubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJihiYj1yKHRhLGJiLFVhLFRhLm5lYXIsClRhLmZhcixDYSksYS5yZW5kZXJCdWZmZXJEaXJlY3QoVGEsbnVsbCxIYSxiYix0YSxLYSkpfWVsc2UgRGEudmlzaWJsZSYmKGJiPXIodGEsRGEsVWEsVGEubmVhcixUYS5mYXIsQ2EpLGEucmVuZGVyQnVmZmVyRGlyZWN0KFRhLG51bGwsSGEsYmIsdGEsbnVsbCkpfXRhPXRhLmNoaWxkcmVuO0hhPTA7Zm9yKERhPXRhLmxlbmd0aDtIYTxEYTtIYSsrKXYodGFbSGFdLEJhLFRhLFVhLENhKX19dmFyIHo9bmV3IGljLEU9bmV3IGYsRj1uZXcgZixKPW5ldyBwLFA9QXJyYXkoNCksUj1BcnJheSg0KSxTPXt9LFY9ezA6MSwxOjAsMjoyfSxXPW5ldyBxYih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZn0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLApoYT1XLmNsb25lKCk7aGEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBmYT1uZXcgdmE7ZmEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciByYT1uZXcgeGEoZmEsVyk7Zm9yKGZhPTA7NCE9PWZhOysrZmEpe3ZhciBwYT0wIT09KGZhJjEpLHFhPTAhPT0oZmEmMiksdWE9bmV3IHZkKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cGEsc2tpbm5pbmc6cWF9KTtQW2ZhXT11YTtwYT1uZXcgd2Qoe21vcnBoVGFyZ2V0czpwYSxza2lubmluZzpxYX0pO1JbZmFdPXBhfXZhciBvYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih0YSxCYSxUYSl7aWYoITEhPT1vYS5lbmFibGVkJiYoITEhPT1vYS5hdXRvVXBkYXRlfHwhMSE9PW9hLm5lZWRzVXBkYXRlKSYmCjAhPT10YS5sZW5ndGgpe3ZhciBVYT1hLmdldFJlbmRlclRhcmdldCgpLENhPWEuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxIYT1hLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRGE9YS5zdGF0ZTtEYS5zZXRCbGVuZGluZygwKTtEYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0RhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RGEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgTWE9MCxkYj10YS5sZW5ndGg7TWE8ZGI7TWErKyl7dmFyIHRiPXRhW01hXSxLYT10Yi5zaGFkb3c7aWYodm9pZCAwPT09S2EpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHRiLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KEthLm1hcFNpemUpO3ZhciBiYj1LYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGJiKTtGLmNvcHkoS2EubWFwU2l6ZSk7aWYoRS54PmV8fEUueT5lKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix0YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmUmJihGLng9TWF0aC5mbG9vcihlL2JiLngpLEUueD1GLngqYmIueCxLYS5tYXBTaXplLng9Ri54KSxFLnk+ZSYmKEYueT1NYXRoLmZsb29yKGUvYmIueSksRS55PUYueSpiYi55LEthLm1hcFNpemUueT1GLnkpO251bGwhPT1LYS5tYXB8fEthLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGJiPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sS2EubWFwPW5ldyBtKEUueCxFLnksYmIpLEthLm1hcC50ZXh0dXJlLm5hbWU9dGIubmFtZSsiLnNoYWRvd01hcCIsS2EubWFwUGFzcz1uZXcgbShFLngsRS55LGJiKSxLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09S2EubWFwJiYoYmI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxLYS5tYXA9bmV3IG0oRS54LEUueSxiYiksS2EubWFwLnRleHR1cmUubmFtZT10Yi5uYW1lKyIuc2hhZG93TWFwIixLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYS5zZXRSZW5kZXJUYXJnZXQoS2EubWFwKTthLmNsZWFyKCk7YmI9S2EuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgamI9MDtqYjxiYjtqYisrKXt2YXIgRWI9S2EuZ2V0Vmlld3BvcnQoamIpO0ouc2V0KEYueCpFYi54LEYueSpFYi55LEYueCpFYi56LEYueSpFYi53KTtEYS52aWV3cG9ydChKKTtLYS51cGRhdGVNYXRyaWNlcyh0YixUYSxqYik7ej1LYS5nZXRGcnVzdHVtKCk7dihCYSxUYSxLYS5jYW1lcmEsdGIsdGhpcy50eXBlKX1LYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGcoS2EsVGEpfX1vYS5uZWVkc1VwZGF0ZT0hMTthLnNldFJlbmRlclRhcmdldChVYSxDYSxIYSl9fX1mdW5jdGlvbiBWbChhLGMsZSxnKXtmdW5jdGlvbiByKGphLEdhLExhKXt2YXIgbmI9bmV3IFVpbnQ4QXJyYXkoNCksVmE9YS5jcmVhdGVUZXh0dXJlKCk7YS5iaW5kVGV4dHVyZShqYSxWYSk7YS50ZXhQYXJhbWV0ZXJpKGphLDEwMjQxLDk3MjgpO2EudGV4UGFyYW1ldGVyaShqYSwKMTAyNDAsOTcyOCk7Zm9yKGphPTA7amE8TGE7amErKylhLnRleEltYWdlMkQoR2EramEsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxuYik7cmV0dXJuIFZhfWZ1bmN0aW9uIHYoamEsR2Epe3JhW2phXT0xOzA9PT1wYVtqYV0mJihhLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGphKSxwYVtqYV09MSk7cWFbamFdIT09R2EmJigoZy5pc1dlYkdMMj9hOmMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW2cuaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShqYSxHYSkscWFbamFdPUdhKX1mdW5jdGlvbiB6KGphKXshMCE9PXVhW2phXSYmKGEuZW5hYmxlKGphKSx1YVtqYV09ITApfWZ1bmN0aW9uIEUoamEpeyExIT09dWFbamFdJiYoYS5kaXNhYmxlKGphKSx1YVtqYV09ITEpfWZ1bmN0aW9uIEYoamEsR2EsTGEsbmIsVmEsaWIsa2IsUWEpe2lmKDA9PT1qYSlCYSYmKEUoMzA0MiksQmE9ITEpO2Vsc2UgaWYoQmF8fCh6KDMwNDIpLApCYT0hMCksNSE9PWphKXtpZihqYSE9PVRhfHxRYSE9PXRiKXtpZigxMDAhPT1VYXx8MTAwIT09RGEpYS5ibGVuZEVxdWF0aW9uKDMyNzc0KSxEYT1VYT0xMDA7aWYoUWEpc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmEuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmEuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDphLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsamEpfWVsc2Ugc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6YS5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzphLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmEuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGphKX1kYj1NYT1IYT1DYT1udWxsO1RhPWphO3RiPVFhfX1lbHNle1ZhPVZhfHxHYTtpYj1pYnx8TGE7a2I9a2J8fG5iO2lmKEdhIT09VWF8fFZhIT09RGEpYS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZS5jb252ZXJ0KEdhKSxlLmNvbnZlcnQoVmEpKSxVYT1HYSxEYT1WYTtpZihMYSE9PUNhfHxuYiE9PUhhfHxpYiE9PU1hfHxrYiE9PWRiKWEuYmxlbmRGdW5jU2VwYXJhdGUoZS5jb252ZXJ0KExhKSxlLmNvbnZlcnQobmIpLGUuY29udmVydChpYiksZS5jb252ZXJ0KGtiKSksQ2E9TGEsSGE9bmIsTWE9aWIsZGI9a2I7VGE9amE7dGI9bnVsbH19ZnVuY3Rpb24gSihqYSl7S2EhPT1qYSYmKGphP2EuZnJvbnRGYWNlKDIzMDQpOmEuZnJvbnRGYWNlKDIzMDUpLEthPWphKX1mdW5jdGlvbiBQKGphKXswIT09amE/KHooMjg4NCksamEhPT1iYiYmKDE9PT1qYT9hLmN1bGxGYWNlKDEwMjkpOgoyPT09amE/YS5jdWxsRmFjZSgxMDI4KTphLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtiYj1qYX1mdW5jdGlvbiBSKGphLEdhLExhKXtpZihqYSl7aWYoeigzMjgyMyksRWIhPT1HYXx8eGIhPT1MYSlhLnBvbHlnb25PZmZzZXQoR2EsTGEpLEViPUdhLHhiPUxhfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gUyhqYSl7dm9pZCAwPT09amEmJihqYT0zMzk4NCtpYS0xKTt6YSE9PWphJiYoYS5hY3RpdmVUZXh0dXJlKGphKSx6YT1qYSl9dmFyIFY9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW5ldyBwLExhPW51bGwsbmI9bmV3IHAoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oVmEpe0xhPT09VmF8fGphfHwoYS5jb2xvck1hc2soVmEsVmEsVmEsVmEpLExhPVZhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFZhKXtqYT1WYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oVmEsaWIsa2IsUWEsZWIpeyEwPT09ZWImJihWYSo9UWEsaWIqPVFhLGtiKj1RYSk7R2Euc2V0KFZhLGliLGtiLFFhKTsKITE9PT1uYi5lcXVhbHMoR2EpJiYoYS5jbGVhckNvbG9yKFZhLGliLGtiLFFhKSxuYi5jb3B5KEdhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7TGE9bnVsbDtuYi5zZXQoLTEsMCwwLDApfX19LFc9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW51bGwsTGE9bnVsbCxuYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFZhKXtWYT96KDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oVmEpe0dhPT09VmF8fGphfHwoYS5kZXB0aE1hc2soVmEpLEdhPVZhKX0sc2V0RnVuYzpmdW5jdGlvbihWYSl7aWYoTGEhPT1WYSl7aWYoVmEpc3dpdGNoKFZhKXtjYXNlIDA6YS5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6YS5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6YS5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6YS5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6YS5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6YS5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6YS5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmEuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDphLmRlcHRoRnVuYyg1MTUpfWVsc2UgYS5kZXB0aEZ1bmMoNTE1KTtMYT1WYX19LHNldExvY2tlZDpmdW5jdGlvbihWYSl7amE9VmF9LHNldENsZWFyOmZ1bmN0aW9uKFZhKXtuYiE9PVZhJiYoYS5jbGVhckRlcHRoKFZhKSxuYj1WYSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7bmI9TGE9R2E9bnVsbH19fSxoYT1uZXcgZnVuY3Rpb24oKXt2YXIgamE9ITEsR2E9bnVsbCxMYT1udWxsLG5iPW51bGwsVmE9bnVsbCxpYj1udWxsLGtiPW51bGwsUWE9bnVsbCxlYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKG1iKXtqYXx8KG1iP3ooMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obWIpe0dhPT09bWJ8fGphfHwoYS5zdGVuY2lsTWFzayhtYiksR2E9bWIpfSxzZXRGdW5jOmZ1bmN0aW9uKG1iLHBiLHNiKXtpZihMYSE9PW1ifHxuYiE9PXBifHxWYSE9PXNiKWEuc3RlbmNpbEZ1bmMobWIscGIsCnNiKSxMYT1tYixuYj1wYixWYT1zYn0sc2V0T3A6ZnVuY3Rpb24obWIscGIsc2Ipe2lmKGliIT09bWJ8fGtiIT09cGJ8fFFhIT09c2IpYS5zdGVuY2lsT3AobWIscGIsc2IpLGliPW1iLGtiPXBiLFFhPXNifSxzZXRMb2NrZWQ6ZnVuY3Rpb24obWIpe2phPW1ifSxzZXRDbGVhcjpmdW5jdGlvbihtYil7ZWIhPT1tYiYmKGEuY2xlYXJTdGVuY2lsKG1iKSxlYj1tYil9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7ZWI9UWE9a2I9aWI9VmE9bmI9TGE9R2E9bnVsbH19fSxmYT1hLmdldFBhcmFtZXRlcigzNDkyMSkscmE9bmV3IFVpbnQ4QXJyYXkoZmEpLHBhPW5ldyBVaW50OEFycmF5KGZhKSxxYT1uZXcgVWludDhBcnJheShmYSksdWE9e30sb2E9bnVsbCx0YT1udWxsLEJhPW51bGwsVGE9bnVsbCxVYT1udWxsLENhPW51bGwsSGE9bnVsbCxEYT1udWxsLE1hPW51bGwsZGI9bnVsbCx0Yj0hMSxLYT1udWxsLGJiPW51bGwsamI9bnVsbCxFYj1udWxsLHhiPW51bGwsaWE9YS5nZXRQYXJhbWV0ZXIoMzU2NjEpLApuYT0hMTtmYT0wO2ZhPWEuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09ZmEuaW5kZXhPZigiV2ViR0wiKT8oZmE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoZmEpWzFdKSxuYT0xPD1mYSk6LTEhPT1mYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGZhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhmYSlbMV0pLG5hPTI8PWZhKTt2YXIgemE9bnVsbCxKYT17fSxZYT1uZXcgcCxOYT1uZXcgcCxjYj17fTtjYlszNTUzXT1yKDM1NTMsMzU1MywxKTtjYlszNDA2N109cigzNDA2NywzNDA2OSw2KTtWLnNldENsZWFyKDAsMCwwLDEpO1cuc2V0Q2xlYXIoMSk7aGEuc2V0Q2xlYXIoMCk7eigyOTI5KTtXLnNldEZ1bmMoMyk7SighMSk7UCgxKTt6KDI4ODQpO0YoMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlYsZGVwdGg6VyxzdGVuY2lsOmhhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgamE9MCxHYT1yYS5sZW5ndGg7amE8R2E7amErKylyYVtqYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihqYSl7dihqYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp2LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wLEdhPXBhLmxlbmd0aDtqYSE9PUdhOysramEpcGFbamFdIT09cmFbamFdJiYoYS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoamEpLHBhW2phXT0wKX0sZW5hYmxlOnosZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1vYSYmKG9hPVtdLGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBqYT1hLmdldFBhcmFtZXRlcigzNDQ2NyksR2E9MDtHYTxqYS5sZW5ndGg7R2ErKylvYS5wdXNoKGphW0dhXSk7CnJldHVybiBvYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihqYSl7cmV0dXJuIHRhIT09amE/KGEudXNlUHJvZ3JhbShqYSksdGE9amEsITApOiExfSxzZXRCbGVuZGluZzpGLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGphLEdhKXsyPT09amEuc2lkZT9FKDI4ODQpOnooMjg4NCk7dmFyIExhPTE9PT1qYS5zaWRlO0dhJiYoTGE9IUxhKTtKKExhKTsxPT09amEuYmxlbmRpbmcmJiExPT09amEudHJhbnNwYXJlbnQ/RigwKTpGKGphLmJsZW5kaW5nLGphLmJsZW5kRXF1YXRpb24samEuYmxlbmRTcmMsamEuYmxlbmREc3QsamEuYmxlbmRFcXVhdGlvbkFscGhhLGphLmJsZW5kU3JjQWxwaGEsamEuYmxlbmREc3RBbHBoYSxqYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1cuc2V0RnVuYyhqYS5kZXB0aEZ1bmMpO1cuc2V0VGVzdChqYS5kZXB0aFRlc3QpO1cuc2V0TWFzayhqYS5kZXB0aFdyaXRlKTtWLnNldE1hc2soamEuY29sb3JXcml0ZSk7R2E9amEuc3RlbmNpbFdyaXRlO2hhLnNldFRlc3QoR2EpO0dhJiYKKGhhLnNldEZ1bmMoamEuc3RlbmNpbEZ1bmMsamEuc3RlbmNpbFJlZixqYS5zdGVuY2lsTWFzayksaGEuc2V0T3AoamEuc3RlbmNpbEZhaWwsamEuc3RlbmNpbFpGYWlsLGphLnN0ZW5jaWxaUGFzcykpO1IoamEucG9seWdvbk9mZnNldCxqYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGphLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpKLHNldEN1bGxGYWNlOlAsc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGphKXtqYSE9PWpiJiYobmEmJmEubGluZVdpZHRoKGphKSxqYj1qYSl9LHNldFBvbHlnb25PZmZzZXQ6UixzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihqYSl7amE/eigzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlMsYmluZFRleHR1cmU6ZnVuY3Rpb24oamEsR2Epe251bGw9PT16YSYmUygpO3ZhciBMYT1KYVt6YV07dm9pZCAwPT09TGEmJihMYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEphW3phXT1MYSk7aWYoTGEudHlwZSE9PWphfHxMYS50ZXh0dXJlIT09CkdhKWEuYmluZFRleHR1cmUoamEsR2F8fGNiW2phXSksTGEudHlwZT1qYSxMYS50ZXh0dXJlPUdhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXthLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTNELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHNjaXNzb3I6ZnVuY3Rpb24oamEpeyExPT09WWEuZXF1YWxzKGphKSYmKGEuc2Npc3NvcihqYS54LGphLnksamEueixqYS53KSxZYS5jb3B5KGphKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGphKXshMT09PQpOYS5lcXVhbHMoamEpJiYoYS52aWV3cG9ydChqYS54LGphLnksamEueixqYS53KSxOYS5jb3B5KGphKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wO2phPHBhLmxlbmd0aDtqYSsrKTE9PT1wYVtqYV0mJihhLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShqYSkscGFbamFdPTApO3VhPXt9O3phPW9hPW51bGw7SmE9e307YmI9S2E9VGE9dGE9bnVsbDtWLnJlc2V0KCk7Vy5yZXNldCgpO2hhLnJlc2V0KCl9fX1mdW5jdGlvbiBXbChhLGMsZSxnLHIsdix6KXtmdW5jdGlvbiBFKGlhLG5hKXtyZXR1cm4gYmI/bmV3IE9mZnNjcmVlbkNhbnZhcyhpYSxuYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRihpYSxuYSx6YSxKYSl7dmFyIFlhPTE7aWYoaWEud2lkdGg+SmF8fGlhLmhlaWdodD5KYSlZYT1KYS9NYXRoLm1heChpYS53aWR0aCxpYS5oZWlnaHQpO2lmKDE+WWF8fCEwPT09bmEpe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmaWEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gSmE9bmE/aGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3IsbmE9SmEoWWEqaWEud2lkdGgpLFlhPUphKFlhKmlhLmhlaWdodCksdm9pZCAwPT09S2EmJihLYT1FKG5hLFlhKSksemE9emE/RShuYSxZYSk6S2EsemEud2lkdGg9bmEsemEuaGVpZ2h0PVlhLHphLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGlhLDAsMCxuYSxZYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpIHRvICgiK25hKyJ4IitZYSsiKS4iKSwKemE7ImRhdGEiaW4gaWEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpLiIpfXJldHVybiBpYX1mdW5jdGlvbiBKKGlhKXtyZXR1cm4gaGIuaXNQb3dlck9mVHdvKGlhLndpZHRoKSYmaGIuaXNQb3dlck9mVHdvKGlhLmhlaWdodCl9ZnVuY3Rpb24gUChpYSl7cmV0dXJuIHIuaXNXZWJHTDI/ITE6MTAwMSE9PWlhLndyYXBTfHwxMDAxIT09aWEud3JhcFR8fDEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUihpYSxuYSl7cmV0dXJuIGlhLmdlbmVyYXRlTWlwbWFwcyYmbmEmJjEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUyhpYSxuYSx6YSxKYSl7YS5nZW5lcmF0ZU1pcG1hcChpYSk7Zy5nZXQobmEpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoemEsSmEpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBWKGlhLG5hKXtpZighci5pc1dlYkdMMilyZXR1cm4gaWE7dmFyIHphPWlhOzY0MDM9PT1pYSYmKDUxMjY9PT1uYSYmKHphPTMzMzI2KSw1MTMxPT09bmEmJih6YT0zMzMyNSksNTEyMT09PW5hJiYoemE9MzMzMjEpKTs2NDA3PT09aWEmJig1MTI2PT09bmEmJih6YT0zNDgzNyksNTEzMT09PW5hJiYoemE9MzQ4NDMpLDUxMjE9PT1uYSYmKHphPTMyODQ5KSk7NjQwOD09PWlhJiYoNTEyNj09PW5hJiYoemE9MzQ4MzYpLDUxMzE9PT1uYSYmKHphPTM0ODQyKSw1MTIxPT09bmEmJih6YT0zMjg1NikpOzMzMzI1PT09emF8fDMzMzI2PT09emF8fDM0ODQyPT09emF8fDM0ODM2PT09emE/Yy5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT16YXx8MzQ4Mzc9PT16YSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gemF9ZnVuY3Rpb24gVyhpYSl7cmV0dXJuIDEwMDM9PT1pYXx8MTAwND09PWlhfHwxMDA1PT09aWE/OTcyODo5NzI5fWZ1bmN0aW9uIGhhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGEpO3JhKGlhKTtpYS5pc1ZpZGVvVGV4dHVyZSYmdGIuZGVsZXRlKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGZhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZmEpO3BhKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHJhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpO3ZvaWQgMCE9PW5hLl9fd2ViZ2xJbml0JiYoYS5kZWxldGVUZXh0dXJlKG5hLl9fd2ViZ2xUZXh0dXJlKSxnLnJlbW92ZShpYSkpfWZ1bmN0aW9uIHBhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpLHphPWcuZ2V0KGlhLnRleHR1cmUpO2lmKGlhKXt2b2lkIDAhPT16YS5fX3dlYmdsVGV4dHVyZSYmYS5kZWxldGVUZXh0dXJlKHphLl9fd2ViZ2xUZXh0dXJlKTsKaWEuZGVwdGhUZXh0dXJlJiZpYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcih6YT0wOzY+emE7emErKylhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlclt6YV0pLG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYS5kZWxldGVSZW5kZXJidWZmZXIobmEuX193ZWJnbERlcHRoYnVmZmVyW3phXSk7ZWxzZSBhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksbmEuX193ZWJnbERlcHRoYnVmZmVyJiZhLmRlbGV0ZVJlbmRlcmJ1ZmZlcihuYS5fX3dlYmdsRGVwdGhidWZmZXIpO2cucmVtb3ZlKGlhLnRleHR1cmUpO2cucmVtb3ZlKGlhKX19ZnVuY3Rpb24gcWEoaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7aWEuaXNWaWRlb1RleHR1cmUmJmRiKGlhKTtpZigwPGlhLnZlcnNpb24mJnphLl9fdmVyc2lvbiE9PWlhLnZlcnNpb24pe3ZhciBKYT1pYS5pbWFnZTtpZih2b2lkIDA9PT1KYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09SmEuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtUYSh6YSxpYSxuYSk7cmV0dXJufX1lLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdWEoaWEsbmEpe2lmKDY9PT1pYS5pbWFnZS5sZW5ndGgpe3ZhciB6YT1nLmdldChpYSk7aWYoMDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uKXtCYSh6YSxpYSk7ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKTtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTthLnBpeGVsU3RvcmVpKDM3NDQwLGlhLmZsaXBZKTt2YXIgSmE9aWEmJmlhLmlzQ29tcHJlc3NlZFRleHR1cmU7bmE9aWEuaW1hZ2VbMF0mJmlhLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciBZYT1bXSwKTmE9MDs2Pk5hO05hKyspWWFbTmFdPUphfHxuYT9uYT9pYS5pbWFnZVtOYV0uaW1hZ2U6aWEuaW1hZ2VbTmFdOkYoaWEuaW1hZ2VbTmFdLCExLCEwLHIubWF4Q3ViZW1hcFNpemUpO3ZhciBjYj1ZYVswXSxqYT1KKGNiKXx8ci5pc1dlYkdMMixHYT12LmNvbnZlcnQoaWEuZm9ybWF0KSxMYT12LmNvbnZlcnQoaWEudHlwZSksbmI9VihHYSxMYSk7dGEoMzQwNjcsaWEsamEpO2lmKEphKXtmb3IoTmE9MDs2Pk5hO05hKyspe3ZhciBWYT1ZYVtOYV0ubWlwbWFwcztmb3IoSmE9MDtKYTxWYS5sZW5ndGg7SmErKyl7dmFyIGliPVZhW0phXTsxMDIzIT09aWEuZm9ybWF0JiYxMDIyIT09aWEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihHYSk/ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxpYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmUudGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxHYSxMYSxpYi5kYXRhKX19emEuX19tYXhNaXBMZXZlbD1WYS5sZW5ndGgtMX1lbHNle1ZhPWlhLm1pcG1hcHM7Zm9yKE5hPTA7Nj5OYTtOYSsrKWlmKG5hKWZvcihlLnRleEltYWdlMkQoMzQwNjkrTmEsMCxuYixZYVtOYV0ud2lkdGgsWWFbTmFdLmhlaWdodCwwLEdhLExhLFlhW05hXS5kYXRhKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxpYj1pYi5pbWFnZVtOYV0uaW1hZ2UsZS50ZXhJbWFnZTJEKDM0MDY5K05hLEphKzEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsR2EsTGEsaWIuZGF0YSk7ZWxzZSBmb3IoZS50ZXhJbWFnZTJEKDM0MDY5K05hLDAsbmIsR2EsTGEsWWFbTmFdKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxlLnRleEltYWdlMkQoMzQwNjkrTmEsSmErMSxuYixHYSxMYSxpYi5pbWFnZVtOYV0pO3phLl9fbWF4TWlwTGV2ZWw9VmEubGVuZ3RofVIoaWEsCmphKSYmUygzNDA2NyxpYSxjYi53aWR0aCxjYi5oZWlnaHQpO3phLl9fdmVyc2lvbj1pYS52ZXJzaW9uO2lmKGlhLm9uVXBkYXRlKWlhLm9uVXBkYXRlKGlhKX1lbHNlIGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIG9hKGlhLG5hKXtlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzQwNjcsZy5nZXQoaWEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB0YShpYSxuYSx6YSl7emE/KGEudGV4UGFyYW1ldGVyaShpYSwxMDI0Mix2LmNvbnZlcnQobmEud3JhcFMpKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDMsdi5jb252ZXJ0KG5hLndyYXBUKSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLHYuY29udmVydChuYS53cmFwUikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCx2LmNvbnZlcnQobmEubWFnRmlsdGVyKSksYS50ZXhQYXJhbWV0ZXJpKGlhLAoxMDI0MSx2LmNvbnZlcnQobmEubWluRmlsdGVyKSkpOihhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDIsMzMwNzEpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MywzMzA3MSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLDMzMDcxKSwxMDAxPT09bmEud3JhcFMmJjEwMDE9PT1uYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCxXKG5hLm1hZ0ZpbHRlcikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MSxXKG5hLm1pbkZpbHRlcikpLDEwMDMhPT1uYS5taW5GaWx0ZXImJjEwMDYhPT1uYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKISh6YT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09bmEudHlwZSYmbnVsbD09PWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW5hLnR5cGUmJm51bGw9PT0oci5pc1dlYkdMMnx8Yy5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8bmEuYW5pc290cm9weXx8Zy5nZXQobmEpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYS50ZXhQYXJhbWV0ZXJmKGlhLHphLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG5hLmFuaXNvdHJvcHksci5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxnLmdldChuYSkuX19jdXJyZW50QW5pc290cm9weT1uYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBCYShpYSxuYSl7dm9pZCAwPT09aWEuX193ZWJnbEluaXQmJihpYS5fX3dlYmdsSW5pdD0hMCxuYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixoYSksaWEuX193ZWJnbFRleHR1cmU9YS5jcmVhdGVUZXh0dXJlKCksCnoubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFRhKGlhLG5hLHphKXt2YXIgSmE9MzU1MztuYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEphPTM1ODY2KTtuYS5pc0RhdGFUZXh0dXJlM0QmJihKYT0zMjg3OSk7QmEoaWEsbmEpO2UuYWN0aXZlVGV4dHVyZSgzMzk4NCt6YSk7ZS5iaW5kVGV4dHVyZShKYSxpYS5fX3dlYmdsVGV4dHVyZSk7YS5waXhlbFN0b3JlaSgzNzQ0MCxuYS5mbGlwWSk7YS5waXhlbFN0b3JlaSgzNzQ0MSxuYS5wcmVtdWx0aXBseUFscGhhKTthLnBpeGVsU3RvcmVpKDMzMTcsbmEudW5wYWNrQWxpZ25tZW50KTt6YT1QKG5hKSYmITE9PT1KKG5hLmltYWdlKTt6YT1GKG5hLmltYWdlLHphLCExLHIubWF4VGV4dHVyZVNpemUpO3ZhciBZYT1KKHphKXx8ci5pc1dlYkdMMixOYT12LmNvbnZlcnQobmEuZm9ybWF0KSxjYj12LmNvbnZlcnQobmEudHlwZSksamE9VihOYSxjYik7dGEoSmEsbmEsWWEpO3ZhciBHYT1uYS5taXBtYXBzO2lmKG5hLmlzRGVwdGhUZXh0dXJlKXtqYT0KNjQwMjtpZigxMDE1PT09bmEudHlwZSl7aWYoIXIuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtqYT0zNjAxMn1lbHNlIHIuaXNXZWJHTDImJihqYT0zMzE4OSk7MTAyNj09PW5hLmZvcm1hdCYmNjQwMj09PWphJiYxMDEyIT09bmEudHlwZSYmMTAxNCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxuYS50eXBlPTEwMTIsY2I9di5jb252ZXJ0KG5hLnR5cGUpKTsxMDI3PT09bmEuZm9ybWF0JiYoamE9MzQwNDEsMTAyMCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksbmEudHlwZT0xMDIwLGNiPQp2LmNvbnZlcnQobmEudHlwZSkpKTtlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLG51bGwpfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZSlpZigwPEdhLmxlbmd0aCYmWWEpe2Zvcih2YXIgTGE9MCxuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sZS50ZXhJbWFnZTJEKDM1NTMsTGEsamEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsTmEsY2IsSmEuZGF0YSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG5hLmlzQ29tcHJlc3NlZFRleHR1cmUpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSwxMDIzIT09bmEuZm9ybWF0JiYxMDIyIT09bmEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihOYSk/CmUuY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxKYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTplLnRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxOYSxjYixKYS5kYXRhKTtpYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTJEQXJyYXkpZS50ZXhJbWFnZTNEKDM1ODY2LDAsamEsemEud2lkdGgsemEuaGVpZ2h0LHphLmRlcHRoLDAsTmEsY2IsemEuZGF0YSksaWEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTNEKWUudGV4SW1hZ2UzRCgzMjg3OSwwLGphLHphLndpZHRoLHphLmhlaWdodCx6YS5kZXB0aCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkdhLmxlbmd0aCYmWWEpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSxlLnRleEltYWdlMkQoMzU1MyxMYSxqYSxOYSxjYixKYSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLE5hLGNiLHphKSxpYS5fX21heE1pcExldmVsPTA7UihuYSxZYSkmJlMoMzU1MyxuYSx6YS53aWR0aCx6YS5oZWlnaHQpO2lhLl9fdmVyc2lvbj1uYS52ZXJzaW9uO2lmKG5hLm9uVXBkYXRlKW5hLm9uVXBkYXRlKG5hKX1mdW5jdGlvbiBVYShpYSxuYSx6YSxKYSl7dmFyIFlhPXYuY29udmVydChuYS50ZXh0dXJlLmZvcm1hdCksTmE9di5jb252ZXJ0KG5hLnRleHR1cmUudHlwZSksY2I9VihZYSxOYSk7ZS50ZXhJbWFnZTJEKEphLDAsY2IsbmEud2lkdGgsbmEuaGVpZ2h0LDAsWWEsTmEsbnVsbCk7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2EuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCnphLEphLGcuZ2V0KG5hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIENhKGlhLG5hLHphKXthLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsaWEpO2lmKG5hLmRlcHRoQnVmZmVyJiYhbmEuc3RlbmNpbEJ1ZmZlcil6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLDMzMTg5LG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxuYS53aWR0aCxuYS5oZWlnaHQpLGEuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsaWEpO2Vsc2UgaWYobmEuZGVwdGhCdWZmZXImJm5hLnN0ZW5jaWxCdWZmZXIpemE/KHphPU1hKG5hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSwzNTA1NixuYS53aWR0aCxuYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm5hLndpZHRoLG5hLmhlaWdodCksYS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxpYSk7ZWxzZXtpYT12LmNvbnZlcnQobmEudGV4dHVyZS5mb3JtYXQpO3ZhciBKYT12LmNvbnZlcnQobmEudGV4dHVyZS50eXBlKTtpYT1WKGlhLEphKTt6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLGlhLG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxpYSxuYS53aWR0aCxuYS5oZWlnaHQpfWEuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBIYShpYSxuYSl7aWYobmEmJm5hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2lmKCFuYS5kZXB0aFRleHR1cmV8fCFuYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKZy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmbmEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09bmEud2lkdGgmJm5hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1uYS5oZWlnaHR8fChuYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9bmEud2lkdGgsbmEuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1uYS5oZWlnaHQsbmEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtxYShuYS5kZXB0aFRleHR1cmUsMCk7aWE9Zy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsaWEsMCk7ZWxzZSBpZigxMDI3PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsaWEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBEYShpYSl7dmFyIG5hPWcuZ2V0KGlhKSx6YT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGlhLmRlcHRoVGV4dHVyZSl7aWYoemEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SGEobmEuX193ZWJnbEZyYW1lYnVmZmVyLGlhKX1lbHNlIGlmKHphKWZvcihuYS5fX3dlYmdsRGVwdGhidWZmZXI9W10semE9MDs2PnphO3phKyspYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyW3phXSksbmEuX193ZWJnbERlcHRoYnVmZmVyW3phXT1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV0saWEpO2Vsc2UgYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyKSxuYS5fX3dlYmdsRGVwdGhidWZmZXI9YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShuYS5fX3dlYmdsRGVwdGhidWZmZXIsCmlhKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBNYShpYSl7cmV0dXJuIHIuaXNXZWJHTDImJmlhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbihyLm1heFNhbXBsZXMsaWEuc2FtcGxlcyk6MH1mdW5jdGlvbiBkYihpYSl7dmFyIG5hPXoucmVuZGVyLmZyYW1lO3RiLmdldChpYSkhPT1uYSYmKHRiLnNldChpYSxuYSksaWEudXBkYXRlKCkpfXZhciB0Yj1uZXcgV2Vha01hcCxLYSxiYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsamI9MCxFYj0hMSx4Yj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgaWE9amI7aWE+PXIubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2lhKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrci5tYXhUZXh0dXJlcyk7amIrPTE7cmV0dXJuIGlhfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe2piPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXFhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7MDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uP1RhKHphLGlhLG5hKTooZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKSxlLmJpbmRUZXh0dXJlKDM1ODY2LHphLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGlhLG5hKXt2YXIgemE9Zy5nZXQoaWEpOzA8aWEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aWEudmVyc2lvbj9UYSh6YSxpYSxuYSk6KGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzMjg3OSx6YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXVhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPW9hO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oaWEpe3ZhciBuYT1nLmdldChpYSksemE9Zy5nZXQoaWEudGV4dHVyZSk7CmlhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGZhKTt6YS5fX3dlYmdsVGV4dHVyZT1hLmNyZWF0ZVRleHR1cmUoKTt6Lm1lbW9yeS50ZXh0dXJlcysrO3ZhciBKYT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLFlhPSEwPT09aWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LE5hPUooaWEpfHxyLmlzV2ViR0wyO2lmKEphKWZvcihuYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sWWE9MDs2PllhO1lhKyspbmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXT1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihuYS5fX3dlYmdsRnJhbWVidWZmZXI9YS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFlhKWlmKHIuaXNXZWJHTDIpe25hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7bmEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCk7YS5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG5hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CllhPXYuY29udmVydChpYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGNiPXYuY29udmVydChpYS50ZXh0dXJlLnR5cGUpO1lhPVYoWWEsY2IpO2NiPU1hKGlhKTthLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxjYixZYSxpYS53aWR0aCxpYS5oZWlnaHQpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG5hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7YS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxuYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2EuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtpYS5kZXB0aEJ1ZmZlciYmKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixpYSwhMCkpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEphKXtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTt0YSgzNDA2NyxpYS50ZXh0dXJlLE5hKTtmb3IoWWE9MDs2PllhO1lhKyspVWEobmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXSxpYSwzNjA2NCwzNDA2OStZYSk7UihpYS50ZXh0dXJlLE5hKSYmUygzNDA2NyxpYS50ZXh0dXJlLGlhLndpZHRoLGlhLmhlaWdodCk7ZS5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGUuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSksdGEoMzU1MyxpYS50ZXh0dXJlLE5hKSxVYShuYS5fX3dlYmdsRnJhbWVidWZmZXIsaWEsMzYwNjQsMzU1MyksUihpYS50ZXh0dXJlLE5hKSYmUygzNTUzLGlhLnRleHR1cmUsaWEud2lkdGgsaWEuaGVpZ2h0KSxlLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7aWEuZGVwdGhCdWZmZXImJkRhKGlhKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oaWEpe3ZhciBuYT1pYS50ZXh0dXJlLHphPUooaWEpfHwKci5pc1dlYkdMMjtpZihSKG5hLHphKSl7emE9aWEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgSmE9Zy5nZXQobmEpLl9fd2ViZ2xUZXh0dXJlO2UuYmluZFRleHR1cmUoemEsSmEpO1MoemEsbmEsaWEud2lkdGgsaWEuaGVpZ2h0KTtlLmJpbmRUZXh0dXJlKHphLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihpYSl7aWYoaWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHIuaXNXZWJHTDIpe3ZhciBuYT1nLmdldChpYSk7YS5iaW5kRnJhbWVidWZmZXIoMzYwMDgsbmEuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxuYS5fX3dlYmdsRnJhbWVidWZmZXIpO25hPWlhLndpZHRoO3ZhciB6YT1pYS5oZWlnaHQsSmE9MTYzODQ7aWEuZGVwdGhCdWZmZXImJihKYXw9MjU2KTtpYS5zdGVuY2lsQnVmZmVyJiYoSmF8PTEwMjQpO2EuYmxpdEZyYW1lYnVmZmVyKDAsCjAsbmEsemEsMCwwLG5hLHphLEphLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihpYSxuYSl7aWEmJmlhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PUViJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksRWI9ITApLGlhPWlhLnRleHR1cmUpO3FhKGlhLG5hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oaWEsbmEpe2lhJiZpYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09eGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCnhiPSEwKSxpYT1pYS50ZXh0dXJlKTtpYSYmaWEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShpYS5pbWFnZSkmJjY9PT1pYS5pbWFnZS5sZW5ndGg/dWEoaWEsbmEpOm9hKGlhLG5hKX19ZnVuY3Rpb24gd2ooYSxjLGUpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKGcpe2lmKDFFMz09PWcpcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1nKXJldHVybiAzMzA3MTtpZigxMDAyPT09ZylyZXR1cm4gMzM2NDg7aWYoMTAwMz09PWcpcmV0dXJuIDk3Mjg7aWYoMTAwND09PWcpcmV0dXJuIDk5ODQ7aWYoMTAwNT09PWcpcmV0dXJuIDk5ODY7aWYoMTAwNj09PWcpcmV0dXJuIDk3Mjk7aWYoMTAwNz09PWcpcmV0dXJuIDk5ODU7aWYoMTAwOD09PWcpcmV0dXJuIDk5ODc7aWYoMTAwOT09PWcpcmV0dXJuIDUxMjE7aWYoMTAxNz09PWcpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1nKXJldHVybiAzMjgyMDtpZigxMDE5PT09ZylyZXR1cm4gMzM2MzU7aWYoMTAxMD09PWcpcmV0dXJuIDUxMjA7aWYoMTAxMT09PQpnKXJldHVybiA1MTIyO2lmKDEwMTI9PT1nKXJldHVybiA1MTIzO2lmKDEwMTM9PT1nKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1nKXJldHVybiA1MTI1O2lmKDEwMTU9PT1nKXJldHVybiA1MTI2O2lmKDEwMTY9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciByPWMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXIpcmV0dXJuIHIuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PWcpcmV0dXJuIDY0MDY7aWYoMTAyMj09PWcpcmV0dXJuIDY0MDc7aWYoMTAyMz09PWcpcmV0dXJuIDY0MDg7aWYoMTAyND09PWcpcmV0dXJuIDY0MDk7aWYoMTAyNT09PWcpcmV0dXJuIDY0MTA7aWYoMTAyNj09PWcpcmV0dXJuIDY0MDI7aWYoMTAyNz09PWcpcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1nKXJldHVybiA2NDAzO2lmKDEwMD09PWcpcmV0dXJuIDMyNzc0O2lmKDEwMT09PWcpcmV0dXJuIDMyNzc4O2lmKDEwMj09PWcpcmV0dXJuIDMyNzc5O2lmKDIwMD09PWcpcmV0dXJuIDA7CmlmKDIwMT09PWcpcmV0dXJuIDE7aWYoMjAyPT09ZylyZXR1cm4gNzY4O2lmKDIwMz09PWcpcmV0dXJuIDc2OTtpZigyMDQ9PT1nKXJldHVybiA3NzA7aWYoMjA1PT09ZylyZXR1cm4gNzcxO2lmKDIwNj09PWcpcmV0dXJuIDc3MjtpZigyMDc9PT1nKXJldHVybiA3NzM7aWYoMjA4PT09ZylyZXR1cm4gNzc0O2lmKDIwOT09PWcpcmV0dXJuIDc3NTtpZigyMTA9PT1nKXJldHVybiA3NzY7aWYoMzM3NzY9PT1nfHwzMzc3Nz09PWd8fDMzNzc4PT09Z3x8MzM3Nzk9PT1nKWlmKHI9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXIpe2lmKDMzNzc2PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1nKXJldHVybiByLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cmd8fDM1ODQxPT09Z3x8MzU4NDI9PT1nfHwzNTg0Mz09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXIpe2lmKDM1ODQwPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1nJiYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09cikpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PWd8fDM3ODA5PT09Z3x8Mzc4MTA9PT1nfHwzNzgxMT09PWd8fDM3ODEyPT09Z3x8Mzc4MTM9PT1nfHwzNzgxND09PWd8fDM3ODE1PT09Z3x8Mzc4MTY9PT0KZ3x8Mzc4MTc9PT1nfHwzNzgxOD09PWd8fDM3ODE5PT09Z3x8Mzc4MjA9PT1nfHwzNzgyMT09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09cilyZXR1cm4gZztpZigxMDM9PT1nfHwxMDQ9PT1nKXtpZihlLmlzV2ViR0wyKXtpZigxMDM9PT1nKXJldHVybiAzMjc3NTtpZigxMDQ9PT1nKXJldHVybiAzMjc3Nn1yPWMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXIpe2lmKDEwMz09PWcpcmV0dXJuIHIuTUlOX0VYVDtpZigxMDQ9PT1nKXJldHVybiByLk1BWF9FWFR9fWlmKDEwMjA9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiAzNDA0MjtyPWMuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXIpcmV0dXJuIHIuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiB1ZSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiB2ZihhKXt2Yi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9YXx8W119ZnVuY3Rpb24geGooYSxjLGUpe3lqLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKTt6ai5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCk7dmFyIGc9eWouZGlzdGFuY2VUbyh6aikscj1jLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdj1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsej1yWzE0XS8oclsxMF0tMSk7ZT1yWzE0XS8oclsxMF0rMSk7dmFyIEU9KHJbOV0rMSkvcls1XSxGPShyWzldLTEpL3JbNV0sSj0ocls4XS0xKS9yWzBdLFA9KHZbOF0rMSkvdlswXTtyPXoqSjt2PXoqUDtQPWcvKC1KK1ApO0o9UCotSjtjLm1hdHJpeFdvcmxkLmRlY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLnRyYW5zbGF0ZVgoSik7YS50cmFuc2xhdGVaKFApO2EubWF0cml4V29ybGQuY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGEubWF0cml4V29ybGQpOwpjPXorUDt6PWUrUDthLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHItSix2KyhnLUopLEUqZS96KmMsRiplL3oqYyxjLHopfWZ1bmN0aW9uIE5oKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbnVsbCE9PUomJiEwPT09Si5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gZSgpe2lmKGMoKSl7dmFyIEhhPUouZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO3o9MipIYS5yZW5kZXJXaWR0aCpoYTtFPUhhLnJlbmRlckhlaWdodCpoYTtUYT1hLmdldFBpeGVsUmF0aW8oKTthLmdldFNpemUoQmEpO2Euc2V0RHJhd2luZ0J1ZmZlclNpemUoeixFLDEpO3VhLnZpZXdwb3J0LnNldCgwLDAsei8yLEUpO29hLnZpZXdwb3J0LnNldCh6LzIsMCx6LzIsRSk7Q2Euc3RhcnQoKTtGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEYuZW5hYmxlZCYmYS5zZXREcmF3aW5nQnVmZmVyU2l6ZShCYS53aWR0aCxCYS5oZWlnaHQsVGEpLENhLnN0b3AoKSxGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIGcoSGEpe2Zvcih2YXIgRGE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxNYT0wLGRiPTAsdGI9RGEubGVuZ3RoO01hPHRiO01hKyspe3ZhciBLYT1EYVtNYV07aWYoS2EmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1LYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1LYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUthLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09S2EuaWR8fEthLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxLYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxLYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGRiPT09SGEpcmV0dXJuIEthO2RiKyt9fX1mdW5jdGlvbiByKCl7Zm9yKHZhciBIYT0wO0hhPFMubGVuZ3RoO0hhKyspe3ZhciBEYT1TW0hhXSxNYT1nKEhhKTtpZih2b2lkIDAhPT1NYSYmdm9pZCAwIT09TWEucG9zZSl7aWYobnVsbD09PU1hLnBvc2UpYnJlYWs7CnZhciBkYj1NYS5wb3NlOyExPT09ZGIuaGFzUG9zaXRpb24mJkRhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWRiLnBvc2l0aW9uJiZEYS5wb3NpdGlvbi5mcm9tQXJyYXkoZGIucG9zaXRpb24pO251bGwhPT1kYi5vcmllbnRhdGlvbiYmRGEucXVhdGVybmlvbi5mcm9tQXJyYXkoZGIub3JpZW50YXRpb24pO0RhLm1hdHJpeC5jb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeC5wcmVtdWx0aXBseShWKTtEYS5tYXRyaXguZGVjb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RGEudmlzaWJsZT0hMDtkYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1NYS5pZD8wOjE7dm9pZCAwPT09VWFbSGFdJiYoVWFbSGFdPSExKTtVYVtIYV0hPT1NYS5idXR0b25zW2RiXS5wcmVzc2VkJiYoVWFbSGFdPU1hLmJ1dHRvbnNbZGJdLnByZXNzZWQsITA9PT1VYVtIYV0/CkRhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBEYS52aXNpYmxlPSExfX1mdW5jdGlvbiB2KEhhLERhKXtudWxsIT09RGEmJjQ9PT1EYS5sZW5ndGgmJkhhLnNldChEYVswXSp6LERhWzFdKkUsRGFbMl0qeixEYVszXSpFKX12YXIgeixFLEY9dGhpcyxKPW51bGwsUD1udWxsLFI9bnVsbCxTPVtdLFY9bmV3IHEsVz1uZXcgcSxoYT0xLGZhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoUD1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlLCExKSk7dmFyIHJhPW5ldyBxLHBhPW5ldyBoLHFhPW5ldyBrLHVhPW5ldyB2Yjt1YS52aWV3cG9ydD1uZXcgcDt1YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgb2E9bmV3IHZiO29hLnZpZXdwb3J0PW5ldyBwO29hLmxheWVycy5lbmFibGUoMik7dmFyIHRhPW5ldyB2ZihbdWEsb2FdKTt0YS5sYXllcnMuZW5hYmxlKDEpO3RhLmxheWVycy5lbmFibGUoMik7dmFyIEJhPW5ldyBmLFRhLFVhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSGEpe3ZhciBEYT1TW0hhXTt2b2lkIDA9PT1EYSYmKERhPW5ldyB1ZSxEYS5tYXRyaXhBdXRvVXBkYXRlPSExLERhLnZpc2libGU9ITEsU1tIYV09RGEpO3JldHVybiBEYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSn07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSGEpe3ZvaWQgMCE9PUhhJiYoSj1IYSk7Q2Euc2V0Q29udGV4dChIYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihIYSl7aGE9SGF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKEhhKXtmYT1IYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKEhhKXt2b2lkIDAhPT0KSGEmJihSPUhhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSGEpe3ZhciBEYT0ibG9jYWwtZmxvb3IiPT09ZmE/MS42OjA7aWYoITE9PT1jKCkpcmV0dXJuIEhhLnBvc2l0aW9uLnNldCgwLERhLDApLEhhLnJvdGF0aW9uLnNldCgwLDAsMCksSGE7Si5kZXB0aE5lYXI9SGEubmVhcjtKLmRlcHRoRmFyPUhhLmZhcjtKLmdldEZyYW1lRGF0YShQKTtpZigibG9jYWwtZmxvb3IiPT09ZmEpe3ZhciBNYT1KLnN0YWdlUGFyYW1ldGVycztNYT9WLmZyb21BcnJheShNYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6Vi5tYWtlVHJhbnNsYXRpb24oMCxEYSwwKX1EYT1QLnBvc2U7TWE9bnVsbCE9PVI/UjpIYTtNYS5tYXRyaXguY29weShWKTtNYS5tYXRyaXguZGVjb21wb3NlKE1hLnBvc2l0aW9uLE1hLnF1YXRlcm5pb24sTWEuc2NhbGUpO251bGwhPT1EYS5vcmllbnRhdGlvbiYmKHBhLmZyb21BcnJheShEYS5vcmllbnRhdGlvbiksTWEucXVhdGVybmlvbi5tdWx0aXBseShwYSkpO251bGwhPT0KRGEucG9zaXRpb24mJihwYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVikscWEuZnJvbUFycmF5KERhLnBvc2l0aW9uKSxxYS5hcHBseVF1YXRlcm5pb24ocGEpLE1hLnBvc2l0aW9uLmFkZChxYSkpO01hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dWEubmVhcj1IYS5uZWFyO29hLm5lYXI9SGEubmVhcjt1YS5mYXI9SGEuZmFyO29hLmZhcj1IYS5mYXI7dWEubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShQLmxlZnRWaWV3TWF0cml4KTtvYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KFAucmlnaHRWaWV3TWF0cml4KTtXLmdldEludmVyc2UoVik7ImxvY2FsLWZsb29yIj09PWZhJiYodWEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFcpLG9hLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShXKSk7SGE9TWEucGFyZW50O251bGwhPT1IYSYmKHJhLmdldEludmVyc2UoSGEubWF0cml4V29ybGQpLHVhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShyYSksb2EubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHJhKSk7CnVhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodWEubWF0cml4V29ybGRJbnZlcnNlKTtvYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKG9hLm1hdHJpeFdvcmxkSW52ZXJzZSk7dWEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7b2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5yaWdodFByb2plY3Rpb25NYXRyaXgpO3hqKHRhLHVhLG9hKTtIYT1KLmdldExheWVycygpO0hhLmxlbmd0aCYmKEhhPUhhWzBdLHYodWEudmlld3BvcnQsSGEubGVmdEJvdW5kcyksdihvYS52aWV3cG9ydCxIYS5yaWdodEJvdW5kcykpO3IoKTtyZXR1cm4gdGF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gVn07dGhpcy5pc1ByZXNlbnRpbmc9Yzt2YXIgQ2E9bmV3IGJjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihIYSl7Q2Euc2V0QW5pbWF0aW9uTG9vcChIYSk7YygpJiZDYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2MoKSYmSi5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEFqKGEsYyl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09RiYmbnVsbCE9PUp9ZnVuY3Rpb24gZyhxYSl7Zm9yKHZhciB1YT0wO3VhPFMubGVuZ3RoO3VhKyspVlt1YV09PT1xYS5pbnB1dFNvdXJjZSYmU1t1YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpxYS50eXBlfSl9ZnVuY3Rpb24gcigpe2Euc2V0RnJhbWVidWZmZXIobnVsbCk7YS5zZXRSZW5kZXJUYXJnZXQoYS5nZXRSZW5kZXJUYXJnZXQoKSk7CnBhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdihxYSl7Sj1xYTtwYS5zZXRDb250ZXh0KEYpO3BhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24geihxYSx1YSl7bnVsbD09PXVhP3FhLm1hdHJpeFdvcmxkLmNvcHkocWEubWF0cml4KTpxYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHVhLm1hdHJpeFdvcmxkLHFhLm1hdHJpeCk7cWEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocWEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRj1udWxsLEo9bnVsbCxQPSJsb2NhbC1mbG9vciIsUj1udWxsLFM9W10sVj1bXSxXPW5ldyB2YjtXLmxheWVycy5lbmFibGUoMSk7Vy52aWV3cG9ydD1uZXcgcDt2YXIgaGE9bmV3IHZiO2hhLmxheWVycy5lbmFibGUoMik7aGEudmlld3BvcnQ9bmV3IHA7dmFyIGZhPW5ldyB2ZihbVyxoYV0pO2ZhLmxheWVycy5lbmFibGUoMSk7ZmEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihxYSl7dmFyIHVhPVNbcWFdO3ZvaWQgMD09PXVhJiYodWE9bmV3IHVlLHVhLm1hdHJpeEF1dG9VcGRhdGU9ITEsdWEudmlzaWJsZT0hMSxTW3FhXT11YSk7cmV0dXJuIHVhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHFhKXtQPXFhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gRn07dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHFhKXtGPXFhO251bGwhPT1GJiYoRi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixnKSxGLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsciksRi51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRixjKX0pLEYucmVxdWVzdFJlZmVyZW5jZVNwYWNlKFApLnRoZW4odiksClY9Ri5pbnB1dFNvdXJjZXMsRi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7Vj1GLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhWKTtmb3IodmFyIHVhPTA7dWE8Uy5sZW5ndGg7dWErKylTW3VhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1WW3VhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocWEpe2lmKGUoKSl7dmFyIHVhPXFhLnBhcmVudCxvYT1mYS5jYW1lcmFzO3ooZmEsdWEpO2Zvcih2YXIgdGE9MDt0YTxvYS5sZW5ndGg7dGErKyl6KG9hW3RhXSx1YSk7cWEubWF0cml4V29ybGQuY29weShmYS5tYXRyaXhXb3JsZCk7cWE9cWEuY2hpbGRyZW47dGE9MDtmb3IodWE9cWEubGVuZ3RoO3RhPHVhO3RhKyspcWFbdGFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt4aihmYSxXLGhhKTtyZXR1cm4gZmF9cmV0dXJuIHFhfTt0aGlzLmlzUHJlc2VudGluZz1lO3ZhciByYT1udWxsLHBhPW5ldyBiYztwYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHFhLAp1YSl7Uj11YS5nZXRWaWV3ZXJQb3NlKEopO2lmKG51bGwhPT1SKXt2YXIgb2E9Ui52aWV3cyx0YT1GLnJlbmRlclN0YXRlLmJhc2VMYXllcjthLnNldEZyYW1lYnVmZmVyKHRhLmZyYW1lYnVmZmVyKTtmb3IodmFyIEJhPTA7QmE8b2EubGVuZ3RoO0JhKyspe3ZhciBUYT1vYVtCYV0sVWE9dGEuZ2V0Vmlld3BvcnQoVGEpLENhPWZhLmNhbWVyYXNbQmFdO0NhLm1hdHJpeC5mcm9tQXJyYXkoVGEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKENhLm1hdHJpeCk7Q2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVGEucHJvamVjdGlvbk1hdHJpeCk7Q2Eudmlld3BvcnQuc2V0KFVhLngsVWEueSxVYS53aWR0aCxVYS5oZWlnaHQpOzA9PT1CYSYmZmEubWF0cml4LmNvcHkoQ2EubWF0cml4KX19Zm9yKEJhPTA7QmE8Uy5sZW5ndGg7QmErKyl7b2E9U1tCYV07aWYodGE9VltCYV0paWYodGE9dWEuZ2V0UG9zZSh0YS50YXJnZXRSYXlTcGFjZSxKKSxudWxsIT09dGEpe29hLm1hdHJpeC5mcm9tQXJyYXkodGEudHJhbnNmb3JtLm1hdHJpeCk7Cm9hLm1hdHJpeC5kZWNvbXBvc2Uob2EucG9zaXRpb24sb2Eucm90YXRpb24sb2Euc2NhbGUpO29hLnZpc2libGU9ITA7Y29udGludWV9b2EudmlzaWJsZT0hMX1yYSYmcmEocWEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHFhKXtyYT1xYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gT2goYSl7dmFyIGM7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsPT09aWI/Y2M6MX1mdW5jdGlvbiBnKCl7TGI9bmV3IGJkKFJhKTtkYz1uZXcgTWIoUmEsTGIsYSk7ZGMuaXNXZWJHTDJ8fChMYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxMYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLExiLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksTGIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksTGIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO0xiLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7Ck5jPW5ldyB3aihSYSxMYixkYyk7eWI9bmV3IFZsKFJhLExiLE5jLGRjKTt5Yi5zY2lzc29yKFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSk7eGQ9bmV3IFNrKFJhKTtlYz1uZXcgTWw7T2M9bmV3IFdsKFJhLExiLHliLGVjLGRjLE5jLHhkKTt2Zz1uZXcgT2QoUmEpO1BoPW5ldyB0ZChSYSx2Zyx4ZCk7eGU9bmV3IFZrKFBoLHhkKTtCaj1uZXcgVWsoUmEpO1BkPW5ldyBMbChqYSxMYixkYyk7d2c9bmV3IFBsO3llPW5ldyBVbDt5ZD1uZXcgc2QoamEseWIseGUsbmEpO0NqPW5ldyBzYShSYSxMYix4ZCxkYyk7RGo9bmV3IHRnKFJhLExiLHhkLGRjKTt4ZC5wcm9ncmFtcz1QZC5wcm9ncmFtcztqYS5jYXBhYmlsaXRpZXM9ZGM7amEuZXh0ZW5zaW9ucz1MYjtqYS5wcm9wZXJ0aWVzPWVjO2phLnJlbmRlckxpc3RzPXdnO2phLnN0YXRlPXliO2phLmluZm89eGR9ZnVuY3Rpb24gcihVKXtVLnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7R2E9ITB9ZnVuY3Rpb24gdigpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0dhPSExO2coKX1mdW5jdGlvbiB6KFUpe1U9VS50YXJnZXQ7VS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtFKFUpfWZ1bmN0aW9uIEUoVSl7RihVKTtlYy5yZW1vdmUoVSl9ZnVuY3Rpb24gRihVKXt2YXIgZGE9ZWMuZ2V0KFUpLnByb2dyYW07VS5wcm9ncmFtPXZvaWQgMDt2b2lkIDAhPT1kYSYmUGQucmVsZWFzZVByb2dyYW0oZGEpfWZ1bmN0aW9uIEooVSxkYSl7VS5yZW5kZXIoZnVuY3Rpb24obWEpe2phLnJlbmRlckJ1ZmZlckltbWVkaWF0ZShtYSxkYSl9KX1mdW5jdGlvbiBQKFUsZGEsbWEpe2lmKG1hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhZGMuaXNXZWJHTDImJm51bGw9PT1MYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7eWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSWE9bWEuYXR0cmlidXRlcztkYT1kYS5nZXRBdHRyaWJ1dGVzKCk7VT1VLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKHZhciBPYSBpbiBkYSl7dmFyIGFiPWRhW09hXTtpZigwPD1hYil7dmFyIFBhPUlhW09hXTtpZih2b2lkIDAhPT1QYSl7dmFyIGZiPVBhLm5vcm1hbGl6ZWQsQ2I9UGEuaXRlbVNpemUsb2I9dmcuZ2V0KFBhKTtpZih2b2lkIDAhPT1vYil7dmFyICRhPW9iLmJ1ZmZlcixQYz1vYi50eXBlO29iPW9iLmJ5dGVzUGVyRWxlbWVudDtpZihQYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXt2YXIgeGM9UGEuZGF0YSx6ZT14Yy5zdHJpZGU7UGE9UGEub2Zmc2V0O3hjJiZ4Yy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPyh5Yi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKGFiLHhjLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW1hLm1heEluc3RhbmNlZENvdW50JiYobWEubWF4SW5zdGFuY2VkQ291bnQ9CnhjLm1lc2hQZXJBdHRyaWJ1dGUqeGMuY291bnQpKTp5Yi5lbmFibGVBdHRyaWJ1dGUoYWIpO1JhLmJpbmRCdWZmZXIoMzQ5NjIsJGEpO1JhLnZlcnRleEF0dHJpYlBvaW50ZXIoYWIsQ2IsUGMsZmIsemUqb2IsUGEqb2IpfWVsc2UgUGEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/KHliLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoYWIsUGEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bWEubWF4SW5zdGFuY2VkQ291bnQmJihtYS5tYXhJbnN0YW5jZWRDb3VudD1QYS5tZXNoUGVyQXR0cmlidXRlKlBhLmNvdW50KSk6eWIuZW5hYmxlQXR0cmlidXRlKGFiKSxSYS5iaW5kQnVmZmVyKDM0OTYyLCRhKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGFiLENiLFBjLGZiLDAsMCl9fWVsc2UgaWYodm9pZCAwIT09VSYmKGZiPVVbT2FdLHZvaWQgMCE9PWZiKSlzd2l0Y2goZmIubGVuZ3RoKXtjYXNlIDI6UmEudmVydGV4QXR0cmliMmZ2KGFiLGZiKTticmVhaztjYXNlIDM6UmEudmVydGV4QXR0cmliM2Z2KGFiLApmYik7YnJlYWs7Y2FzZSA0OlJhLnZlcnRleEF0dHJpYjRmdihhYixmYik7YnJlYWs7ZGVmYXVsdDpSYS52ZXJ0ZXhBdHRyaWIxZnYoYWIsZmIpfX19eWIuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKX19ZnVuY3Rpb24gUihVLGRhLG1hLElhKXtpZighMSE9PVUudmlzaWJsZSl7aWYoVS5sYXllcnMudGVzdChkYS5sYXllcnMpKWlmKFUuaXNHcm91cCltYT1VLnJlbmRlck9yZGVyO2Vsc2UgaWYoVS5pc0xPRCkhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGUoZGEpO2Vsc2UgaWYoVS5pc0xpZ2h0KWNiLnB1c2hMaWdodChVKSxVLmNhc3RTaGFkb3cmJmNiLnB1c2hTaGFkb3coVSk7ZWxzZSBpZihVLmlzU3ByaXRlKXtpZighVS5mcnVzdHVtQ3VsbGVkfHxRaC5pbnRlcnNlY3RzU3ByaXRlKFUpKXtJYSYmemQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFUubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh3Zik7dmFyIE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsO2FiLnZpc2libGUmJk5hLnB1c2goVSwKT2EsYWIsbWEsemQueixudWxsKX19ZWxzZSBpZihVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KUlhJiZ6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KHdmKSxOYS5wdXNoKFUsbnVsbCxVLm1hdGVyaWFsLG1hLHpkLnosbnVsbCk7ZWxzZSBpZihVLmlzTWVzaHx8VS5pc0xpbmV8fFUuaXNQb2ludHMpaWYoVS5pc1NraW5uZWRNZXNoJiZVLnNrZWxldG9uLnVwZGF0ZSgpLCFVLmZydXN0dW1DdWxsZWR8fFFoLmludGVyc2VjdHNPYmplY3QoVSkpaWYoSWEmJnpkLnNldEZyb21NYXRyaXhQb3NpdGlvbihVLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQod2YpLE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsLEFycmF5LmlzQXJyYXkoYWIpKWZvcih2YXIgUGE9T2EuZ3JvdXBzLGZiPTAsQ2I9UGEubGVuZ3RoO2ZiPENiO2ZiKyspe3ZhciBvYj1QYVtmYl0sJGE9YWJbb2IubWF0ZXJpYWxJbmRleF07JGEmJiRhLnZpc2libGUmJk5hLnB1c2goVSwKT2EsJGEsbWEsemQueixvYil9ZWxzZSBhYi52aXNpYmxlJiZOYS5wdXNoKFUsT2EsYWIsbWEsemQueixudWxsKTtVPVUuY2hpbGRyZW47ZmI9MDtmb3IoQ2I9VS5sZW5ndGg7ZmI8Q2I7ZmIrKylSKFVbZmJdLGRhLG1hLElhKX19ZnVuY3Rpb24gUyhVLGRhLG1hLElhKXtmb3IodmFyIE9hPTAsYWI9VS5sZW5ndGg7T2E8YWI7T2ErKyl7dmFyIFBhPVVbT2FdLGZiPVBhLm9iamVjdCxDYj1QYS5nZW9tZXRyeSxvYj12b2lkIDA9PT1JYT9QYS5tYXRlcmlhbDpJYTtQYT1QYS5ncm91cDtpZihtYS5pc0FycmF5Q2FtZXJhKXtzYj1tYTtmb3IodmFyICRhPW1hLmNhbWVyYXMsUGM9MCx4Yz0kYS5sZW5ndGg7UGM8eGM7UGMrKyl7dmFyIHplPSRhW1BjXTtmYi5sYXllcnMudGVzdCh6ZS5sYXllcnMpJiYoeWIudmlld3BvcnQoS2IuY29weSh6ZS52aWV3cG9ydCkpLGNiLnNldHVwTGlnaHRzKHplKSxWKGZiLGRhLHplLENiLG9iLFBhKSl9fWVsc2Ugc2I9bnVsbCxWKGZiLGRhLG1hLENiLG9iLFBhKX19CmZ1bmN0aW9uIFYoVSxkYSxtYSxJYSxPYSxhYil7VS5vbkJlZm9yZVJlbmRlcihqYSxkYSxtYSxJYSxPYSxhYik7Y2I9eWUuZ2V0KGRhLHNifHxtYSk7VS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhtYS5tYXRyaXhXb3JsZEludmVyc2UsVS5tYXRyaXhXb3JsZCk7VS5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFUubW9kZWxWaWV3TWF0cml4KTtVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0Pyh5Yi5zZXRNYXRlcmlhbChPYSksSWE9aGEobWEsZGEuZm9nLE9hLFUpLGViPWM9bnVsbCxtYj0hMSxKKFUsSWEpKTpqYS5yZW5kZXJCdWZmZXJEaXJlY3QobWEsZGEuZm9nLElhLE9hLFUsYWIpO2NiPXllLmdldChkYSxzYnx8bWEpfWZ1bmN0aW9uIFcoVSxkYSxtYSl7dmFyIElhPWVjLmdldChVKSxPYT1jYi5zdGF0ZS5saWdodHMsYWI9T2Euc3RhdGUudmVyc2lvbjttYT1QZC5nZXRQYXJhbWV0ZXJzKFUsT2Euc3RhdGUsY2Iuc3RhdGUuc2hhZG93c0FycmF5LGRhLHljLm51bVBsYW5lcywKeWMubnVtSW50ZXJzZWN0aW9uLG1hKTt2YXIgUGE9UGQuZ2V0UHJvZ3JhbUNvZGUoVSxtYSksZmI9SWEucHJvZ3JhbSxDYj0hMDtpZih2b2lkIDA9PT1mYilVLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHopO2Vsc2UgaWYoZmIuY29kZSE9PVBhKUYoVSk7ZWxzZXtpZihJYS5saWdodHNTdGF0ZVZlcnNpb24hPT1hYilJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7ZWxzZSBpZih2b2lkIDAhPT1tYS5zaGFkZXJJRClyZXR1cm47Q2I9ITF9Q2ImJihtYS5zaGFkZXJJRD8oUGE9TWNbbWEuc2hhZGVySURdLElhLnNoYWRlcj17bmFtZTpVLnR5cGUsdW5pZm9ybXM6dWIoUGEudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpQYS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6UGEuZnJhZ21lbnRTaGFkZXJ9KTpJYS5zaGFkZXI9e25hbWU6VS50eXBlLHVuaWZvcm1zOlUudW5pZm9ybXMsdmVydGV4U2hhZGVyOlUudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlUuZnJhZ21lbnRTaGFkZXJ9LApQYT1QZC5nZXRQcm9ncmFtQ29kZShVLG1hKSxmYj1QZC5hY3F1aXJlUHJvZ3JhbShVLElhLnNoYWRlcixtYSxQYSksSWEucHJvZ3JhbT1mYixVLnByb2dyYW09ZmIpO21hPWZiLmdldEF0dHJpYnV0ZXMoKTtpZihVLm1vcnBoVGFyZ2V0cylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHM9MDtQYTxqYS5tYXhNb3JwaFRhcmdldHM7UGErKykwPD1tYVsibW9ycGhUYXJnZXQiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMrKztpZihVLm1vcnBoTm9ybWFscylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHM9MDtQYTxqYS5tYXhNb3JwaE5vcm1hbHM7UGErKykwPD1tYVsibW9ycGhOb3JtYWwiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMrKzttYT1JYS5zaGFkZXIudW5pZm9ybXM7aWYoIVUuaXNTaGFkZXJNYXRlcmlhbCYmIVUuaXNSYXdTaGFkZXJNYXRlcmlhbHx8ITA9PT1VLmNsaXBwaW5nKUlhLm51bUNsaXBwaW5nUGxhbmVzPXljLm51bVBsYW5lcywKSWEubnVtSW50ZXJzZWN0aW9uPXljLm51bUludGVyc2VjdGlvbixtYS5jbGlwcGluZ1BsYW5lcz15Yy51bmlmb3JtO0lhLmZvZz1kYTtJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7VS5saWdodHMmJihtYS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1PYS5zdGF0ZS5hbWJpZW50LG1hLmxpZ2h0UHJvYmUudmFsdWU9T2Euc3RhdGUucHJvYmUsbWEuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWwsbWEuc3BvdExpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5zcG90LG1hLnJlY3RBcmVhTGlnaHRzLnZhbHVlPU9hLnN0YXRlLnJlY3RBcmVhLG1hLnBvaW50TGlnaHRzLnZhbHVlPU9hLnN0YXRlLnBvaW50LG1hLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9T2Euc3RhdGUuaGVtaSxtYS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxtYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCwKbWEuc3BvdFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5zcG90U2hhZG93TWFwLG1hLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUuc3BvdFNoYWRvd01hdHJpeCxtYS5wb2ludFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hcCxtYS5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7VT1JYS5wcm9ncmFtLmdldFVuaWZvcm1zKCk7VT11ZC5zZXFXaXRoVmFsdWUoVS5zZXEsbWEpO0lhLnVuaWZvcm1zTGlzdD1VfWZ1bmN0aW9uIGhhKFUsZGEsbWEsSWEpe09jLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIE9hPWVjLmdldChtYSksYWI9Y2Iuc3RhdGUubGlnaHRzO3hnJiYoUmh8fFUhPT1wYikmJnljLnNldFN0YXRlKG1hLmNsaXBwaW5nUGxhbmVzLG1hLmNsaXBJbnRlcnNlY3Rpb24sbWEuY2xpcFNoYWRvd3MsVSxPYSxVPT09cGImJm1hLmlkPT09UWEpOyExPT09bWEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1PYS5wcm9ncmFtPwptYS5uZWVkc1VwZGF0ZT0hMDptYS5mb2cmJk9hLmZvZyE9PWRhP21hLm5lZWRzVXBkYXRlPSEwOm1hLmxpZ2h0cyYmT2EubGlnaHRzU3RhdGVWZXJzaW9uIT09YWIuc3RhdGUudmVyc2lvbj9tYS5uZWVkc1VwZGF0ZT0hMDp2b2lkIDA9PT1PYS5udW1DbGlwcGluZ1BsYW5lc3x8T2EubnVtQ2xpcHBpbmdQbGFuZXM9PT15Yy5udW1QbGFuZXMmJk9hLm51bUludGVyc2VjdGlvbj09PXljLm51bUludGVyc2VjdGlvbnx8KG1hLm5lZWRzVXBkYXRlPSEwKSk7bWEubmVlZHNVcGRhdGUmJihXKG1hLGRhLElhKSxtYS5uZWVkc1VwZGF0ZT0hMSk7dmFyIFBhPSExLGZiPWFiPSExLENiPU9hLnByb2dyYW0sb2I9Q2IuZ2V0VW5pZm9ybXMoKSwkYT1PYS5zaGFkZXIudW5pZm9ybXM7eWIudXNlUHJvZ3JhbShDYi5wcm9ncmFtKSYmKGZiPWFiPVBhPSEwKTttYS5pZCE9PVFhJiYoUWE9bWEuaWQsYWI9ITApO2lmKFBhfHxwYiE9PVUpe29iLnNldFZhbHVlKFJhLCJwcm9qZWN0aW9uTWF0cml4IixVLnByb2plY3Rpb25NYXRyaXgpOwpkYy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZvYi5zZXRWYWx1ZShSYSwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2coVS5mYXIrMSkvTWF0aC5MTjIpKTtwYiE9PVUmJihwYj1VLGZiPWFiPSEwKTtpZihtYS5pc1NoYWRlck1hdGVyaWFsfHxtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxtYS5lbnZNYXApUGE9b2IubWFwLmNhbWVyYVBvc2l0aW9uLHZvaWQgMCE9PVBhJiZQYS5zZXRWYWx1ZShSYSx6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkpOyhtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG1hLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG1hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fG1hLmlzU2hhZGVyTWF0ZXJpYWx8fG1hLnNraW5uaW5nKSYmb2Iuc2V0VmFsdWUoUmEsInZpZXdNYXRyaXgiLFUubWF0cml4V29ybGRJbnZlcnNlKX1pZihtYS5za2lubmluZyYmKG9iLnNldE9wdGlvbmFsKFJhLApJYSwiYmluZE1hdHJpeCIpLG9iLnNldE9wdGlvbmFsKFJhLElhLCJiaW5kTWF0cml4SW52ZXJzZSIpLFU9SWEuc2tlbGV0b24pKWlmKFBhPVUuYm9uZXMsZGMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyl7aWYodm9pZCAwPT09VS5ib25lVGV4dHVyZSl7UGE9TWF0aC5zcXJ0KDQqUGEubGVuZ3RoKTtQYT1oYi5jZWlsUG93ZXJPZlR3byhQYSk7UGE9TWF0aC5tYXgoUGEsNCk7dmFyIFBjPW5ldyBGbG9hdDMyQXJyYXkoUGEqUGEqNCk7UGMuc2V0KFUuYm9uZU1hdHJpY2VzKTt2YXIgeGM9bmV3IEFiKFBjLFBhLFBhLDEwMjMsMTAxNSk7eGMubmVlZHNVcGRhdGU9ITA7VS5ib25lTWF0cmljZXM9UGM7VS5ib25lVGV4dHVyZT14YztVLmJvbmVUZXh0dXJlU2l6ZT1QYX1vYi5zZXRWYWx1ZShSYSwiYm9uZVRleHR1cmUiLFUuYm9uZVRleHR1cmUsT2MpO29iLnNldFZhbHVlKFJhLCJib25lVGV4dHVyZVNpemUiLFUuYm9uZVRleHR1cmVTaXplKX1lbHNlIG9iLnNldE9wdGlvbmFsKFJhLFUsImJvbmVNYXRyaWNlcyIpOwphYiYmKG9iLnNldFZhbHVlKFJhLCJ0b25lTWFwcGluZ0V4cG9zdXJlIixqYS50b25lTWFwcGluZ0V4cG9zdXJlKSxvYi5zZXRWYWx1ZShSYSwidG9uZU1hcHBpbmdXaGl0ZVBvaW50IixqYS50b25lTWFwcGluZ1doaXRlUG9pbnQpLG1hLmxpZ2h0cyYmdGIoJGEsZmIpLGRhJiZtYS5mb2cmJm9hKCRhLGRhKSxtYS5pc01lc2hCYXNpY01hdGVyaWFsP2ZhKCRhLG1hKTptYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGZhKCRhLG1hKSx0YSgkYSxtYSkpOm1hLmlzTWVzaFBob25nTWF0ZXJpYWw/KGZhKCRhLG1hKSxtYS5pc01lc2hUb29uTWF0ZXJpYWw/VGEoJGEsbWEpOkJhKCRhLG1hKSk6bWEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oZmEoJGEsbWEpLG1hLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/Q2EoJGEsbWEpOlVhKCRhLG1hKSk6bWEuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KGZhKCRhLG1hKSxIYSgkYSxtYSkpOm1hLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGZhKCRhLG1hKSxEYSgkYSwKbWEpKTptYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhmYSgkYSxtYSksTWEoJGEsbWEpKTptYS5pc01lc2hOb3JtYWxNYXRlcmlhbD8oZmEoJGEsbWEpLGRiKCRhLG1hKSk6bWEuaXNMaW5lQmFzaWNNYXRlcmlhbD8ocmEoJGEsbWEpLG1hLmlzTGluZURhc2hlZE1hdGVyaWFsJiZwYSgkYSxtYSkpOm1hLmlzUG9pbnRzTWF0ZXJpYWw/cWEoJGEsbWEpOm1hLmlzU3ByaXRlTWF0ZXJpYWw/dWEoJGEsbWEpOm1hLmlzU2hhZG93TWF0ZXJpYWwmJigkYS5jb2xvci52YWx1ZS5jb3B5KG1hLmNvbG9yKSwkYS5vcGFjaXR5LnZhbHVlPW1hLm9wYWNpdHkpLHZvaWQgMCE9PSRhLmx0Y18xJiYoJGEubHRjXzEudmFsdWU9V2EuTFRDXzEpLHZvaWQgMCE9PSRhLmx0Y18yJiYoJGEubHRjXzIudmFsdWU9V2EuTFRDXzIpLHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsJGEsT2MpKTttYS5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW1hLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsCiRhLE9jKSxtYS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpO21hLmlzU3ByaXRlTWF0ZXJpYWwmJm9iLnNldFZhbHVlKFJhLCJjZW50ZXIiLElhLmNlbnRlcik7b2Iuc2V0VmFsdWUoUmEsIm1vZGVsVmlld01hdHJpeCIsSWEubW9kZWxWaWV3TWF0cml4KTtvYi5zZXRWYWx1ZShSYSwibm9ybWFsTWF0cml4IixJYS5ub3JtYWxNYXRyaXgpO29iLnNldFZhbHVlKFJhLCJtb2RlbE1hdHJpeCIsSWEubWF0cml4V29ybGQpO3JldHVybiBDYn1mdW5jdGlvbiBmYShVLGRhKXtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eTtkYS5jb2xvciYmVS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmVtaXNzaXZlJiZVLmVtaXNzaXZlLnZhbHVlLmNvcHkoZGEuZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKGRhLmVtaXNzaXZlSW50ZW5zaXR5KTtkYS5tYXAmJihVLm1hcC52YWx1ZT1kYS5tYXApO2RhLmFscGhhTWFwJiYoVS5hbHBoYU1hcC52YWx1ZT1kYS5hbHBoYU1hcCk7ZGEuc3BlY3VsYXJNYXAmJgooVS5zcGVjdWxhck1hcC52YWx1ZT1kYS5zcGVjdWxhck1hcCk7ZGEuZW52TWFwJiYoVS5lbnZNYXAudmFsdWU9ZGEuZW52TWFwLFUuZmxpcEVudk1hcC52YWx1ZT1kYS5lbnZNYXAuaXNDdWJlVGV4dHVyZT8tMToxLFUucmVmbGVjdGl2aXR5LnZhbHVlPWRhLnJlZmxlY3Rpdml0eSxVLnJlZnJhY3Rpb25SYXRpby52YWx1ZT1kYS5yZWZyYWN0aW9uUmF0aW8sVS5tYXhNaXBMZXZlbC52YWx1ZT1lYy5nZXQoZGEuZW52TWFwKS5fX21heE1pcExldmVsKTtkYS5saWdodE1hcCYmKFUubGlnaHRNYXAudmFsdWU9ZGEubGlnaHRNYXAsVS5saWdodE1hcEludGVuc2l0eS52YWx1ZT1kYS5saWdodE1hcEludGVuc2l0eSk7ZGEuYW9NYXAmJihVLmFvTWFwLnZhbHVlPWRhLmFvTWFwLFUuYW9NYXBJbnRlbnNpdHkudmFsdWU9ZGEuYW9NYXBJbnRlbnNpdHkpO2lmKGRhLm1hcCl2YXIgbWE9ZGEubWFwO2Vsc2UgZGEuc3BlY3VsYXJNYXA/bWE9ZGEuc3BlY3VsYXJNYXA6ZGEuZGlzcGxhY2VtZW50TWFwPwptYT1kYS5kaXNwbGFjZW1lbnRNYXA6ZGEubm9ybWFsTWFwP21hPWRhLm5vcm1hbE1hcDpkYS5idW1wTWFwP21hPWRhLmJ1bXBNYXA6ZGEucm91Z2huZXNzTWFwP21hPWRhLnJvdWdobmVzc01hcDpkYS5tZXRhbG5lc3NNYXA/bWE9ZGEubWV0YWxuZXNzTWFwOmRhLmFscGhhTWFwP21hPWRhLmFscGhhTWFwOmRhLmVtaXNzaXZlTWFwJiYobWE9ZGEuZW1pc3NpdmVNYXApO3ZvaWQgMCE9PW1hJiYobWEuaXNXZWJHTFJlbmRlclRhcmdldCYmKG1hPW1hLnRleHR1cmUpLCEwPT09bWEubWF0cml4QXV0b1VwZGF0ZSYmbWEudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG1hLm1hdHJpeCkpfWZ1bmN0aW9uIHJhKFUsZGEpe1UuZGlmZnVzZS52YWx1ZS5jb3B5KGRhLmNvbG9yKTtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eX1mdW5jdGlvbiBwYShVLGRhKXtVLmRhc2hTaXplLnZhbHVlPWRhLmRhc2hTaXplO1UudG90YWxTaXplLnZhbHVlPWRhLmRhc2hTaXplK2RhLmdhcFNpemU7ClUuc2NhbGUudmFsdWU9ZGEuc2NhbGV9ZnVuY3Rpb24gcWEoVSxkYSl7VS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO1Uub3BhY2l0eS52YWx1ZT1kYS5vcGFjaXR5O1Uuc2l6ZS52YWx1ZT1kYS5zaXplKmNjO1Uuc2NhbGUudmFsdWU9LjUqemM7VS5tYXAudmFsdWU9ZGEubWFwO251bGwhPT1kYS5tYXAmJighMD09PWRhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZkYS5tYXAudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGRhLm1hcC5tYXRyaXgpKX1mdW5jdGlvbiB1YShVLGRhKXtVLmRpZmZ1c2UudmFsdWUuY29weShkYS5jb2xvcik7VS5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHk7VS5yb3RhdGlvbi52YWx1ZT1kYS5yb3RhdGlvbjtVLm1hcC52YWx1ZT1kYS5tYXA7bnVsbCE9PWRhLm1hcCYmKCEwPT09ZGEubWFwLm1hdHJpeEF1dG9VcGRhdGUmJmRhLm1hcC51cGRhdGVNYXRyaXgoKSxVLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoZGEubWFwLm1hdHJpeCkpfQpmdW5jdGlvbiBvYShVLGRhKXtVLmZvZ0NvbG9yLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmlzRm9nPyhVLmZvZ05lYXIudmFsdWU9ZGEubmVhcixVLmZvZ0Zhci52YWx1ZT1kYS5mYXIpOmRhLmlzRm9nRXhwMiYmKFUuZm9nRGVuc2l0eS52YWx1ZT1kYS5kZW5zaXR5KX1mdW5jdGlvbiB0YShVLGRhKXtkYS5lbWlzc2l2ZU1hcCYmKFUuZW1pc3NpdmVNYXAudmFsdWU9ZGEuZW1pc3NpdmVNYXApfWZ1bmN0aW9uIEJhKFUsZGEpe1Uuc3BlY3VsYXIudmFsdWUuY29weShkYS5zcGVjdWxhcik7VS5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZGEuc2hpbmluZXNzLDFFLTQpO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPQpkYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwxPT09ZGEuc2lkZSYmVS5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZGEuZGlzcGxhY2VtZW50TWFwJiYoVS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZGEuZGlzcGxhY2VtZW50TWFwLFUuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZGEuZGlzcGxhY2VtZW50U2NhbGUsVS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIFRhKFUsZGEpe0JhKFUsZGEpO2RhLmdyYWRpZW50TWFwJiYoVS5ncmFkaWVudE1hcC52YWx1ZT1kYS5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gVWEoVSxkYSl7VS5yb3VnaG5lc3MudmFsdWU9ZGEucm91Z2huZXNzO1UubWV0YWxuZXNzLnZhbHVlPWRhLm1ldGFsbmVzcztkYS5yb3VnaG5lc3NNYXAmJihVLnJvdWdobmVzc01hcC52YWx1ZT1kYS5yb3VnaG5lc3NNYXApO2RhLm1ldGFsbmVzc01hcCYmKFUubWV0YWxuZXNzTWFwLnZhbHVlPQpkYS5tZXRhbG5lc3NNYXApO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPWRhLm5vcm1hbE1hcCxVLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZGEubm9ybWFsU2NhbGUpLDE9PT1kYS5zaWRlJiZVLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyk7ZGEuZW52TWFwJiYoVS5lbnZNYXBJbnRlbnNpdHkudmFsdWU9CmRhLmVudk1hcEludGVuc2l0eSl9ZnVuY3Rpb24gQ2EoVSxkYSl7VWEoVSxkYSk7VS5yZWZsZWN0aXZpdHkudmFsdWU9ZGEucmVmbGVjdGl2aXR5O1UuY2xlYXJjb2F0LnZhbHVlPWRhLmNsZWFyY29hdDtVLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1kYS5jbGVhcmNvYXRSb3VnaG5lc3M7ZGEuc2hlZW4mJlUuc2hlZW4udmFsdWUuY29weShkYS5zaGVlbik7ZGEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVS5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSxVLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1kYS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWRhLnNpZGUmJlUuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1UudHJhbnNwYXJlbmN5LnZhbHVlPWRhLnRyYW5zcGFyZW5jeX1mdW5jdGlvbiBIYShVLGRhKXtkYS5tYXRjYXAmJihVLm1hdGNhcC52YWx1ZT1kYS5tYXRjYXApO2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9CmRhLmJ1bXBNYXAsVS5idW1wU2NhbGUudmFsdWU9ZGEuYnVtcFNjYWxlLDE9PT1kYS5zaWRlJiYoVS5idW1wU2NhbGUudmFsdWUqPS0xKSk7ZGEubm9ybWFsTWFwJiYoVS5ub3JtYWxNYXAudmFsdWU9ZGEubm9ybWFsTWFwLFUubm9ybWFsU2NhbGUudmFsdWUuY29weShkYS5ub3JtYWxTY2FsZSksMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBEYShVLGRhKXtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9CmRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIE1hKFUsZGEpe2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKTtVLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZGEucmVmZXJlbmNlUG9zaXRpb24pO1UubmVhckRpc3RhbmNlLnZhbHVlPWRhLm5lYXJEaXN0YW5jZTtVLmZhckRpc3RhbmNlLnZhbHVlPWRhLmZhckRpc3RhbmNlfWZ1bmN0aW9uIGRiKFUsZGEpe2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxVLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihVLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihVLm5vcm1hbE1hcC52YWx1ZT1kYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwKMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB0YihVLGRhKXtVLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPWRhO1UubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1kYTtVLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWRhfWE9YXx8e307dmFyIEthPXZvaWQgMCE9PWEuY2FudmFzP2EuY2FudmFzOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJjYW52YXMiKSxiYj12b2lkIDAhPT1hLmNvbnRleHQ/YS5jb250ZXh0Om51bGwsamI9dm9pZCAwIT09YS5hbHBoYT9hLmFscGhhOiExLEViPXZvaWQgMCE9PWEuZGVwdGg/YS5kZXB0aDohMCx4Yj12b2lkIDAhPT1hLnN0ZW5jaWw/YS5zdGVuY2lsOiEwLGlhPXZvaWQgMCE9PWEuYW50aWFsaWFzP2EuYW50aWFsaWFzOiExLG5hPXZvaWQgMCE9PWEucHJlbXVsdGlwbGllZEFscGhhP2EucHJlbXVsdGlwbGllZEFscGhhOiEwLHphPXZvaWQgMCE9PWEucHJlc2VydmVEcmF3aW5nQnVmZmVyP2EucHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLEphPXZvaWQgMCE9PWEucG93ZXJQcmVmZXJlbmNlP2EucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IixZYT12b2lkIDAhPT1hLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/YS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLE5hPW51bGwsY2I9bnVsbDt0aGlzLmRvbUVsZW1lbnQ9S2E7dGhpcy5kZWJ1Zz17Y2hlY2tTaGFkZXJFcnJvcnM6ITB9Owp0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9Mjt0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPXRoaXMuZ2FtbWFPdXRwdXQ9dGhpcy5nYW1tYUlucHV0PSExO3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50PXRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT10aGlzLnRvbmVNYXBwaW5nPTE7dGhpcy5tYXhNb3JwaFRhcmdldHM9ODt0aGlzLm1heE1vcnBoTm9ybWFscz00O3ZhciBqYT10aGlzLEdhPSExLExhPW51bGwsbmI9MCxWYT0wLGliPW51bGwsa2I9bnVsbCxRYT0tMTt2YXIgZWI9Yz1udWxsO3ZhciBtYj0hMTt2YXIgcGI9bnVsbCxzYj1udWxsLEtiPW5ldyBwLFNiPW5ldyBwLG5jPW51bGwsUWM9S2Eud2lkdGgsemM9S2EuaGVpZ2h0LApjYz0xLHdlPW5ldyBwKDAsMCxRYyx6YyksdmU9bmV3IHAoMCwwLFFjLHpjKSxTaD0hMSxRaD1uZXcgaWMseWM9bmV3IHdjLHhnPSExLFJoPSExLHdmPW5ldyBxLHpkPW5ldyBrO3RyeXtqYj17YWxwaGE6amIsZGVwdGg6RWIsc3RlbmNpbDp4YixhbnRpYWxpYXM6aWEscHJlbXVsdGlwbGllZEFscGhhOm5hLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp6YSxwb3dlclByZWZlcmVuY2U6SmEsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDpZYSx4ckNvbXBhdGlibGU6ITB9O0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt2YXIgUmE9YmJ8fEthLmdldENvbnRleHQoIndlYmdsIixqYil8fEthLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsamIpO2lmKG51bGw9PT1SYSl7aWYobnVsbCE9PUthLmdldENvbnRleHQoIndlYmdsIikpdGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7CnRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1SYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihSYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSxyYW5nZU1heDoxLHByZWNpc2lvbjoxfX0pfWNhdGNoKFUpe3Rocm93IGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrVS5tZXNzYWdlKSxVO312YXIgTGIsZGMseWIseGQsZWMsT2MsdmcsUGgseGUsUGQsd2cseWUseWQsQmosQ2osRGosTmM7ZygpO3ZhciBkZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJiJ4ciJpbiBuYXZpZ2F0b3ImJiJzdXBwb3J0c1Nlc3Npb24iaW4gbmF2aWdhdG9yLnhyP25ldyBBaihqYSxSYSk6bmV3IE5oKGphKTt0aGlzLnZyPWRkO3ZhciBFaj1uZXcgdmooamEseGUsZGMubWF4VGV4dHVyZVNpemUpO3RoaXMuc2hhZG93TWFwPUVqO3RoaXMuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBSYX07CnRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gUmEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFU9TGIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtVJiZVLmxvc2VDb250ZXh0KCl9O3RoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe3ZhciBVPUxiLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7VSYmVS5yZXN0b3JlQ29udGV4dCgpfTt0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gY2N9O3RoaXMuc2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3ZhciBVPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3ZvaWQgMCE9PVUmJihjYz1VLHRoaXMuc2V0U2l6ZShRYyx6YywhMSkpfTt0aGlzLmdldFNpemU9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksClU9bmV3IGYpO3JldHVybiBVLnNldChRYyx6Yyl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihVLGRhLG1hKXtkZC5pc1ByZXNlbnRpbmcoKT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOihRYz1VLHpjPWRhLEthLndpZHRoPU1hdGguZmxvb3IoVSpjYyksS2EuaGVpZ2h0PU1hdGguZmxvb3IoZGEqY2MpLCExIT09bWEmJihLYS5zdHlsZS53aWR0aD1VKyJweCIsS2Euc3R5bGUuaGVpZ2h0PWRhKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVSxkYSkpfTt0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUpe3ZvaWQgMD09PVUmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRkcmF3aW5nQnVmZmVyU2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBmKTtyZXR1cm4gVS5zZXQoUWMqY2MsemMqY2MpLmZsb29yKCl9Owp0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUsZGEsbWEpe1FjPVU7emM9ZGE7Y2M9bWE7S2Eud2lkdGg9TWF0aC5mbG9vcihVKm1hKTtLYS5oZWlnaHQ9TWF0aC5mbG9vcihkYSptYSk7dGhpcy5zZXRWaWV3cG9ydChVLGRhKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBwKTtyZXR1cm4gVS5jb3B5KEtiKX07dGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbihVKXtyZXR1cm4gVS5jb3B5KHdlKX07dGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbihVLGRhKXsoMCkuaXNWZWN0b3I0P3dlLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6d2Uuc2V0KDAsMCxVLGRhKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9Owp0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24oVSl7cmV0dXJuIFUuY29weSh2ZSl9O3RoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbihVLGRhLG1hLElhKXtVLmlzVmVjdG9yND92ZS5zZXQoVS54LFUueSxVLnosVS53KTp2ZS5zZXQoVSxkYSxtYSxJYSk7eWIuc2Npc3NvcihTYi5jb3B5KHZlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9O3RoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gU2h9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVSl7eWIuc2V0U2Npc3NvclRlc3QoU2g9VSl9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiB5ZC5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3lkLnNldENsZWFyQ29sb3IuYXBwbHkoeWQsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIHlkLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7eWQuc2V0Q2xlYXJBbHBoYS5hcHBseSh5ZCwKYXJndW1lbnRzKX07dGhpcy5jbGVhcj1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9MDtpZih2b2lkIDA9PT1VfHxVKUlhfD0xNjM4NDtpZih2b2lkIDA9PT1kYXx8ZGEpSWF8PTI1NjtpZih2b2lkIDA9PT1tYXx8bWEpSWF8PTEwMjQ7UmEuY2xlYXIoSWEpfTt0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt3Zy5kaXNwb3NlKCk7eWUuZGlzcG9zZSgpO2VjLmRpc3Bvc2UoKTt4ZS5kaXNwb3NlKCk7ZGQuZGlzcG9zZSgpO3lnLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9CmZ1bmN0aW9uKFUsZGEpe3liLmluaXRBdHRyaWJ1dGVzKCk7dmFyIG1hPWVjLmdldChVKTtVLmhhc1Bvc2l0aW9ucyYmIW1hLnBvc2l0aW9uJiYobWEucG9zaXRpb249UmEuY3JlYXRlQnVmZmVyKCkpO1UuaGFzTm9ybWFscyYmIW1hLm5vcm1hbCYmKG1hLm5vcm1hbD1SYS5jcmVhdGVCdWZmZXIoKSk7VS5oYXNVdnMmJiFtYS51diYmKG1hLnV2PVJhLmNyZWF0ZUJ1ZmZlcigpKTtVLmhhc0NvbG9ycyYmIW1hLmNvbG9yJiYobWEuY29sb3I9UmEuY3JlYXRlQnVmZmVyKCkpO2RhPWRhLmdldEF0dHJpYnV0ZXMoKTtVLmhhc1Bvc2l0aW9ucyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEucG9zaXRpb24pLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5wb3NpdGlvbkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEucG9zaXRpb24pLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEucG9zaXRpb24sMyw1MTI2LCExLDAsMCkpO1UuaGFzTm9ybWFscyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEubm9ybWFsKSwKUmEuYnVmZmVyRGF0YSgzNDk2MixVLm5vcm1hbEFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEubm9ybWFsKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLm5vcm1hbCwzLDUxMjYsITEsMCwwKSk7VS5oYXNVdnMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLG1hLnV2KSxSYS5idWZmZXJEYXRhKDM0OTYyLFUudXZBcnJheSwzNTA0OCkseWIuZW5hYmxlQXR0cmlidXRlKGRhLnV2KSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLnV2LDIsNTEyNiwhMSwwLDApKTtVLmhhc0NvbG9ycyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEuY29sb3IpLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5jb2xvckFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEuY29sb3IpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEuY29sb3IsMyw1MTI2LCExLDAsMCkpO3liLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7UmEuZHJhd0FycmF5cyg0LDAsVS5jb3VudCk7VS5jb3VudD0wfTt0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD0KZnVuY3Rpb24oVSxkYSxtYSxJYSxPYSxhYil7eWIuc2V0TWF0ZXJpYWwoSWEsT2EuaXNNZXNoJiYwPk9hLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkpO3ZhciBQYT1oYShVLGRhLElhLE9hKSxmYj0hMTtpZihjIT09bWEuaWR8fGViIT09UGEuaWR8fG1iIT09KCEwPT09SWEud2lyZWZyYW1lKSljPW1hLmlkLGViPVBhLmlkLG1iPSEwPT09SWEud2lyZWZyYW1lLGZiPSEwO09hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKEJqLnVwZGF0ZShPYSxtYSxJYSxQYSksZmI9ITApO3ZhciBDYj1tYS5pbmRleCxvYj1tYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2RhPTE7ITA9PT1JYS53aXJlZnJhbWUmJihDYj1QaC5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobWEpLGRhPTIpO1U9Q2o7aWYobnVsbCE9PUNiKXt2YXIgJGE9dmcuZ2V0KENiKTtVPURqO1Uuc2V0SW5kZXgoJGEpfWZiJiYoUChJYSxQYSxtYSksbnVsbCE9PUNiJiZSYS5iaW5kQnVmZmVyKDM0OTYzLCRhLmJ1ZmZlcikpOyRhPUluZmluaXR5OwpudWxsIT09Q2I/JGE9Q2IuY291bnQ6dm9pZCAwIT09b2ImJigkYT1vYi5jb3VudCk7b2I9bWEuZHJhd1JhbmdlLnN0YXJ0KmRhO1BhPW51bGwhPT1hYj9hYi5zdGFydCpkYTowO0NiPU1hdGgubWF4KG9iLFBhKTthYj1NYXRoLm1heCgwLE1hdGgubWluKCRhLG9iK21hLmRyYXdSYW5nZS5jb3VudCpkYSxQYSsobnVsbCE9PWFiP2FiLmNvdW50KmRhOkluZmluaXR5KSktMS1DYisxKTtpZigwIT09YWIpe2lmKE9hLmlzTWVzaClpZighMD09PUlhLndpcmVmcmFtZSl5Yi5zZXRMaW5lV2lkdGgoSWEud2lyZWZyYW1lTGluZXdpZHRoKmUoKSksVS5zZXRNb2RlKDEpO2Vsc2Ugc3dpdGNoKE9hLmRyYXdNb2RlKXtjYXNlIDA6VS5zZXRNb2RlKDQpO2JyZWFrO2Nhc2UgMTpVLnNldE1vZGUoNSk7YnJlYWs7Y2FzZSAyOlUuc2V0TW9kZSg2KX1lbHNlIE9hLmlzTGluZT8oSWE9SWEubGluZXdpZHRoLHZvaWQgMD09PUlhJiYoSWE9MSkseWIuc2V0TGluZVdpZHRoKElhKmUoKSksT2EuaXNMaW5lU2VnbWVudHM/ClUuc2V0TW9kZSgxKTpPYS5pc0xpbmVMb29wP1Uuc2V0TW9kZSgyKTpVLnNldE1vZGUoMykpOk9hLmlzUG9pbnRzP1Uuc2V0TW9kZSgwKTpPYS5pc1Nwcml0ZSYmVS5zZXRNb2RlKDQpO21hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PzA8bWEubWF4SW5zdGFuY2VkQ291bnQmJlUucmVuZGVySW5zdGFuY2VzKG1hLENiLGFiKTpVLnJlbmRlcihDYixhYil9fTt0aGlzLmNvbXBpbGU9ZnVuY3Rpb24oVSxkYSl7Y2I9eWUuZ2V0KFUsZGEpO2NiLmluaXQoKTtVLnRyYXZlcnNlKGZ1bmN0aW9uKG1hKXttYS5pc0xpZ2h0JiYoY2IucHVzaExpZ2h0KG1hKSxtYS5jYXN0U2hhZG93JiZjYi5wdXNoU2hhZG93KG1hKSl9KTtjYi5zZXR1cExpZ2h0cyhkYSk7VS50cmF2ZXJzZShmdW5jdGlvbihtYSl7aWYobWEubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheShtYS5tYXRlcmlhbCkpZm9yKHZhciBJYT0wO0lhPG1hLm1hdGVyaWFsLmxlbmd0aDtJYSsrKVcobWEubWF0ZXJpYWxbSWFdLFUuZm9nLAptYSk7ZWxzZSBXKG1hLm1hdGVyaWFsLFUuZm9nLG1hKX0pfTt2YXIgVGg9bnVsbCx5Zz1uZXcgYmM7eWcuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihVKXtkZC5pc1ByZXNlbnRpbmcoKXx8VGgmJlRoKFUpfSk7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ5Zy5zZXRDb250ZXh0KHdpbmRvdyk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKFUpe1RoPVU7ZGQuc2V0QW5pbWF0aW9uTG9vcChVKTt5Zy5zdGFydCgpfTt0aGlzLnJlbmRlcj1mdW5jdGlvbihVLGRhLG1hLElhKXtpZih2b2lkIDAhPT1tYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgcmVuZGVyVGFyZ2V0IGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgaW5zdGVhZC4iKTt2YXIgT2E9bWF9aWYodm9pZCAwIT09SWEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIGZvcmNlQ2xlYXIgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5jbGVhcigpIGluc3RlYWQuIik7CnZhciBhYj1JYX1kYSYmZGEuaXNDYW1lcmE/R2F8fChlYj1jPW51bGwsbWI9ITEsUWE9LTEscGI9bnVsbCwhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1kYS5wYXJlbnQmJmRhLnVwZGF0ZU1hdHJpeFdvcmxkKCksZGQuZW5hYmxlZCYmKGRhPWRkLmdldENhbWVyYShkYSkpLGNiPXllLmdldChVLGRhKSxjYi5pbml0KCksVS5vbkJlZm9yZVJlbmRlcihqYSxVLGRhLE9hfHxpYiksd2YubXVsdGlwbHlNYXRyaWNlcyhkYS5wcm9qZWN0aW9uTWF0cml4LGRhLm1hdHJpeFdvcmxkSW52ZXJzZSksUWguc2V0RnJvbU1hdHJpeCh3ZiksUmg9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCx4Zz15Yy5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsUmgsZGEpLE5hPXdnLmdldChVLGRhKSxOYS5pbml0KCksUihVLGRhLDAsamEuc29ydE9iamVjdHMpLCEwPT09amEuc29ydE9iamVjdHMmJk5hLnNvcnQoKSx4ZyYmeWMuYmVnaW5TaGFkb3dzKCksRWoucmVuZGVyKGNiLnN0YXRlLnNoYWRvd3NBcnJheSwKVSxkYSksY2Iuc2V0dXBMaWdodHMoZGEpLHhnJiZ5Yy5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09T2EmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KE9hKSx5ZC5yZW5kZXIoTmEsVSxkYSxhYiksbWE9TmEub3BhcXVlLElhPU5hLnRyYW5zcGFyZW50LFUub3ZlcnJpZGVNYXRlcmlhbD8oT2E9VS5vdmVycmlkZU1hdGVyaWFsLG1hLmxlbmd0aCYmUyhtYSxVLGRhLE9hKSxJYS5sZW5ndGgmJlMoSWEsVSxkYSxPYSkpOihtYS5sZW5ndGgmJlMobWEsVSxkYSksSWEubGVuZ3RoJiZTKElhLFUsZGEpKSxudWxsIT09aWImJihPYy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoaWIpLE9jLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KGliKSkseWIuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSx5Yi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLHliLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCkseWIuc2V0UG9seWdvbk9mZnNldCghMSksCmRkLmVuYWJsZWQmJmRkLnN1Ym1pdEZyYW1lKCksY2I9TmE9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpfTt0aGlzLnNldEZyYW1lYnVmZmVyPWZ1bmN0aW9uKFUpe0xhIT09VSYmUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLFUpO0xhPVV9O3RoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gbmJ9O3RoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gVmF9O3RoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGlifTt0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihVLGRhLG1hKXtpYj1VO25iPWRhO1ZhPW1hO1UmJnZvaWQgMD09PWVjLmdldChVKS5fX3dlYmdsRnJhbWVidWZmZXImJk9jLnNldHVwUmVuZGVyVGFyZ2V0KFUpO3ZhciBJYT1MYSxPYT0hMTtVPyhJYT1lYy5nZXQoVSkuX193ZWJnbEZyYW1lYnVmZmVyLApVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPyhJYT1JYVtkYXx8MF0sT2E9ITApOklhPVUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P2VjLmdldChVKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6SWEsS2IuY29weShVLnZpZXdwb3J0KSxTYi5jb3B5KFUuc2Npc3NvciksbmM9VS5zY2lzc29yVGVzdCk6KEtiLmNvcHkod2UpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLG5jPVNoKTtrYiE9PUlhJiYoUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLElhKSxrYj1JYSk7eWIudmlld3BvcnQoS2IpO3liLnNjaXNzb3IoU2IpO3liLnNldFNjaXNzb3JUZXN0KG5jKTtPYSYmKFU9ZWMuZ2V0KFUudGV4dHVyZSksUmEuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrKGRhfHwwKSxVLl9fd2ViZ2xUZXh0dXJlLG1hfHwwKSl9O3RoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihVLApkYSxtYSxJYSxPYSxhYixQYSl7aWYoVSYmVS5pc1dlYkdMUmVuZGVyVGFyZ2V0KXt2YXIgZmI9ZWMuZ2V0KFUpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlJiZ2b2lkIDAhPT1QYSYmKGZiPWZiW1BhXSk7aWYoZmIpe1BhPSExO2ZiIT09a2ImJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZmIpLFBhPSEwKTt0cnl7dmFyIENiPVUudGV4dHVyZSxvYj1DYi5mb3JtYXQsJGE9Q2IudHlwZTsxMDIzIT09b2ImJk5jLmNvbnZlcnQob2IpIT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09JGF8fE5jLmNvbnZlcnQoJGEpPT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PSRhJiYoZGMuaXNXZWJHTDJ8fExiLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8CkxiLmdldCgiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHwxMDE2PT09JGEmJihkYy5pc1dlYkdMMj9MYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTpMYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpKT8zNjA1Mz09PVJhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PWRhJiZkYTw9VS53aWR0aC1JYSYmMDw9bWEmJm1hPD1VLmhlaWdodC1PYSYmUmEucmVhZFBpeGVscyhkYSxtYSxJYSxPYSxOYy5jb252ZXJ0KG9iKSxOYy5jb252ZXJ0KCRhKSxhYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1BhJiYKUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGtiKX19fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpfTt0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9ZGEuaW1hZ2Uud2lkdGgsT2E9ZGEuaW1hZ2UuaGVpZ2h0LGFiPU5jLmNvbnZlcnQoZGEuZm9ybWF0KTtPYy5zZXRUZXh0dXJlMkQoZGEsMCk7UmEuY29weVRleEltYWdlMkQoMzU1MyxtYXx8MCxhYixVLngsVS55LElhLE9hLDApfTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKFUsZGEsbWEsSWEpe3ZhciBPYT1kYS5pbWFnZS53aWR0aCxhYj1kYS5pbWFnZS5oZWlnaHQsUGE9TmMuY29udmVydChtYS5mb3JtYXQpLGZiPU5jLmNvbnZlcnQobWEudHlwZSk7T2Muc2V0VGV4dHVyZTJEKG1hLDApO2RhLmlzRGF0YVRleHR1cmU/ClJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LE9hLGFiLFBhLGZiLGRhLmltYWdlLmRhdGEpOlJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LFBhLGZiLGRhLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB6ZyhhLGMpe3RoaXMubmFtZT0iIjt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuZGVuc2l0eT12b2lkIDAhPT1jP2M6Mi41RS00fWZ1bmN0aW9uIEFnKGEsYyxlKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSShhKTt0aGlzLm5lYXI9dm9pZCAwIT09Yz9jOjE7dGhpcy5mYXI9dm9pZCAwIT09ZT9lOjFFM31mdW5jdGlvbiBRZChhLGMpe3RoaXMuYXJyYXk9YTt0aGlzLnN0cmlkZT1jO3RoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC9jOjA7dGhpcy5keW5hbWljPQohMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24geGYoYSxjLGUsZyl7dGhpcy5kYXRhPWE7dGhpcy5pdGVtU2l6ZT1jO3RoaXMub2Zmc2V0PWU7dGhpcy5ub3JtYWxpemVkPSEwPT09Z31mdW5jdGlvbiBBZChhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGVNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnJvdGF0aW9uPTA7dGhpcy5zaXplQXR0ZW51YXRpb249ITA7dGhpcy5saWdodHM9ITE7dGhpcy50cmFuc3BhcmVudD0hMDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiB5ZihhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGUiO2lmKHZvaWQgMD09PUFlKXtBZT1uZXcgdmE7dmFyIGM9bmV3IFFkKG5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLDUpO0FlLnNldEluZGV4KFswLAoxLDIsMCwyLDNdKTtBZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgeGYoYywzLDAsITEpKTtBZS5hZGRBdHRyaWJ1dGUoInV2IixuZXcgeGYoYywyLDMsITEpKX10aGlzLmdlb21ldHJ5PUFlO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09YT9hOm5ldyBBZDt0aGlzLmNlbnRlcj1uZXcgZiguNSwuNSl9ZnVuY3Rpb24gQmcoYSxjLGUsZyxyLHYpe0JlLnN1YlZlY3RvcnMoYSxlKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KGcpO3ZvaWQgMCE9PXI/KHpmLng9dipCZS54LXIqQmUueSx6Zi55PXIqQmUueCt2KkJlLnkpOnpmLmNvcHkoQmUpO2EuY29weShjKTthLngrPXpmLng7YS55Kz16Zi55O2EuYXBwbHlNYXRyaXg0KEZqKX1mdW5jdGlvbiBBZigpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxPRCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfX0pO3RoaXMuYXV0b1VwZGF0ZT0hMH1mdW5jdGlvbiBCZihhLGMpe2EmJmEuaXNHZW9tZXRyeSYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiO3RoaXMuYmluZE1hdHJpeD1uZXcgcTt0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBxfWZ1bmN0aW9uIENnKGEsYyl7YT1hfHxbXTt0aGlzLmJvbmVzPWEuc2xpY2UoMCk7dGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSgxNip0aGlzLmJvbmVzLmxlbmd0aCk7aWYodm9pZCAwPT09Yyl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7ZWxzZSBpZih0aGlzLmJvbmVzLmxlbmd0aD09PWMubGVuZ3RoKXRoaXMuYm9uZUludmVyc2VzPWMuc2xpY2UoMCk7ZWxzZSBmb3IoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4iKSwKdGhpcy5ib25lSW52ZXJzZXM9W10sYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBxKX1mdW5jdGlvbiBVaCgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIEZiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpbmV3aWR0aD0xO3RoaXMubGluZWpvaW49dGhpcy5saW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gVmIoYSxjLGUpezE9PT1lJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuIik7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZSI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1hP2E6bmV3IHZhO3RoaXMubWF0ZXJpYWw9CnZvaWQgMCE9PWM/YzpuZXcgRmIoe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBJYihhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBEZyhhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZUxvb3AifWZ1bmN0aW9uIEFjKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1hcD1udWxsO3RoaXMuc2l6ZT0xO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIENlKGEsYyl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9pbnRzIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWE/YTpuZXcgdmE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1jP2M6bmV3IEFjKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX0KZnVuY3Rpb24gVmgoYSxjLGUsZyxyLHYseil7dmFyIEU9V2guZGlzdGFuY2VTcVRvUG9pbnQoYSk7RTxlJiYoZT1uZXcgayxXaC5jbG9zZXN0UG9pbnRUb1BvaW50KGEsZSksZS5hcHBseU1hdHJpeDQoZyksYT1yLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhlKSxhPHIubmVhcnx8YT5yLmZhcnx8di5wdXNoKHtkaXN0YW5jZTphLGRpc3RhbmNlVG9SYXk6TWF0aC5zcXJ0KEUpLHBvaW50OmUsaW5kZXg6YyxmYWNlOm51bGwsb2JqZWN0Onp9KSl9ZnVuY3Rpb24gWGgoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwNjt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBEZShhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsClIpO3RoaXMuaW1hZ2U9e3dpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWlwbWFwcz1hO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gQ2YoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIERmKGEsYyxlLGcscix2LHosRSxGLEope0o9dm9pZCAwIT09Sj9KOjEwMjY7aWYoMTAyNiE9PUomJjEwMjchPT1KKXRocm93IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWUmJjEwMjY9PT1KJiYoZT0xMDEyKTt2b2lkIDA9PT1lJiYxMDI3PT09SiYmKGU9MTAyMCk7bC5jYWxsKHRoaXMsbnVsbCxnLHIsdix6LEUsSixlLEYpO3RoaXMuaW1hZ2U9e3dpZHRoOmEsaGVpZ2h0OmN9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXo/ejoxMDAzO3RoaXMubWluRmlsdGVyPQp2b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIEVlKGEpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGM9W10sZSxnLHIsdj1bMCwwXSx6PXt9LEU9WyJhIiwiYiIsImMiXTtpZihhJiZhLmlzR2VvbWV0cnkpe3ZhciBGPWEuZmFjZXM7dmFyIEo9MDtmb3IoZz1GLmxlbmd0aDtKPGc7SisrKXt2YXIgUD1GW0pdO2ZvcihlPTA7Mz5lO2UrKyl7dmFyIFI9UFtFW2VdXTt2YXIgUz1QW0VbKGUrMSklM11dO3ZbMF09TWF0aC5taW4oUixTKTt2WzFdPU1hdGgubWF4KFIsUyk7Uj12WzBdKyIsIit2WzFdO3ZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pfX1mb3IoUiBpbiB6KUo9eltSXSxFPWEudmVydGljZXNbSi5pbmRleDFdLGMucHVzaChFLngsRS55LEUueiksRT1hLnZlcnRpY2VzW0ouaW5kZXgyXSxjLnB1c2goRS54LEUueSxFLnopfWVsc2UgaWYoYSYmCmEuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBrLG51bGwhPT1hLmluZGV4KXtGPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtQPWEuaW5kZXg7dmFyIFY9YS5ncm91cHM7MD09PVYubGVuZ3RoJiYoVj1be3N0YXJ0OjAsY291bnQ6UC5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7YT0wO2ZvcihyPVYubGVuZ3RoO2E8cjsrK2EpZm9yKEo9VlthXSxlPUouc3RhcnQsZz1KLmNvdW50LEo9ZSxnPWUrZztKPGc7Sis9Mylmb3IoZT0wOzM+ZTtlKyspUj1QLmdldFgoSitlKSxTPVAuZ2V0WChKKyhlKzEpJTMpLHZbMF09TWF0aC5taW4oUixTKSx2WzFdPU1hdGgubWF4KFIsUyksUj12WzBdKyIsIit2WzFdLHZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pO2ZvcihSIGluIHopSj16W1JdLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgxKSxjLnB1c2goRS54LEUueSxFLnopLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgyKSxjLnB1c2goRS54LApFLnksRS56KX1lbHNlIGZvcihGPWEuYXR0cmlidXRlcy5wb3NpdGlvbixKPTAsZz1GLmNvdW50LzM7SjxnO0orKylmb3IoZT0wOzM+ZTtlKyspej0zKkorZSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRix6KSxjLnB1c2goRS54LEUueSxFLnopLHo9MypKKyhlKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEYseiksYy5wdXNoKEUueCxFLnksRS56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKX1mdW5jdGlvbiBFZihhLGMsZSl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmEsc2xpY2VzOmMsc3RhY2tzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBGZShhLGMsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEZlKGEsYyxlKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2Z1bmM6YSwKc2xpY2VzOmMsc3RhY2tzOmV9O3ZhciBnPVtdLHI9W10sdj1bXSx6PVtdLEU9bmV3IGssRj1uZXcgayxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Mz5hLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTt2YXIgVz1jKzE7Zm9yKFM9MDtTPD1lO1MrKyl7dmFyIGhhPVMvZTtmb3IoVj0wO1Y8PWM7VisrKXt2YXIgZmE9Vi9jO2EoZmEsaGEsRik7ci5wdXNoKEYueCxGLnksRi56KTswPD1mYS0xRS01PyhhKGZhLTFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEYsSikpOihhKGZhKzFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEosRikpOzA8PWhhLTFFLTU/KGEoZmEsaGEtMUUtNSxKKSxSLnN1YlZlY3RvcnMoRixKKSk6KGEoZmEsaGErMUUtNSxKKSxSLnN1YlZlY3RvcnMoSixGKSk7RS5jcm9zc1ZlY3RvcnMoUCxSKS5ub3JtYWxpemUoKTt2LnB1c2goRS54LApFLnksRS56KTt6LnB1c2goZmEsaGEpfX1mb3IoUz0wO1M8ZTtTKyspZm9yKFY9MDtWPGM7VisrKWE9UypXK1YrMSxFPShTKzEpKlcrVisxLEY9KFMrMSkqVytWLGcucHVzaChTKlcrVixhLEYpLGcucHVzaChhLEUsRik7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShyLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoeiwyKSl9ZnVuY3Rpb24gRmYoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGpjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBqYyhhLGMsZSxnKXtmdW5jdGlvbiByKFcsaGEsZmEscmEpe3JhPU1hdGgucG93KDIsCnJhKTt2YXIgcGE9W10scWEsdWE7Zm9yKHFhPTA7cWE8PXJhO3FhKyspe3BhW3FhXT1bXTt2YXIgb2E9Vy5jbG9uZSgpLmxlcnAoZmEscWEvcmEpLHRhPWhhLmNsb25lKCkubGVycChmYSxxYS9yYSksQmE9cmEtcWE7Zm9yKHVhPTA7dWE8PUJhO3VhKyspcGFbcWFdW3VhXT0wPT09dWEmJnFhPT09cmE/b2E6b2EuY2xvbmUoKS5sZXJwKHRhLHVhL0JhKX1mb3IocWE9MDtxYTxyYTtxYSsrKWZvcih1YT0wO3VhPDIqKHJhLXFhKS0xO3VhKyspVz1NYXRoLmZsb29yKHVhLzIpLDA9PT11YSUyPyh6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1ddKSx6KHBhW3FhXVtXXSkpOih6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1crMV0pLHoocGFbcWErMV1bV10pKX1mdW5jdGlvbiB2KCl7Zm9yKHZhciBXPTA7VzxWLmxlbmd0aDtXKz02KXt2YXIgaGE9VltXKzBdLGZhPVZbVysyXSxyYT1WW1crNF0scGE9TWF0aC5taW4oaGEsZmEscmEpOy45PE1hdGgubWF4KGhhLGZhLHJhKSYmLjE+cGEmJiguMj4KaGEmJihWW1crMF0rPTEpLC4yPmZhJiYoVltXKzJdKz0xKSwuMj5yYSYmKFZbVys0XSs9MSkpfX1mdW5jdGlvbiB6KFcpe1MucHVzaChXLngsVy55LFcueil9ZnVuY3Rpb24gRShXLGhhKXtXKj0zO2hhLng9YVtXKzBdO2hhLnk9YVtXKzFdO2hhLno9YVtXKzJdfWZ1bmN0aW9uIEYoKXtmb3IodmFyIFc9bmV3IGssaGE9bmV3IGssZmE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGYscWE9bmV3IGYsdWE9bmV3IGYsb2E9MCx0YT0wO29hPFMubGVuZ3RoO29hKz05LHRhKz02KXtXLnNldChTW29hKzBdLFNbb2ErMV0sU1tvYSsyXSk7aGEuc2V0KFNbb2ErM10sU1tvYSs0XSxTW29hKzVdKTtmYS5zZXQoU1tvYSs2XSxTW29hKzddLFNbb2ErOF0pO3BhLnNldChWW3RhKzBdLFZbdGErMV0pO3FhLnNldChWW3RhKzJdLFZbdGErM10pO3VhLnNldChWW3RhKzRdLFZbdGErNV0pO3JhLmNvcHkoVykuYWRkKGhhKS5hZGQoZmEpLmRpdmlkZVNjYWxhcigzKTt2YXIgQmE9UChyYSk7SihwYSx0YSswLFcsCkJhKTtKKHFhLHRhKzIsaGEsQmEpO0oodWEsdGErNCxmYSxCYSl9fWZ1bmN0aW9uIEooVyxoYSxmYSxyYSl7MD5yYSYmMT09PVcueCYmKFZbaGFdPVcueC0xKTswPT09ZmEueCYmMD09PWZhLnomJihWW2hhXT1yYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIFAoVyl7cmV0dXJuIE1hdGguYXRhbjIoVy56LC1XLngpfWZ1bmN0aW9uIFIoVyl7cmV0dXJuIE1hdGguYXRhbjIoLVcueSxNYXRoLnNxcnQoVy54KlcueCtXLnoqVy56KSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307ZT1lfHwxO2c9Z3x8MDt2YXIgUz1bXSxWPVtdOyhmdW5jdGlvbihXKXtmb3IodmFyIGhhPW5ldyBrLGZhPW5ldyBrLHJhPW5ldyBrLHBhPTA7cGE8Yy5sZW5ndGg7cGErPTMpRShjW3BhKzBdLGhhKSxFKGNbcGErMV0sZmEpLEUoY1twYSsyXSxyYSkscihoYSxmYSxyYSwKVyl9KShnKTsoZnVuY3Rpb24oVyl7Zm9yKHZhciBoYT1uZXcgayxmYT0wO2ZhPFMubGVuZ3RoO2ZhKz0zKWhhLng9U1tmYSswXSxoYS55PVNbZmErMV0saGEuej1TW2ZhKzJdLGhhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFcpLFNbZmErMF09aGEueCxTW2ZhKzFdPWhhLnksU1tmYSsyXT1oYS56fSkoZSk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBXPW5ldyBrLGhhPTA7aGE8Uy5sZW5ndGg7aGErPTMpe1cueD1TW2hhKzBdO1cueT1TW2hhKzFdO1cuej1TW2hhKzJdO3ZhciBmYT1QKFcpLzIvTWF0aC5QSSsuNSxyYT1SKFcpL01hdGguUEkrLjU7Vi5wdXNoKGZhLDEtcmEpfUYoKTt2KCl9KSgpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFMsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShTLnNsaWNlKCksMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFYsMikpOzA9PT1nP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKX0KZnVuY3Rpb24gR2YoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEdlKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEdlKGEsYyl7amMuY2FsbCh0aGlzLFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSxhLGMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gSGYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUmQoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUmQoYSxjKXtqYy5jYWxsKHRoaXMsClsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxhLGMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBJZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgSGUoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gSGUoYSxjKXt2YXIgZT0oMStNYXRoLnNxcnQoNSkpLzI7amMuY2FsbCh0aGlzLFstMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLDAsMCwtMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLGUsMCwtMSxlLDAsMSwtZSwwLC0xLC1lLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwKMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGEsYyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBKZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEllKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEllKGEsYyl7dmFyIGU9KDErTWF0aC5zcXJ0KDUpKS8yLGc9MS9lO2pjLmNhbGwodGhpcyxbLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtZywtZSwwLC1nLGUsMCxnLC1lLDAsZyxlLC1nLC1lLDAsLWcsZSwwLGcsCi1lLDAsZyxlLDAsLWUsMCwtZyxlLDAsLWcsLWUsMCxnLGUsMCxnXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sYSxjKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBLZihhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUsCnJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnJ9O3ZvaWQgMCE9PXYmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2E9bmV3IFNkKGEsYyxlLGcscik7dGhpcy50YW5nZW50cz1hLnRhbmdlbnRzO3RoaXMubm9ybWFscz1hLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9YS5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2QoYSxjLGUsZyxyKXtmdW5jdGlvbiB2KHFhKXtTPWEuZ2V0UG9pbnRBdChxYS9jLFMpO3ZhciB1YT1GLm5vcm1hbHNbcWFdO3FhPUYuYmlub3JtYWxzW3FhXTtmb3IoVz0wO1c8PWc7VysrKXt2YXIgb2E9Vy9nKk1hdGguUEkqMix0YT1NYXRoLnNpbihvYSk7b2E9LU1hdGguY29zKG9hKTtQLng9b2EqdWEueCt0YSpxYS54O1AueT1vYSp1YS55K3RhKnFhLnk7UC56PW9hKnVhLnordGEqcWEuejtQLm5vcm1hbGl6ZSgpO2ZhLnB1c2goUC54LApQLnksUC56KTtKLng9Uy54K2UqUC54O0oueT1TLnkrZSpQLnk7Si56PVMueitlKlAuejtoYS5wdXNoKEoueCxKLnksSi56KX19ZnVuY3Rpb24geigpe2ZvcihXPTE7Vzw9YztXKyspZm9yKFY9MTtWPD1nO1YrKyl7dmFyIHFhPShnKzEpKlcrKFYtMSksdWE9KGcrMSkqVytWLG9hPShnKzEpKihXLTEpK1Y7cGEucHVzaCgoZysxKSooVy0xKSsoVi0xKSxxYSxvYSk7cGEucHVzaChxYSx1YSxvYSl9fWZ1bmN0aW9uIEUoKXtmb3IoVj0wO1Y8PWM7VisrKWZvcihXPTA7Vzw9ZztXKyspUi54PVYvYyxSLnk9Vy9nLHJhLnB1c2goUi54LFIueSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUscmFkaWFsU2VnbWVudHM6ZyxjbG9zZWQ6cn07Yz1jfHw2NDtlPWV8fDE7Zz1nfHw4O3I9cnx8ITE7dmFyIEY9YS5jb21wdXRlRnJlbmV0RnJhbWVzKGMscik7dGhpcy50YW5nZW50cz0KRi50YW5nZW50czt0aGlzLm5vcm1hbHM9Ri5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUYuYmlub3JtYWxzO3ZhciBKPW5ldyBrLFA9bmV3IGssUj1uZXcgZixTPW5ldyBrLFYsVyxoYT1bXSxmYT1bXSxyYT1bXSxwYT1bXTsoZnVuY3Rpb24oKXtmb3IoVj0wO1Y8YztWKyspdihWKTt2KCExPT09cj9jOjApO0UoKTt6KCl9KSgpO3RoaXMuc2V0SW5kZXgocGEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGhhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoZmEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHJhLDIpKX1mdW5jdGlvbiBMZihhLGMsZSxnLHIsdix6KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHR1YnVsYXJTZWdtZW50czplLHJhZGlhbFNlZ21lbnRzOmcscDpyLHE6dn07dm9pZCAwIT09eiYmY29uc29sZS53YXJuKCJUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuIik7CnRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBKZShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEplKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KHRhLEJhLFRhLFVhLENhKXt2YXIgSGE9TWF0aC5zaW4odGEpO0JhPVRhL0JhKnRhO1RhPU1hdGguY29zKEJhKTtDYS54PVVhKigyK1RhKSouNSpNYXRoLmNvcyh0YSk7Q2EueT1VYSooMitUYSkqSGEqLjU7Q2Euej1VYSpNYXRoLnNpbihCYSkqLjV9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6Yyx0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpYWxTZWdtZW50czpnLHA6cixxOnZ9O2E9YXx8MTtjPWN8fC40O2U9TWF0aC5mbG9vcihlKXx8NjQ7Zz1NYXRoLmZsb29yKGcpfHw4O3I9cnx8Mjt2PXZ8fDM7dmFyIEU9W10sRj1bXSxKPVtdLFA9W10sUixTPW5ldyBrLFY9bmV3IGssVz1uZXcgayxoYT1uZXcgayxmYT1uZXcgaywKcmE9bmV3IGsscGE9bmV3IGs7Zm9yKFI9MDtSPD1lOysrUil7dmFyIHFhPVIvZSpyKk1hdGguUEkqMjt6KHFhLHIsdixhLFcpO3oocWErLjAxLHIsdixhLGhhKTtyYS5zdWJWZWN0b3JzKGhhLFcpO3BhLmFkZFZlY3RvcnMoaGEsVyk7ZmEuY3Jvc3NWZWN0b3JzKHJhLHBhKTtwYS5jcm9zc1ZlY3RvcnMoZmEscmEpO2ZhLm5vcm1hbGl6ZSgpO3BhLm5vcm1hbGl6ZSgpO2ZvcihxYT0wO3FhPD1nOysrcWEpe3ZhciB1YT1xYS9nKk1hdGguUEkqMixvYT0tYypNYXRoLmNvcyh1YSk7dWE9YypNYXRoLnNpbih1YSk7Uy54PVcueCsob2EqcGEueCt1YSpmYS54KTtTLnk9Vy55KyhvYSpwYS55K3VhKmZhLnkpO1Muej1XLnorKG9hKnBhLnordWEqZmEueik7Ri5wdXNoKFMueCxTLnksUy56KTtWLnN1YlZlY3RvcnMoUyxXKS5ub3JtYWxpemUoKTtKLnB1c2goVi54LFYueSxWLnopO1AucHVzaChSL2UpO1AucHVzaChxYS9nKX19Zm9yKHFhPTE7cWE8PWU7cWErKylmb3IoUj0xO1I8PWc7UisrKWE9CihnKzEpKnFhKyhSLTEpLGM9KGcrMSkqcWErUixyPShnKzEpKihxYS0xKStSLEUucHVzaCgoZysxKSoocWEtMSkrKFItMSksYSxyKSxFLnB1c2goYSxjLHIpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoRiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFAsMikpfWZ1bmN0aW9uIE1mKGEsYyxlLGcscil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHJhZGlhbFNlZ21lbnRzOmUsdHVidWxhclNlZ21lbnRzOmcsYXJjOnJ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBLZShhLGMsZSxnLHIpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBLZShhLGMsZSxnLHIpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YSx0dWJlOmMscmFkaWFsU2VnbWVudHM6ZSx0dWJ1bGFyU2VnbWVudHM6ZyxhcmM6cn07YT1hfHwxO2M9Y3x8LjQ7ZT1NYXRoLmZsb29yKGUpfHw4O2c9TWF0aC5mbG9vcihnKXx8NjtyPXJ8fDIqTWF0aC5QSTt2YXIgdj1bXSx6PVtdLEU9W10sRj1bXSxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Zm9yKFM9MDtTPD1lO1MrKylmb3IoVj0wO1Y8PWc7VisrKXt2YXIgVz1WL2cqcixoYT1TL2UqTWF0aC5QSSoyO1AueD0oYStjKk1hdGguY29zKGhhKSkqTWF0aC5jb3MoVyk7UC55PShhK2MqTWF0aC5jb3MoaGEpKSpNYXRoLnNpbihXKTtQLno9YypNYXRoLnNpbihoYSk7ei5wdXNoKFAueCxQLnksUC56KTtKLng9YSpNYXRoLmNvcyhXKTtKLnk9YSpNYXRoLnNpbihXKTtSLnN1YlZlY3RvcnMoUCxKKS5ub3JtYWxpemUoKTtFLnB1c2goUi54LFIueSxSLnopO0YucHVzaChWL2cpO0YucHVzaChTL2UpfWZvcihTPTE7Uzw9ZTtTKyspZm9yKFY9MTtWPD1nO1YrKylhPShnKwoxKSooUy0xKStWLTEsYz0oZysxKSooUy0xKStWLHI9KGcrMSkqUytWLHYucHVzaCgoZysxKSpTK1YtMSxhLHIpLHYucHVzaChhLGMscik7dGhpcy5zZXRJbmRleCh2KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoRSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoRiwyKSl9ZnVuY3Rpb24gR2ooYSxjLGUsZyxyKXtpZihyPT09MDxYbChhLGMsZSxnKSlmb3Iocj1jO3I8ZTtyKz1nKXZhciB2PUhqKHIsYVtyXSxhW3IrMV0sdik7ZWxzZSBmb3Iocj1lLWc7cj49YztyLT1nKXY9SGoocixhW3JdLGFbcisxXSx2KTt2JiZUZCh2LHYubmV4dCkmJihOZih2KSx2PXYubmV4dCk7cmV0dXJuIHZ9ZnVuY3Rpb24gT2YoYSxjKXtpZighYSlyZXR1cm4gYTtjfHwoYz1hKTtkb3t2YXIgZT0hMTtpZihhLnN0ZWluZXJ8fCFUZChhLGEubmV4dCkmJjAhPT1XYihhLnByZXYsYSxhLm5leHQpKWE9YS5uZXh0OwplbHNle05mKGEpO2E9Yz1hLnByZXY7aWYoYT09PWEubmV4dClicmVhaztlPSEwfX13aGlsZShlfHxhIT09Yyk7cmV0dXJuIGN9ZnVuY3Rpb24gUGYoYSxjLGUsZyxyLHYseil7aWYoYSl7IXomJnYmJllsKGEsZyxyLHYpO2Zvcih2YXIgRT1hLEYsSjthLnByZXYhPT1hLm5leHQ7KWlmKEY9YS5wcmV2LEo9YS5uZXh0LHY/WmwoYSxnLHIsdik6JGwoYSkpYy5wdXNoKEYuaS9lKSxjLnB1c2goYS5pL2UpLGMucHVzaChKLmkvZSksTmYoYSksRT1hPUoubmV4dDtlbHNlIGlmKGE9SixhPT09RSl7ej8xPT09ej8oYT1hbShhLGMsZSksUGYoYSxjLGUsZyxyLHYsMikpOjI9PT16JiZibShhLGMsZSxnLHIsdik6UGYoT2YoYSksYyxlLGcscix2LDEpO2JyZWFrfX19ZnVuY3Rpb24gJGwoYSl7dmFyIGM9YS5wcmV2LGU9YS5uZXh0O2lmKDA8PVdiKGMsYSxlKSlyZXR1cm4hMTtmb3IodmFyIGc9YS5uZXh0Lm5leHQ7ZyE9PWEucHJldjspe2lmKExlKGMueCxjLnksYS54LGEueSxlLngsZS55LGcueCwKZy55KSYmMDw9V2IoZy5wcmV2LGcsZy5uZXh0KSlyZXR1cm4hMTtnPWcubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBabChhLGMsZSxnKXt2YXIgcj1hLnByZXYsdj1hLm5leHQ7aWYoMDw9V2IocixhLHYpKXJldHVybiExO3ZhciB6PXIueD5hLng/ci54PnYueD9yLng6di54OmEueD52Lng/YS54OnYueCxFPXIueT5hLnk/ci55PnYueT9yLnk6di55OmEueT52Lnk/YS55OnYueSxGPVloKHIueDxhLng/ci54PHYueD9yLng6di54OmEueDx2Lng/YS54OnYueCxyLnk8YS55P3IueTx2Lnk/ci55OnYueTphLnk8di55P2EueTp2LnksYyxlLGcpO2M9WWgoeixFLGMsZSxnKTtlPWEucHJldlo7Zm9yKGc9YS5uZXh0WjtlJiZlLno+PUYmJmcmJmcuejw9Yzspe2lmKGUhPT1hLnByZXYmJmUhPT1hLm5leHQmJkxlKHIueCxyLnksYS54LGEueSx2Lngsdi55LGUueCxlLnkpJiYwPD1XYihlLnByZXYsZSxlLm5leHQpKXJldHVybiExO2U9ZS5wcmV2WjtpZihnIT09YS5wcmV2JiZnIT09YS5uZXh0JiZMZShyLngsCnIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafWZvcig7ZSYmZS56Pj1GOyl7aWYoZSE9PWEucHJldiYmZSE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZS54LGUueSkmJjA8PVdiKGUucHJldixlLGUubmV4dCkpcmV0dXJuITE7ZT1lLnByZXZafWZvcig7ZyYmZy56PD1jOyl7aWYoZyE9PWEucHJldiYmZyE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIGFtKGEsYyxlKXt2YXIgZz1hO2Rve3ZhciByPWcucHJldix2PWcubmV4dC5uZXh0OyFUZChyLHYpJiZJaihyLGcsZy5uZXh0LHYpJiZRZihyLHYpJiZRZih2LHIpJiYoYy5wdXNoKHIuaS9lKSxjLnB1c2goZy5pL2UpLGMucHVzaCh2LmkvZSksTmYoZyksTmYoZy5uZXh0KSxnPWE9dik7Zz1nLm5leHR9d2hpbGUoZyE9PQphKTtyZXR1cm4gZ31mdW5jdGlvbiBibShhLGMsZSxnLHIsdil7dmFyIHo9YTtkb3tmb3IodmFyIEU9ei5uZXh0Lm5leHQ7RSE9PXoucHJldjspe2lmKHouaSE9PUUuaSYmY20oeixFKSl7YT1Kaih6LEUpO3o9T2Yoeix6Lm5leHQpO2E9T2YoYSxhLm5leHQpO1BmKHosYyxlLGcscix2KTtQZihhLGMsZSxnLHIsdik7cmV0dXJufUU9RS5uZXh0fXo9ei5uZXh0fXdoaWxlKHohPT1hKX1mdW5jdGlvbiBkbShhLGMsZSxnKXt2YXIgcj1bXSx2O3ZhciB6PTA7Zm9yKHY9Yy5sZW5ndGg7ejx2O3orKyl7dmFyIEU9Y1t6XSpnO3ZhciBGPXo8di0xP2NbeisxXSpnOmEubGVuZ3RoO0U9R2ooYSxFLEYsZywhMSk7RT09PUUubmV4dCYmKEUuc3RlaW5lcj0hMCk7ci5wdXNoKGVtKEUpKX1yLnNvcnQoZm0pO2Zvcih6PTA7ejxyLmxlbmd0aDt6KyspZ20oclt6XSxlKSxlPU9mKGUsZS5uZXh0KTtyZXR1cm4gZX1mdW5jdGlvbiBmbShhLGMpe3JldHVybiBhLngtYy54fWZ1bmN0aW9uIGdtKGEsYyl7aWYoYz0KaG0oYSxjKSlhPUpqKGMsYSksT2YoYSxhLm5leHQpfWZ1bmN0aW9uIGhtKGEsYyl7dmFyIGU9YyxnPWEueCxyPWEueSx2PS1JbmZpbml0eTtkb3tpZihyPD1lLnkmJnI+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7dmFyIHo9ZS54KyhyLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYoejw9ZyYmej52KXt2PXo7aWYoej09PWcpe2lmKHI9PT1lLnkpcmV0dXJuIGU7aWYocj09PWUubmV4dC55KXJldHVybiBlLm5leHR9dmFyIEU9ZS54PGUubmV4dC54P2U6ZS5uZXh0fX1lPWUubmV4dH13aGlsZShlIT09Yyk7aWYoIUUpcmV0dXJuIG51bGw7aWYoZz09PXYpcmV0dXJuIEUucHJldjtjPUU7ej1FLng7dmFyIEY9RS55LEo9SW5maW5pdHk7Zm9yKGU9RS5uZXh0O2UhPT1jOyl7aWYoZz49ZS54JiZlLng+PXomJmchPT1lLngmJkxlKHI8Rj9nOnYscix6LEYscjxGP3Y6ZyxyLGUueCxlLnkpKXt2YXIgUD1NYXRoLmFicyhyLWUueSkvKGctZS54KTsoUDxKfHxQPT09SiYmCmUueD5FLngpJiZRZihlLGEpJiYoRT1lLEo9UCl9ZT1lLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gWWwoYSxjLGUsZyl7dmFyIHI9YTtkbyBudWxsPT09ci56JiYoci56PVloKHIueCxyLnksYyxlLGcpKSxyLnByZXZaPXIucHJldixyPXIubmV4dFo9ci5uZXh0O3doaWxlKHIhPT1hKTtyLnByZXZaLm5leHRaPW51bGw7ci5wcmV2Wj1udWxsO2ltKHIpfWZ1bmN0aW9uIGltKGEpe3ZhciBjLGUsZyxyLHY9MTtkb3t2YXIgej1hO3ZhciBFPWE9bnVsbDtmb3IoZT0wO3o7KXtlKys7dmFyIEY9ejtmb3IoYz1nPTA7Yzx2JiYoZysrLEY9Ri5uZXh0WixGKTtjKyspO2ZvcihyPXY7MDxnfHwwPHImJkY7KTAhPT1nJiYoMD09PXJ8fCFGfHx6Lno8PUYueik/KGM9eix6PXoubmV4dFosZy0tKTooYz1GLEY9Ri5uZXh0WixyLS0pLEU/RS5uZXh0Wj1jOmE9YyxjLnByZXZaPUUsRT1jO3o9Rn1FLm5leHRaPW51bGw7dio9Mn13aGlsZSgxPGUpO3JldHVybiBhfWZ1bmN0aW9uIFloKGEsYyxlLGcscil7YT0KMzI3NjcqKGEtZSkqcjtjPTMyNzY3KihjLWcpKnI7YT0oYXxhPDw4KSYxNjcxMTkzNTthPShhfGE8PDQpJjI1MjY0NTEzNTthPShhfGE8PDIpJjg1ODk5MzQ1OTtjPShjfGM8PDgpJjE2NzExOTM1O2M9KGN8Yzw8NCkmMjUyNjQ1MTM1O2M9KGN8Yzw8MikmODU4OTkzNDU5O3JldHVybihhfGE8PDEpJjE0MzE2NTU3NjV8KChjfGM8PDEpJjE0MzE2NTU3NjUpPDwxfWZ1bmN0aW9uIGVtKGEpe3ZhciBjPWEsZT1hO2Rve2lmKGMueDxlLnh8fGMueD09PWUueCYmYy55PGUueSllPWM7Yz1jLm5leHR9d2hpbGUoYyE9PWEpO3JldHVybiBlfWZ1bmN0aW9uIExlKGEsYyxlLGcscix2LHosRSl7cmV0dXJuIDA8PShyLXopKihjLUUpLShhLXopKih2LUUpJiYwPD0oYS16KSooZy1FKS0oZS16KSooYy1FKSYmMDw9KGUteikqKHYtRSktKHIteikqKGctRSl9ZnVuY3Rpb24gY20oYSxjKXtyZXR1cm4gYS5uZXh0LmkhPT1jLmkmJmEucHJldi5pIT09Yy5pJiYham0oYSxjKSYmUWYoYSxjKSYmUWYoYyxhKSYmCmttKGEsYyl9ZnVuY3Rpb24gV2IoYSxjLGUpe3JldHVybihjLnktYS55KSooZS54LWMueCktKGMueC1hLngpKihlLnktYy55KX1mdW5jdGlvbiBUZChhLGMpe3JldHVybiBhLng9PT1jLngmJmEueT09PWMueX1mdW5jdGlvbiBJaihhLGMsZSxnKXtyZXR1cm4gVGQoYSxlKSYmVGQoYyxnKXx8VGQoYSxnKSYmVGQoZSxjKT8hMDowPFdiKGEsYyxlKSE9PTA8V2IoYSxjLGcpJiYwPFdiKGUsZyxhKSE9PTA8V2IoZSxnLGMpfWZ1bmN0aW9uIGptKGEsYyl7dmFyIGU9YTtkb3tpZihlLmkhPT1hLmkmJmUubmV4dC5pIT09YS5pJiZlLmkhPT1jLmkmJmUubmV4dC5pIT09Yy5pJiZJaihlLGUubmV4dCxhLGMpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4hMX1mdW5jdGlvbiBRZihhLGMpe3JldHVybiAwPldiKGEucHJldixhLGEubmV4dCk/MDw9V2IoYSxjLGEubmV4dCkmJjA8PVdiKGEsYS5wcmV2LGMpOjA+V2IoYSxjLGEucHJldil8fDA+V2IoYSxhLm5leHQsYyl9ZnVuY3Rpb24ga20oYSwKYyl7dmFyIGU9YSxnPSExLHI9KGEueCtjLngpLzI7Yz0oYS55K2MueSkvMjtkbyBlLnk+YyE9PWUubmV4dC55PmMmJmUubmV4dC55IT09ZS55JiZyPChlLm5leHQueC1lLngpKihjLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYoZz0hZyksZT1lLm5leHQ7d2hpbGUoZSE9PWEpO3JldHVybiBnfWZ1bmN0aW9uIEpqKGEsYyl7dmFyIGU9bmV3IFpoKGEuaSxhLngsYS55KSxnPW5ldyBaaChjLmksYy54LGMueSkscj1hLm5leHQsdj1jLnByZXY7YS5uZXh0PWM7Yy5wcmV2PWE7ZS5uZXh0PXI7ci5wcmV2PWU7Zy5uZXh0PWU7ZS5wcmV2PWc7di5uZXh0PWc7Zy5wcmV2PXY7cmV0dXJuIGd9ZnVuY3Rpb24gSGooYSxjLGUsZyl7YT1uZXcgWmgoYSxjLGUpO2c/KGEubmV4dD1nLm5leHQsYS5wcmV2PWcsZy5uZXh0LnByZXY9YSxnLm5leHQ9YSk6KGEucHJldj1hLGEubmV4dD1hKTtyZXR1cm4gYX1mdW5jdGlvbiBOZihhKXthLm5leHQucHJldj1hLnByZXY7YS5wcmV2Lm5leHQ9YS5uZXh0O2EucHJldlomJgooYS5wcmV2Wi5uZXh0Wj1hLm5leHRaKTthLm5leHRaJiYoYS5uZXh0Wi5wcmV2Wj1hLnByZXZaKX1mdW5jdGlvbiBaaChhLGMsZSl7dGhpcy5pPWE7dGhpcy54PWM7dGhpcy55PWU7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PW51bGw7dGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIFhsKGEsYyxlLGcpe2Zvcih2YXIgcj0wLHY9ZS1nO2M8ZTtjKz1nKXIrPShhW3ZdLWFbY10pKihhW2MrMV0rYVt2KzFdKSx2PWM7cmV0dXJuIHJ9ZnVuY3Rpb24gS2ooYSl7dmFyIGM9YS5sZW5ndGg7MjxjJiZhW2MtMV0uZXF1YWxzKGFbMF0pJiZhLnBvcCgpfWZ1bmN0aW9uIExqKGEsYyl7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYS5wdXNoKGNbZV0ueCksYS5wdXNoKGNbZV0ueSl9ZnVuY3Rpb24gVWQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFJjKGEsCmMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBSYyhhLGMpe2Z1bmN0aW9uIGUoRil7ZnVuY3Rpb24gSihRYSxlYixtYil7ZWJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7cmV0dXJuIGViLmNsb25lKCkubXVsdGlwbHlTY2FsYXIobWIpLmFkZChRYSl9ZnVuY3Rpb24gUChRYSxlYixtYil7dmFyIHBiPVFhLngtZWIueDt2YXIgc2I9UWEueS1lYi55O3ZhciBLYj1tYi54LVFhLng7dmFyIFNiPW1iLnktUWEueSxuYz1wYipwYitzYipzYjtpZihNYXRoLmFicyhwYipTYi1zYipLYik+TnVtYmVyLkVQU0lMT04pe3ZhciBRYz1NYXRoLnNxcnQobmMpLHpjPU1hdGguc3FydChLYipLYitTYipTYik7bmM9ZWIueC1zYi9RYztlYj1lYi55K3BiL1FjO1NiPSgobWIueC1TYi96Yy1uYykqU2ItKG1iLnkrS2IvemMtZWIpKktiKS8ocGIqU2Itc2IqS2IpO0tiPW5jK3BiKlNiLVFhLng7cGI9ZWIrc2IqU2ItUWEueTtzYj1LYioKS2IrcGIqcGI7aWYoMj49c2IpcmV0dXJuIG5ldyBmKEtiLHBiKTtzYj1NYXRoLnNxcnQoc2IvMil9ZWxzZSBRYT0hMSxwYj5OdW1iZXIuRVBTSUxPTj9LYj5OdW1iZXIuRVBTSUxPTiYmKFFhPSEwKTpwYjwtTnVtYmVyLkVQU0lMT04/S2I8LU51bWJlci5FUFNJTE9OJiYoUWE9ITApOk1hdGguc2lnbihzYik9PT1NYXRoLnNpZ24oU2IpJiYoUWE9ITApLFFhPyhLYj0tc2Isc2I9TWF0aC5zcXJ0KG5jKSk6KEtiPXBiLHBiPXNiLHNiPU1hdGguc3FydChuYy8yKSk7cmV0dXJuIG5ldyBmKEtiL3NiLHBiL3NiKX1mdW5jdGlvbiBSKFFhLGViKXtmb3IoamE9UWEubGVuZ3RoOzA8PS0tamE7KXt2YXIgbWI9amE7dmFyIHBiPWphLTE7MD5wYiYmKHBiPVFhLmxlbmd0aC0xKTt2YXIgc2IsS2I9cWErMipVYTtmb3Ioc2I9MDtzYjxLYjtzYisrKXt2YXIgU2I9WWEqc2IsbmM9WWEqKHNiKzEpO1coZWIrbWIrU2IsZWIrcGIrU2IsZWIrcGIrbmMsZWIrbWIrbmMpfX19ZnVuY3Rpb24gUyhRYSxlYixtYil7cmEucHVzaChRYSk7CnJhLnB1c2goZWIpO3JhLnB1c2gobWIpfWZ1bmN0aW9uIFYoUWEsZWIsbWIpe2hhKFFhKTtoYShlYik7aGEobWIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVUb3BVVihnLHIsUWEtMyxRYS0yLFFhLTEpO2ZhKFFhWzBdKTtmYShRYVsxXSk7ZmEoUWFbMl0pfWZ1bmN0aW9uIFcoUWEsZWIsbWIscGIpe2hhKFFhKTtoYShlYik7aGEocGIpO2hhKGViKTtoYShtYik7aGEocGIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVTaWRlV2FsbFVWKGcscixRYS02LFFhLTMsUWEtMixRYS0xKTtmYShRYVswXSk7ZmEoUWFbMV0pO2ZhKFFhWzNdKTtmYShRYVsxXSk7ZmEoUWFbMl0pO2ZhKFFhWzNdKX1mdW5jdGlvbiBoYShRYSl7ci5wdXNoKHJhWzMqUWFdKTtyLnB1c2gocmFbMypRYSsxXSk7ci5wdXNoKHJhWzMqUWErMl0pfWZ1bmN0aW9uIGZhKFFhKXt2LnB1c2goUWEueCk7di5wdXNoKFFhLnkpfXZhciByYT1bXSxwYT12b2lkIDAhPT1jLmN1cnZlU2VnbWVudHM/Yy5jdXJ2ZVNlZ21lbnRzOgoxMixxYT12b2lkIDAhPT1jLnN0ZXBzP2Muc3RlcHM6MSx1YT12b2lkIDAhPT1jLmRlcHRoP2MuZGVwdGg6MTAwLG9hPXZvaWQgMCE9PWMuYmV2ZWxFbmFibGVkP2MuYmV2ZWxFbmFibGVkOiEwLHRhPXZvaWQgMCE9PWMuYmV2ZWxUaGlja25lc3M/Yy5iZXZlbFRoaWNrbmVzczo2LEJhPXZvaWQgMCE9PWMuYmV2ZWxTaXplP2MuYmV2ZWxTaXplOnRhLTIsVGE9dm9pZCAwIT09Yy5iZXZlbE9mZnNldD9jLmJldmVsT2Zmc2V0OjAsVWE9dm9pZCAwIT09Yy5iZXZlbFNlZ21lbnRzP2MuYmV2ZWxTZWdtZW50czozLENhPWMuZXh0cnVkZVBhdGgsSGE9dm9pZCAwIT09Yy5VVkdlbmVyYXRvcj9jLlVWR2VuZXJhdG9yOmxtO3ZvaWQgMCE9PWMuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLHVhPWMuYW1vdW50KTt2YXIgRGE9ITE7aWYoQ2Epe3ZhciBNYT1DYS5nZXRTcGFjZWRQb2ludHMocWEpOwpEYT0hMDtvYT0hMTt2YXIgZGI9Q2EuY29tcHV0ZUZyZW5ldEZyYW1lcyhxYSwhMSk7dmFyIHRiPW5ldyBrO3ZhciBLYT1uZXcgazt2YXIgYmI9bmV3IGt9b2F8fChUYT1CYT10YT1VYT0wKTt2YXIgamI7cGE9Ri5leHRyYWN0UG9pbnRzKHBhKTtGPXBhLnNoYXBlO3ZhciBFYj1wYS5ob2xlcztpZighZWQuaXNDbG9ja1dpc2UoRikpe0Y9Ri5yZXZlcnNlKCk7dmFyIHhiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKXt2YXIgaWE9RWJbeGJdO2VkLmlzQ2xvY2tXaXNlKGlhKSYmKEViW3hiXT1pYS5yZXZlcnNlKCkpfX12YXIgbmE9ZWQudHJpYW5ndWxhdGVTaGFwZShGLEViKSx6YT1GO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWlhPUViW3hiXSxGPUYuY29uY2F0KGlhKTt2YXIgSmEsWWE9Ri5sZW5ndGgsTmEsY2I9bmEubGVuZ3RoO3BhPVtdO3ZhciBqYT0wO3ZhciBHYT16YS5sZW5ndGg7dmFyIExhPUdhLTE7Zm9yKEphPWphKzE7amE8R2E7amErKyxMYSsrLEphKyspTGE9PT0KR2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCkscGFbamFdPVAoemFbamFdLHphW0xhXSx6YVtKYV0pO0NhPVtdO3ZhciBuYj1wYS5jb25jYXQoKTt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7aWE9RWJbeGJdO3ZhciBWYT1bXTtqYT0wO0dhPWlhLmxlbmd0aDtMYT1HYS0xO2ZvcihKYT1qYSsxO2phPEdhO2phKyssTGErKyxKYSsrKUxhPT09R2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCksVmFbamFdPVAoaWFbamFdLGlhW0xhXSxpYVtKYV0pO0NhLnB1c2goVmEpO25iPW5iLmNvbmNhdChWYSl9Zm9yKExhPTA7TGE8VWE7TGErKyl7R2E9TGEvVWE7dmFyIGliPXRhKk1hdGguY29zKEdhKk1hdGguUEkvMik7SmE9QmEqTWF0aC5zaW4oR2EqTWF0aC5QSS8yKStUYTtqYT0wO2ZvcihHYT16YS5sZW5ndGg7amE8R2E7amErKyl7dmFyIGtiPUooemFbamFdLHBhW2phXSxKYSk7UyhrYi54LGtiLnksLWliKX14Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKylmb3IoaWE9CkViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLFMoa2IueCxrYi55LC1pYil9SmE9QmErVGE7Zm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoa2IueCksdGIuY29weShkYi5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGtiLnkpLGJiLmNvcHkoTWFbMF0pLmFkZChLYSkuYWRkKHRiKSxTKGJiLngsYmIueSxiYi56KSk6UyhrYi54LGtiLnksMCk7Zm9yKEdhPTE7R2E8PXFhO0dhKyspZm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1tHYV0pLm11bHRpcGx5U2NhbGFyKGtiLngpLHRiLmNvcHkoZGIuYmlub3JtYWxzW0dhXSkubXVsdGlwbHlTY2FsYXIoa2IueSksYmIuY29weShNYVtHYV0pLmFkZChLYSkuYWRkKHRiKSwKUyhiYi54LGJiLnksYmIueikpOlMoa2IueCxrYi55LHVhL3FhKkdhKTtmb3IoTGE9VWEtMTswPD1MYTtMYS0tKXtHYT1MYS9VYTtpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrVGE7amE9MDtmb3IoR2E9emEubGVuZ3RoO2phPEdhO2phKyspa2I9Sih6YVtqYV0scGFbamFdLEphKSxTKGtiLngsa2IueSx1YStpYik7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspZm9yKGlhPUViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLERhP1Moa2IueCxrYi55K01hW3FhLTFdLnksTWFbcWEtMV0ueCtpYik6UyhrYi54LGtiLnksdWEraWIpfShmdW5jdGlvbigpe3ZhciBRYT1yLmxlbmd0aC8zO2lmKG9hKXt2YXIgZWI9MCpZYTtmb3IoamE9MDtqYTxjYjtqYSsrKU5hPW5hW2phXSxWKE5hWzJdK2ViLE5hWzFdK2ViLE5hWzBdK2ViKTtlYj1ZYSoocWErMipVYSk7CmZvcihqYT0wO2phPGNiO2phKyspTmE9bmFbamFdLFYoTmFbMF0rZWIsTmFbMV0rZWIsTmFbMl0rZWIpfWVsc2V7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVsyXSxOYVsxXSxOYVswXSk7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVswXStZYSpxYSxOYVsxXStZYSpxYSxOYVsyXStZYSpxYSl9Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDApfSkoKTsoZnVuY3Rpb24oKXt2YXIgUWE9ci5sZW5ndGgvMyxlYj0wO1IoemEsZWIpO2ViKz16YS5sZW5ndGg7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspaWE9RWJbeGJdLFIoaWEsZWIpLGViKz1pYS5sZW5ndGg7Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDEpfSkoKX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307YT1BcnJheS5pc0FycmF5KGEpP2E6W2FdO2Zvcih2YXIgZz10aGlzLApyPVtdLHY9W10sej0wLEU9YS5sZW5ndGg7ejxFO3orKyllKGFbel0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHYsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX1mdW5jdGlvbiBNaihhLGMsZSl7ZS5zaGFwZXM9W107aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspZS5zaGFwZXMucHVzaChhW2ddLnV1aWQpO2Vsc2UgZS5zaGFwZXMucHVzaChhLnV1aWQpO3ZvaWQgMCE9PWMuZXh0cnVkZVBhdGgmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9Yy5leHRydWRlUGF0aC50b0pTT04oKSk7cmV0dXJuIGV9ZnVuY3Rpb24gUmYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV4dEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RleHQ6YSxwYXJhbWV0ZXJzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBNZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gTWUoYSxjKXtjPWN8fHt9O3ZhciBlPWMuZm9udDtpZighZXx8IWUuaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLG5ldyB5YTthPWUuZ2VuZXJhdGVTaGFwZXMoYSxjLnNpemUpO2MuZGVwdGg9dm9pZCAwIT09Yy5oZWlnaHQ/Yy5oZWlnaHQ6NTA7dm9pZCAwPT09Yy5iZXZlbFRoaWNrbmVzcyYmKGMuYmV2ZWxUaGlja25lc3M9MTApO3ZvaWQgMD09PWMuYmV2ZWxTaXplJiYoYy5iZXZlbFNpemU9OCk7dm9pZCAwPT09Yy5iZXZlbEVuYWJsZWQmJihjLmJldmVsRW5hYmxlZD0hMSk7UmMuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJUZXh0QnVmZmVyR2VvbWV0cnkifWZ1bmN0aW9uIFNmKGEsYyxlLGcscix2LHope3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx3aWR0aFNlZ21lbnRzOmMsCmhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEJkKGEsYyxlLGcscix2LHopKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBCZChhLGMsZSxnLHIsdix6KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsd2lkdGhTZWdtZW50czpjLGhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07YT1hfHwxO2M9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGMpfHw4KTtlPU1hdGgubWF4KDIsTWF0aC5mbG9vcihlKXx8Nik7Zz12b2lkIDAhPT1nP2c6MDtyPXZvaWQgMCE9PXI/cjoyKk1hdGguUEk7dj12b2lkIDAhPT12P3Y6MDt6PXZvaWQgMCE9PXo/ejpNYXRoLlBJO3ZhciBFPU1hdGgubWluKHYreixNYXRoLlBJKSxGLApKLFA9MCxSPVtdLFM9bmV3IGssVj1uZXcgayxXPVtdLGhhPVtdLGZhPVtdLHJhPVtdO2ZvcihKPTA7Sjw9ZTtKKyspe3ZhciBwYT1bXSxxYT1KL2UsdWE9MDswPT1KJiYwPT12P3VhPS41L2M6Sj09ZSYmRT09TWF0aC5QSSYmKHVhPS0uNS9jKTtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgb2E9Ri9jO1MueD0tYSpNYXRoLmNvcyhnK29hKnIpKk1hdGguc2luKHYrcWEqeik7Uy55PWEqTWF0aC5jb3ModitxYSp6KTtTLno9YSpNYXRoLnNpbihnK29hKnIpKk1hdGguc2luKHYrcWEqeik7aGEucHVzaChTLngsUy55LFMueik7Vi5jb3B5KFMpLm5vcm1hbGl6ZSgpO2ZhLnB1c2goVi54LFYueSxWLnopO3JhLnB1c2gob2ErdWEsMS1xYSk7cGEucHVzaChQKyspfVIucHVzaChwYSl9Zm9yKEo9MDtKPGU7SisrKWZvcihGPTA7RjxjO0YrKylhPVJbSl1bRisxXSxnPVJbSl1bRl0scj1SW0orMV1bRl0sej1SW0orMV1bRisxXSwoMCE9PUp8fDA8dikmJlcucHVzaChhLGcseiksKEohPT1lLTF8fEU8TWF0aC5QSSkmJgpXLnB1c2goZyxyLHopO3RoaXMuc2V0SW5kZXgoVyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoaGEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShmYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EocmEsMikpfWZ1bmN0aW9uIFRmKGEsYyxlLGcscix2KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmEsb3V0ZXJSYWRpdXM6Yyx0aGV0YVNlZ21lbnRzOmUscGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IE5lKGEsYyxlLGcscix2KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gTmUoYSxjLGUsZyxyLHYpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJSaW5nQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6YSxvdXRlclJhZGl1czpjLHRoZXRhU2VnbWVudHM6ZSwKcGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07YT1hfHwuNTtjPWN8fDE7cj12b2lkIDAhPT1yP3I6MDt2PXZvaWQgMCE9PXY/djoyKk1hdGguUEk7ZT12b2lkIDAhPT1lP01hdGgubWF4KDMsZSk6ODtnPXZvaWQgMCE9PWc/TWF0aC5tYXgoMSxnKToxO3ZhciB6PVtdLEU9W10sRj1bXSxKPVtdLFA9YSxSPShjLWEpL2csUz1uZXcgayxWPW5ldyBmLFcsaGE7Zm9yKFc9MDtXPD1nO1crKyl7Zm9yKGhhPTA7aGE8PWU7aGErKylhPXIraGEvZSp2LFMueD1QKk1hdGguY29zKGEpLFMueT1QKk1hdGguc2luKGEpLEUucHVzaChTLngsUy55LFMueiksRi5wdXNoKDAsMCwxKSxWLng9KFMueC9jKzEpLzIsVi55PShTLnkvYysxKS8yLEoucHVzaChWLngsVi55KTtQKz1SfWZvcihXPTA7VzxnO1crKylmb3IoYz1XKihlKzEpLGhhPTA7aGE8ZTtoYSsrKWE9aGErYyxyPWErZSsxLHY9YStlKzIsUD1hKzEsei5wdXNoKGEscixQKSx6LnB1c2gocix2LFApO3RoaXMuc2V0SW5kZXgoeik7CnRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShGLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShKLDIpKX1mdW5jdGlvbiBVZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6YSxzZWdtZW50czpjLHBoaVN0YXJ0OmUscGhpTGVuZ3RoOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBPZShhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gT2UoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmEsc2VnbWVudHM6YyxwaGlTdGFydDplLHBoaUxlbmd0aDpnfTtjPU1hdGguZmxvb3IoYyl8fDEyO2U9ZXx8MDtnPWd8fDIqTWF0aC5QSTtnPWhiLmNsYW1wKGcsMCwyKk1hdGguUEkpO3ZhciByPQpbXSx2PVtdLHo9W10sRT0xL2MsRj1uZXcgayxKPW5ldyBmLFA7Zm9yKFA9MDtQPD1jO1ArKyl7dmFyIFI9ZStQKkUqZzt2YXIgUz1NYXRoLnNpbihSKSxWPU1hdGguY29zKFIpO2ZvcihSPTA7Ujw9YS5sZW5ndGgtMTtSKyspRi54PWFbUl0ueCpTLEYueT1hW1JdLnksRi56PWFbUl0ueCpWLHYucHVzaChGLngsRi55LEYueiksSi54PVAvYyxKLnk9Ui8oYS5sZW5ndGgtMSksei5wdXNoKEoueCxKLnkpfWZvcihQPTA7UDxjO1ArKylmb3IoUj0wO1I8YS5sZW5ndGgtMTtSKyspZT1SK1AqYS5sZW5ndGgsRT1lK2EubGVuZ3RoLEY9ZSthLmxlbmd0aCsxLEo9ZSsxLHIucHVzaChlLEUsSiksci5wdXNoKEUsRixKKTt0aGlzLnNldEluZGV4KHIpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHosMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtpZihnPT09MipNYXRoLlBJKWZvcihnPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksCnI9bmV3IGssdj1uZXcgayx6PW5ldyBrLGU9YyphLmxlbmd0aCozLFI9UD0wO1A8YS5sZW5ndGg7UCsrLFIrPTMpci54PWdbUiswXSxyLnk9Z1tSKzFdLHIuej1nW1IrMl0sdi54PWdbZStSKzBdLHYueT1nW2UrUisxXSx2Lno9Z1tlK1IrMl0sei5hZGRWZWN0b3JzKHIsdikubm9ybWFsaXplKCksZ1tSKzBdPWdbZStSKzBdPXoueCxnW1IrMV09Z1tlK1IrMV09ei55LGdbUisyXT1nW2UrUisyXT16Lnp9ZnVuY3Rpb24gVmQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSI7Im9iamVjdCI9PT10eXBlb2YgYyYmKGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKSxjPWMuY3VydmVTZWdtZW50cyk7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxjdXJ2ZVNlZ21lbnRzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBXZChhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBXZChhLApjKXtmdW5jdGlvbiBlKFApe3ZhciBSLFM9ci5sZW5ndGgvMztQPVAuZXh0cmFjdFBvaW50cyhjKTt2YXIgVj1QLnNoYXBlLFc9UC5ob2xlczshMT09PWVkLmlzQ2xvY2tXaXNlKFYpJiYoVj1WLnJldmVyc2UoKSk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspe3ZhciBoYT1XW1BdOyEwPT09ZWQuaXNDbG9ja1dpc2UoaGEpJiYoV1tQXT1oYS5yZXZlcnNlKCkpfXZhciBmYT1lZC50cmlhbmd1bGF0ZVNoYXBlKFYsVyk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspaGE9V1tQXSxWPVYuY29uY2F0KGhhKTtQPTA7Zm9yKFI9Vi5sZW5ndGg7UDxSO1ArKyloYT1WW1BdLHIucHVzaChoYS54LGhhLnksMCksdi5wdXNoKDAsMCwxKSx6LnB1c2goaGEueCxoYS55KTtQPTA7Zm9yKFI9ZmEubGVuZ3RoO1A8UjtQKyspVj1mYVtQXSxnLnB1c2goVlswXStTLFZbMV0rUyxWWzJdK1MpLEYrPTN9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3NoYXBlczphLGN1cnZlU2VnbWVudHM6Y307Yz1jfHwxMjt2YXIgZz1bXSxyPVtdLHY9W10sej1bXSxFPTAsRj0wO2lmKCExPT09QXJyYXkuaXNBcnJheShhKSllKGEpO2Vsc2UgZm9yKHZhciBKPTA7SjxhLmxlbmd0aDtKKyspZShhW0pdKSx0aGlzLmFkZEdyb3VwKEUsRixKKSxFKz1GLEY9MDt0aGlzLnNldEluZGV4KGcpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYSh2LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYSh6LDIpKX1mdW5jdGlvbiBOaihhLGMpe2Muc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMuc2hhcGVzLnB1c2goYVtlXS51dWlkKTtlbHNlIGMuc2hhcGVzLnB1c2goYS51dWlkKTtyZXR1cm4gY31mdW5jdGlvbiBQZShhLGMpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9Cnt0aHJlc2hvbGRBbmdsZTpjfTt2YXIgZT1bXTtjPU1hdGguY29zKGhiLkRFRzJSQUQqKHZvaWQgMCE9PWM/YzoxKSk7dmFyIGc9WzAsMF0scj17fSx2PVsiYSIsImIiLCJjIl07aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgej1uZXcgeWE7ei5mcm9tQnVmZmVyR2VvbWV0cnkoYSl9ZWxzZSB6PWEuY2xvbmUoKTt6Lm1lcmdlVmVydGljZXMoKTt6LmNvbXB1dGVGYWNlTm9ybWFscygpO2E9ei52ZXJ0aWNlczt6PXouZmFjZXM7Zm9yKHZhciBFPTAsRj16Lmxlbmd0aDtFPEY7RSsrKWZvcih2YXIgSj16W0VdLFA9MDszPlA7UCsrKXt2YXIgUj1KW3ZbUF1dO3ZhciBTPUpbdlsoUCsxKSUzXV07Z1swXT1NYXRoLm1pbihSLFMpO2dbMV09TWF0aC5tYXgoUixTKTtSPWdbMF0rIiwiK2dbMV07dm9pZCAwPT09cltSXT9yW1JdPXtpbmRleDE6Z1swXSxpbmRleDI6Z1sxXSxmYWNlMTpFLGZhY2UyOnZvaWQgMH06cltSXS5mYWNlMj1FfWZvcihSIGluIHIpaWYoZz1yW1JdLHZvaWQgMD09PWcuZmFjZTJ8fAp6W2cuZmFjZTFdLm5vcm1hbC5kb3QoeltnLmZhY2UyXS5ub3JtYWwpPD1jKXY9YVtnLmluZGV4MV0sZS5wdXNoKHYueCx2Lnksdi56KSx2PWFbZy5pbmRleDJdLGUucHVzaCh2Lngsdi55LHYueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoZSwzKSl9ZnVuY3Rpb24gWGQoYSxjLGUsZyxyLHYseixFKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3lsaW5kZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXNUb3A6YSxyYWRpdXNCb3R0b206YyxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpnLGhlaWdodFNlZ21lbnRzOnIsb3BlbkVuZGVkOnYsdGhldGFTdGFydDp6LHRoZXRhTGVuZ3RoOkV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBmZChhLGMsZSxnLHIsdix6LEUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBmZChhLGMsZSxnLHIsdix6LEUpe2Z1bmN0aW9uIEYocGEpe3ZhciBxYSx1YT1uZXcgZixvYT1uZXcgayx0YT0wLEJhPSEwPT09CnBhP2E6YyxUYT0hMD09PXBhPzE6LTE7dmFyIFVhPVc7Zm9yKHFhPTE7cWE8PWc7cWErKylSLnB1c2goMCxmYSpUYSwwKSxTLnB1c2goMCxUYSwwKSxWLnB1c2goLjUsLjUpLFcrKzt2YXIgQ2E9Vztmb3IocWE9MDtxYTw9ZztxYSsrKXt2YXIgSGE9cWEvZypFK3osRGE9TWF0aC5jb3MoSGEpO0hhPU1hdGguc2luKEhhKTtvYS54PUJhKkhhO29hLnk9ZmEqVGE7b2Euej1CYSpEYTtSLnB1c2gob2EueCxvYS55LG9hLnopO1MucHVzaCgwLFRhLDApO3VhLng9LjUqRGErLjU7dWEueT0uNSpIYSpUYSsuNTtWLnB1c2godWEueCx1YS55KTtXKyt9Zm9yKHFhPTA7cWE8ZztxYSsrKXVhPVVhK3FhLG9hPUNhK3FhLCEwPT09cGE/UC5wdXNoKG9hLG9hKzEsdWEpOlAucHVzaChvYSsxLG9hLHVhKSx0YSs9MztKLmFkZEdyb3VwKHJhLHRhLCEwPT09cGE/MToyKTtyYSs9dGF9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmEsCnJhZGl1c0JvdHRvbTpjLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixvcGVuRW5kZWQ6dix0aGV0YVN0YXJ0OnosdGhldGFMZW5ndGg6RX07dmFyIEo9dGhpczthPXZvaWQgMCE9PWE/YToxO2M9dm9pZCAwIT09Yz9jOjE7ZT1lfHwxO2c9TWF0aC5mbG9vcihnKXx8ODtyPU1hdGguZmxvb3Iocil8fDE7dj12b2lkIDAhPT12P3Y6ITE7ej12b2lkIDAhPT16P3o6MDtFPXZvaWQgMCE9PUU/RToyKk1hdGguUEk7dmFyIFA9W10sUj1bXSxTPVtdLFY9W10sVz0wLGhhPVtdLGZhPWUvMixyYT0wOyhmdW5jdGlvbigpe3ZhciBwYSxxYSx1YT1uZXcgayxvYT1uZXcgayx0YT0wLEJhPShjLWEpL2U7Zm9yKHFhPTA7cWE8PXI7cWErKyl7dmFyIFRhPVtdLFVhPXFhL3IsQ2E9VWEqKGMtYSkrYTtmb3IocGE9MDtwYTw9ZztwYSsrKXt2YXIgSGE9cGEvZyxEYT1IYSpFK3osTWE9TWF0aC5zaW4oRGEpO0RhPU1hdGguY29zKERhKTtvYS54PUNhKk1hO29hLnk9LVVhKmUrZmE7Cm9hLno9Q2EqRGE7Ui5wdXNoKG9hLngsb2EueSxvYS56KTt1YS5zZXQoTWEsQmEsRGEpLm5vcm1hbGl6ZSgpO1MucHVzaCh1YS54LHVhLnksdWEueik7Vi5wdXNoKEhhLDEtVWEpO1RhLnB1c2goVysrKX1oYS5wdXNoKFRhKX1mb3IocGE9MDtwYTxnO3BhKyspZm9yKHFhPTA7cWE8cjtxYSsrKXVhPWhhW3FhKzFdW3BhXSxvYT1oYVtxYSsxXVtwYSsxXSxCYT1oYVtxYV1bcGErMV0sUC5wdXNoKGhhW3FhXVtwYV0sdWEsQmEpLFAucHVzaCh1YSxvYSxCYSksdGErPTY7Si5hZGRHcm91cChyYSx0YSwwKTtyYSs9dGF9KSgpOyExPT09diYmKDA8YSYmRighMCksMDxjJiZGKCExKSk7dGhpcy5zZXRJbmRleChQKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShSLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gVmYoYSxjLGUsZyxyLHYseil7WGQuY2FsbCh0aGlzLAowLGEsYyxlLGcscix2LHopO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZyxvcGVuRW5kZWQ6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gV2YoYSxjLGUsZyxyLHYseil7ZmQuY2FsbCh0aGlzLDAsYSxjLGUsZyxyLHYseik7dGhpcy50eXBlPSJDb25lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsaGVpZ2h0OmMscmFkaWFsU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpnLG9wZW5FbmRlZDpyLHRoZXRhU3RhcnQ6dix0aGV0YUxlbmd0aDp6fX1mdW5jdGlvbiBYZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsc2VnbWVudHM6Yyx0aGV0YVN0YXJ0OmUsdGhldGFMZW5ndGg6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFFlKGEsCmMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUWUoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHNlZ21lbnRzOmMsdGhldGFTdGFydDplLHRoZXRhTGVuZ3RoOmd9O2E9YXx8MTtjPXZvaWQgMCE9PWM/TWF0aC5tYXgoMyxjKTo4O2U9dm9pZCAwIT09ZT9lOjA7Zz12b2lkIDAhPT1nP2c6MipNYXRoLlBJO3ZhciByPVtdLHY9W10sej1bXSxFPVtdLEYsSj1uZXcgayxQPW5ldyBmO3YucHVzaCgwLDAsMCk7ei5wdXNoKDAsMCwxKTtFLnB1c2goLjUsLjUpO3ZhciBSPTA7Zm9yKEY9MztSPD1jO1IrKyxGKz0zKXt2YXIgUz1lK1IvYypnO0oueD1hKk1hdGguY29zKFMpO0oueT1hKk1hdGguc2luKFMpO3YucHVzaChKLngsSi55LEoueik7ei5wdXNoKDAsMCwxKTtQLng9KHZbRl0vYSsxKS8yO1AueT0odltGKzFdL2ErMSkvMjtFLnB1c2goUC54LFAueSl9Zm9yKEY9MTtGPD0KYztGKyspci5wdXNoKEYsRisxLDApO3RoaXMuc2V0SW5kZXgocik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKHosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKEUsMikpfWZ1bmN0aW9uIFlkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRvd01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDApO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUmUoYSl7cWIuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifWZ1bmN0aW9uIFNjKGEpe00uY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1ldGFsbmVzcz10aGlzLnJvdWdobmVzcz0uNTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPQpudWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMubWV0YWxuZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwPW51bGw7dGhpcy5lbnZNYXBJbnRlbnNpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0KInJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFpkKGEpe1NjLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCI7dGhpcy5yZWZsZWN0aXZpdHk9LjU7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXQ9MDt0aGlzLnNoZWVuPW51bGw7dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGw7dGhpcy50cmFuc3BhcmVuY3k9MDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBCYyhhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5zcGVjdWxhcj1uZXcgSSgxMTE4NDgxKTt0aGlzLnNoaW5pbmVzcz0zMDt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPQoicm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gJGQoYSl7QmMuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1RPT046IiJ9O3RoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCI7dGhpcy5ncmFkaWVudE1hcD1udWxsO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGFlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hOb3JtYWxNYXRlcmlhbCI7dGhpcy5idW1wTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPQp0aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGJlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjsKdGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBjZShhKXtNLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmJ1bXBNYXA9dGhpcy5tYXA9dGhpcy5tYXRjYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuYWxwaGFNYXA9bnVsbDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGRlKGEpe0ZiLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIG9jKGEsYyxlLGcpe3RoaXMucGFyYW1ldGVyUG9zaXRpb25zPWE7dGhpcy5fY2FjaGVkSW5kZXg9MDt0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1nP2c6bmV3IGMuY29uc3RydWN0b3IoZSk7dGhpcy5zYW1wbGVWYWx1ZXM9Yzt0aGlzLnZhbHVlU2l6ZT1lfWZ1bmN0aW9uIEVnKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKTt0aGlzLl9vZmZzZXROZXh0PXRoaXMuX3dlaWdodE5leHQ9dGhpcy5fb2Zmc2V0UHJldj10aGlzLl93ZWlnaHRQcmV2PS0wfWZ1bmN0aW9uIFlmKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBGZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWGIoYSxjLGUsZyl7aWYodm9pZCAwPT09YSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKaWYodm9pZCAwPT09Y3x8MD09PWMubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIithKTt0aGlzLm5hbWU9YTt0aGlzLnRpbWVzPVRiLmNvbnZlcnRBcnJheShjLHRoaXMuVGltZUJ1ZmZlclR5cGUpO3RoaXMudmFsdWVzPVRiLmNvbnZlcnRBcnJheShlLHRoaXMuVmFsdWVCdWZmZXJUeXBlKTt0aGlzLnNldEludGVycG9sYXRpb24oZ3x8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gR2coYSxjLGUpe1hiLmNhbGwodGhpcyxhLGMsZSl9ZnVuY3Rpb24gSGcoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFNlKGEsYyxlLGcpe1hiLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBJZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWmYoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIEpnKGEsYyxlLGcpe1hiLmNhbGwodGhpcywKYSxjLGUsZyl9ZnVuY3Rpb24gVGUoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIHRjKGEsYyxlKXt0aGlzLm5hbWU9YTt0aGlzLnRyYWNrcz1lO3RoaXMuZHVyYXRpb249dm9pZCAwIT09Yz9jOi0xO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTswPnRoaXMuZHVyYXRpb24mJnRoaXMucmVzZXREdXJhdGlvbigpfWZ1bmN0aW9uIG1tKGEpe3N3aXRjaChhLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInNjYWxhciI6Y2FzZSAiZG91YmxlIjpjYXNlICJmbG9hdCI6Y2FzZSAibnVtYmVyIjpjYXNlICJpbnRlZ2VyIjpyZXR1cm4gU2U7Y2FzZSAidmVjdG9yIjpjYXNlICJ2ZWN0b3IyIjpjYXNlICJ2ZWN0b3IzIjpjYXNlICJ2ZWN0b3I0IjpyZXR1cm4gVGU7Y2FzZSAiY29sb3IiOnJldHVybiBIZztjYXNlICJxdWF0ZXJuaW9uIjpyZXR1cm4gWmY7Y2FzZSAiYm9vbCI6Y2FzZSAiYm9vbGVhbiI6cmV0dXJuIEdnO2Nhc2UgInN0cmluZyI6cmV0dXJuIEpnfXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIisKYSk7fWZ1bmN0aW9uIG5tKGEpe2lmKHZvaWQgMD09PWEudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTt2YXIgYz1tbShhLnR5cGUpO2lmKHZvaWQgMD09PWEudGltZXMpe3ZhciBlPVtdLGc9W107VGIuZmxhdHRlbkpTT04oYS5rZXlzLGUsZywidmFsdWUiKTthLnRpbWVzPWU7YS52YWx1ZXM9Z31yZXR1cm4gdm9pZCAwIT09Yy5wYXJzZT9jLnBhcnNlKGEpOm5ldyBjKGEubmFtZSxhLnRpbWVzLGEudmFsdWVzLGEuaW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gJGgoYSxjLGUpe3ZhciBnPXRoaXMscj0hMSx2PTAsej0wLEU9dm9pZCAwO3RoaXMub25TdGFydD12b2lkIDA7dGhpcy5vbkxvYWQ9YTt0aGlzLm9uUHJvZ3Jlc3M9Yzt0aGlzLm9uRXJyb3I9ZTt0aGlzLml0ZW1TdGFydD1mdW5jdGlvbihGKXt6Kys7aWYoITE9PT1yJiZ2b2lkIDAhPT1nLm9uU3RhcnQpZy5vblN0YXJ0KEYsdix6KTtyPSEwfTsKdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEYpe3YrKztpZih2b2lkIDAhPT1nLm9uUHJvZ3Jlc3MpZy5vblByb2dyZXNzKEYsdix6KTtpZih2PT09eiYmKHI9ITEsdm9pZCAwIT09Zy5vbkxvYWQpKWcub25Mb2FkKCl9O3RoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKEYpe2lmKHZvaWQgMCE9PWcub25FcnJvcilnLm9uRXJyb3IoRil9O3RoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbihGKXtyZXR1cm4gRT9FKEYpOkZ9O3RoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24oRil7RT1GO3JldHVybiB0aGlzfX1mdW5jdGlvbiBEYihhKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09YT9hOk9qO3RoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyI7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5wYXRoPSIifWZ1bmN0aW9uIHVjKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBhaShhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYmkoYSl7RGIuY2FsbCh0aGlzLGEpO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIEtnKGEpe0RiLmNhbGwodGhpcywKYSk7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gVWUoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIExnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBNZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gWmEoKXt0aGlzLnR5cGU9IkN1cnZlIjt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9ZnVuY3Rpb24gcGMoYSxjLGUsZyxyLHYseixFKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWxsaXBzZUN1cnZlIjt0aGlzLmFYPWF8fDA7dGhpcy5hWT1jfHwwO3RoaXMueFJhZGl1cz1lfHwxO3RoaXMueVJhZGl1cz1nfHwxO3RoaXMuYVN0YXJ0QW5nbGU9cnx8MDt0aGlzLmFFbmRBbmdsZT12fHwyKk1hdGguUEk7dGhpcy5hQ2xvY2t3aXNlPXp8fCExO3RoaXMuYVJvdGF0aW9uPUV8fDB9ZnVuY3Rpb24gVmUoYSxjLGUsZyxyLHYpe3BjLmNhbGwodGhpcyxhLGMsZSxlLGcscix2KTt0aGlzLnR5cGU9IkFyY0N1cnZlIn1mdW5jdGlvbiBjaSgpe2Z1bmN0aW9uIGEodix6LEUsCkYpe2M9djtlPUU7Zz0tMyp2KzMqei0yKkUtRjtyPTIqdi0yKnorRStGfXZhciBjPTAsZT0wLGc9MCxyPTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSil7YSh6LEUsSiooRS12KSxKKihGLXopKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSixQLFIpe2EoeixFLCgoei12KS9KLShFLXYpLyhKK1ApKyhFLXopL1ApKlAsKChFLXopL1AtKEYteikvKFArUikrKEYtRSkvUikqUCl9LGNhbGM6ZnVuY3Rpb24odil7dmFyIHo9dip2O3JldHVybiBjK2UqditnKnorcip6KnZ9fX1mdW5jdGlvbiBaYihhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyI7dGhpcy5wb2ludHM9YXx8W107dGhpcy5jbG9zZWQ9Y3x8ITE7dGhpcy5jdXJ2ZVR5cGU9ZXx8ImNlbnRyaXBldGFsIjt0aGlzLnRlbnNpb249Z3x8LjV9ZnVuY3Rpb24gUGooYSxjLGUsZyxyKXtjPS41KihnLWMpO3I9LjUqKHItZSk7dmFyIHY9CmEqYTtyZXR1cm4oMiplLTIqZytjK3IpKmEqdisoLTMqZSszKmctMipjLXIpKnYrYyphK2V9ZnVuY3Rpb24gb20oYSxjKXthPTEtYTtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gcG0oYSxjKXtyZXR1cm4gMiooMS1hKSphKmN9ZnVuY3Rpb24gcW0oYSxjKXtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gJGYoYSxjLGUsZyl7cmV0dXJuIG9tKGEsYykrcG0oYSxlKStxbShhLGcpfWZ1bmN0aW9uIHJtKGEsYyl7YT0xLWE7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gc20oYSxjKXt2YXIgZT0xLWE7cmV0dXJuIDMqZSplKmEqY31mdW5jdGlvbiB0bShhLGMpe3JldHVybiAzKigxLWEpKmEqYSpjfWZ1bmN0aW9uIHVtKGEsYyl7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gYWcoYSxjLGUsZyxyKXtyZXR1cm4gcm0oYSxjKStzbShhLGUpK3RtKGEsZykrdW0oYSxyKX1mdW5jdGlvbiBDYyhhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1hfHxuZXcgZjsKdGhpcy52MT1jfHxuZXcgZjt0aGlzLnYyPWV8fG5ldyBmO3RoaXMudjM9Z3x8bmV3IGZ9ZnVuY3Rpb24gVGMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWF8fG5ldyBrO3RoaXMudjE9Y3x8bmV3IGs7dGhpcy52Mj1lfHxuZXcgazt0aGlzLnYzPWd8fG5ldyBrfWZ1bmN0aW9uIGtjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZSI7dGhpcy52MT1hfHxuZXcgZjt0aGlzLnYyPWN8fG5ldyBmfWZ1bmN0aW9uIERjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiO3RoaXMudjE9YXx8bmV3IGs7dGhpcy52Mj1jfHxuZXcga31mdW5jdGlvbiBFYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIjt0aGlzLnYwPWF8fG5ldyBmO3RoaXMudjE9Y3x8bmV3IGY7dGhpcy52Mj1lfHxuZXcgZn1mdW5jdGlvbiBVYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTsKdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9YXx8bmV3IGs7dGhpcy52MT1jfHxuZXcgazt0aGlzLnYyPWV8fG5ldyBrfWZ1bmN0aW9uIEZjKGEpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSI7dGhpcy5wb2ludHM9YXx8W119ZnVuY3Rpb24gZ2QoKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3VydmVQYXRoIjt0aGlzLmN1cnZlcz1bXTt0aGlzLmF1dG9DbG9zZT0hMX1mdW5jdGlvbiBHYyhhKXtnZC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGF0aCI7dGhpcy5jdXJyZW50UG9pbnQ9bmV3IGY7YSYmdGhpcy5zZXRGcm9tUG9pbnRzKGEpfWZ1bmN0aW9uIENkKGEpe0djLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy50eXBlPSJTaGFwZSI7dGhpcy5ob2xlcz1bXX1mdW5jdGlvbiBKYihhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpZ2h0Ijt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuaW50ZW5zaXR5PQp2b2lkIDAhPT1jP2M6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIE5nKGEsYyxlKXtKYi5jYWxsKHRoaXMsYSxlKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PXZvaWQgMDt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy5ncm91bmRDb2xvcj1uZXcgSShjKX1mdW5jdGlvbiBWYyhhKXt0aGlzLmNhbWVyYT1hO3RoaXMuYmlhcz0wO3RoaXMucmFkaXVzPTE7dGhpcy5tYXBTaXplPW5ldyBmKDUxMiw1MTIpO3RoaXMubWFwUGFzcz10aGlzLm1hcD1udWxsO3RoaXMubWF0cml4PW5ldyBxO3RoaXMuX2ZydXN0dW09bmV3IGljO3RoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgZigxLDEpO3RoaXMuX3ZpZXdwb3J0Q291bnQ9MTt0aGlzLl92aWV3cG9ydHM9W25ldyBwKDAsMCwxLDEpXX1mdW5jdGlvbiBPZygpe1ZjLmNhbGwodGhpcyxuZXcgdmIoNTAsMSwuNSw1MDApKX1mdW5jdGlvbiBQZyhhLApjLGUsZyxyLHYpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IEE7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBvd2VyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbih6KXt0aGlzLmludGVuc2l0eT16L01hdGguUEl9fSk7dGhpcy5kaXN0YW5jZT12b2lkIDAhPT1lP2U6MDt0aGlzLmFuZ2xlPXZvaWQgMCE9PWc/ZzpNYXRoLlBJLzM7dGhpcy5wZW51bWJyYT12b2lkIDAhPT1yP3I6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PXY/djoxO3RoaXMuc2hhZG93PW5ldyBPZ31mdW5jdGlvbiBkaSgpe1ZjLmNhbGwodGhpcyxuZXcgdmIoOTAsMSwuNSw1MDApKTt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGYoNCwyKTt0aGlzLl92aWV3cG9ydENvdW50PTY7dGhpcy5fdmlld3BvcnRzPVtuZXcgcCgyLAoxLDEsMSksbmV3IHAoMCwxLDEsMSksbmV3IHAoMywxLDEsMSksbmV3IHAoMSwxLDEsMSksbmV3IHAoMywwLDEsMSksbmV3IHAoMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgaygxLDAsMCksbmV3IGsoLTEsMCwwKSxuZXcgaygwLDAsMSksbmV3IGsoMCwwLC0xKSxuZXcgaygwLDEsMCksbmV3IGsoMCwtMSwwKV07dGhpcy5fY3ViZVVwcz1bbmV3IGsoMCwxLDApLG5ldyBrKDAsMSwwKSxuZXcgaygwLDEsMCksbmV3IGsoMCwxLDApLG5ldyBrKDAsMCwxKSxuZXcgaygwLDAsLTEpXX1mdW5jdGlvbiBRZyhhLGMsZSxnKXtKYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlBvaW50TGlnaHQiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiA0KnRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbihyKXt0aGlzLmludGVuc2l0eT1yLyg0Kk1hdGguUEkpfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09ZT8KZTowO3RoaXMuZGVjYXk9dm9pZCAwIT09Zz9nOjE7dGhpcy5zaGFkb3c9bmV3IGRpfWZ1bmN0aW9uIGJnKGEsYyxlLGcscix2KXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjt0aGlzLnpvb209MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmxlZnQ9dm9pZCAwIT09YT9hOi0xO3RoaXMucmlnaHQ9dm9pZCAwIT09Yz9jOjE7dGhpcy50b3A9dm9pZCAwIT09ZT9lOjE7dGhpcy5ib3R0b209dm9pZCAwIT09Zz9nOi0xO3RoaXMubmVhcj12b2lkIDAhPT1yP3I6LjE7dGhpcy5mYXI9dm9pZCAwIT09dj92OjJFMzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBSZygpe1ZjLmNhbGwodGhpcyxuZXcgYmcoLTUsNSw1LC01LC41LDUwMCkpfWZ1bmN0aW9uIFNnKGEsYyl7SmIuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7CnRoaXMudGFyZ2V0PW5ldyBBO3RoaXMuc2hhZG93PW5ldyBSZ31mdW5jdGlvbiBUZyhhLGMpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFVnKGEsYyxlLGcpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodCI7dGhpcy53aWR0aD12b2lkIDAhPT1lP2U6MTA7dGhpcy5oZWlnaHQ9dm9pZCAwIT09Zz9nOjEwfWZ1bmN0aW9uIFZnKGEpe0RiLmNhbGwodGhpcyxhKTt0aGlzLnRleHR1cmVzPXt9fWZ1bmN0aW9uIFdnKCl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLm1heEluc3RhbmNlZENvdW50PXZvaWQgMH1mdW5jdGlvbiBYZyhhLGMsZSxnKXsibnVtYmVyIj09PXR5cGVvZiBlJiYoZz1lLGU9ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpOwpRLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWd8fDF9ZnVuY3Rpb24gWWcoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIFpnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBlaShhKXsidW5kZWZpbmVkIj09PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpOyJ1bmRlZmluZWQiPT09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIik7RGIuY2FsbCh0aGlzLGEpO3RoaXMub3B0aW9ucz12b2lkIDB9ZnVuY3Rpb24gZmkoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCI7dGhpcy5jb2xvcj1uZXcgSTt0aGlzLnN1YlBhdGhzPVtdO3RoaXMuY3VycmVudFBhdGg9bnVsbH1mdW5jdGlvbiBnaShhKXt0aGlzLnR5cGU9IkZvbnQiO3RoaXMuZGF0YT0KYX1mdW5jdGlvbiB2bShhLGMsZSl7YT1BcnJheS5mcm9tP0FycmF5LmZyb20oYSk6U3RyaW5nKGEpLnNwbGl0KCIiKTtjLz1lLnJlc29sdXRpb247Zm9yKHZhciBnPShlLmJvdW5kaW5nQm94LnlNYXgtZS5ib3VuZGluZ0JveC55TWluK2UudW5kZXJsaW5lVGhpY2tuZXNzKSpjLHI9W10sdj0wLHo9MCxFPTA7RTxhLmxlbmd0aDtFKyspe3ZhciBGPWFbRV07IlxuIj09PUY/KHY9MCx6LT1nKTooRj13bShGLGMsdix6LGUpLHYrPUYub2Zmc2V0WCxyLnB1c2goRi5wYXRoKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gd20oYSxjLGUsZyxyKXt2YXIgdj1yLmdseXBoc1thXXx8ci5nbHlwaHNbIj8iXTtpZih2KXthPW5ldyBmaTtpZih2Lm8pe3I9di5fY2FjaGVkT3V0bGluZXx8KHYuX2NhY2hlZE91dGxpbmU9di5vLnNwbGl0KCIgIikpO2Zvcih2YXIgej0wLEU9ci5sZW5ndGg7ejxFOylzd2l0Y2goclt6KytdKXtjYXNlICJtIjp2YXIgRj1yW3orK10qYytlO3ZhciBKPXJbeisrXSpjK2c7YS5tb3ZlVG8oRiwKSik7YnJlYWs7Y2FzZSAibCI6Rj1yW3orK10qYytlO0o9clt6KytdKmMrZzthLmxpbmVUbyhGLEopO2JyZWFrO2Nhc2UgInEiOkY9clt6KytdKmMrZTtKPXJbeisrXSpjK2c7dmFyIFA9clt6KytdKmMrZTt2YXIgUj1yW3orK10qYytnO2EucXVhZHJhdGljQ3VydmVUbyhQLFIsRixKKTticmVhaztjYXNlICJiIjpGPXJbeisrXSpjK2U7Sj1yW3orK10qYytnO1A9clt6KytdKmMrZTtSPXJbeisrXSpjK2c7dmFyIFM9clt6KytdKmMrZTt2YXIgVj1yW3orK10qYytnO2EuYmV6aWVyQ3VydmVUbyhQLFIsUyxWLEYsSil9fXJldHVybntvZmZzZXRYOnYuaGEqYyxwYXRoOmF9fWNvbnNvbGUuZXJyb3IoJ1RIUkVFLkZvbnQ6IGNoYXJhY3RlciAiJythKyciIGRvZXMgbm90IGV4aXN0cyBpbiBmb250IGZhbWlseSAnK3IuZmFtaWx5TmFtZSsiLiIpfWZ1bmN0aW9uIGhpKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiAkZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYWgoKXt0aGlzLmNvZWZmaWNpZW50cz0KW107Zm9yKHZhciBhPTA7OT5hO2ErKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBrKX1mdW5jdGlvbiBIYyhhLGMpe0piLmNhbGwodGhpcyx2b2lkIDAsYyk7dGhpcy5zaD12b2lkIDAhPT1hP2E6bmV3IGFofWZ1bmN0aW9uIGlpKGEsYyxlKXtIYy5jYWxsKHRoaXMsdm9pZCAwLGUpO2E9KG5ldyBJKS5zZXQoYSk7ZT0obmV3IEkpLnNldChjKTtjPW5ldyBrKGEucixhLmcsYS5iKTthPW5ldyBrKGUucixlLmcsZS5iKTtlPU1hdGguc3FydChNYXRoLlBJKTt2YXIgZz1lKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoYykuYWRkKGEpLm11bHRpcGx5U2NhbGFyKGUpO3RoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoYykuc3ViKGEpLm11bHRpcGx5U2NhbGFyKGcpfWZ1bmN0aW9uIGppKGEsYyl7SGMuY2FsbCh0aGlzLHZvaWQgMCxjKTthPShuZXcgSSkuc2V0KGEpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChhLnIsYS5nLGEuYikubXVsdGlwbHlTY2FsYXIoMioKTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBRaigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xO3RoaXMuZXllU2VwPS4wNjQ7dGhpcy5jYW1lcmFMPW5ldyB2Yjt0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKTt0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNhbWVyYVI9bmV3IHZiO3RoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpO3RoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fWZ1bmN0aW9uIGtpKGEpe3RoaXMuYXV0b1N0YXJ0PXZvaWQgMCE9PWE/YTohMDt0aGlzLmVsYXBzZWRUaW1lPXRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0wO3RoaXMucnVubmluZz0hMX1mdW5jdGlvbiBsaSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiOwp0aGlzLmNvbnRleHQ9bWkuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLnRpbWVEZWx0YT0wO3RoaXMuX2Nsb2NrPW5ldyBraX1mdW5jdGlvbiBXZShhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpbyI7dGhpcy5saXN0ZW5lcj1hO3RoaXMuY29udGV4dD1hLmNvbnRleHQ7dGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7dGhpcy5nYWluLmNvbm5lY3QoYS5nZXRJbnB1dCgpKTt0aGlzLmF1dG9wbGF5PSExO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5kZXR1bmU9MDt0aGlzLmxvb3A9ITE7dGhpcy5vZmZzZXQ9dGhpcy5zdGFydFRpbWU9MDt0aGlzLmR1cmF0aW9uPXZvaWQgMDt0aGlzLnBsYXliYWNrUmF0ZT0xO3RoaXMuaXNQbGF5aW5nPSExO3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwO3RoaXMuc291cmNlVHlwZT0KImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gbmkoYSl7V2UuY2FsbCh0aGlzLGEpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiO3RoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1mdW5jdGlvbiBvaShhLGMpe3RoaXMuYW5hbHlzZXI9YS5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7dGhpcy5hbmFseXNlci5mZnRTaXplPXZvaWQgMCE9PWM/YzoyMDQ4O3RoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTthLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9ZnVuY3Rpb24gcGkoYSxjLGUpe3RoaXMuYmluZGluZz1hO3RoaXMudmFsdWVTaXplPWU7YT1GbG9hdDY0QXJyYXk7c3dpdGNoKGMpe2Nhc2UgInF1YXRlcm5pb24iOmM9dGhpcy5fc2xlcnA7YnJlYWs7Y2FzZSAic3RyaW5nIjpjYXNlICJib29sIjphPUFycmF5O2M9CnRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmM9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYSg0KmUpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1jO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH1mdW5jdGlvbiBSaihhLGMsZSl7ZT1lfHwkYi5wYXJzZVRyYWNrTmFtZShjKTt0aGlzLl90YXJnZXRHcm91cD1hO3RoaXMuX2JpbmRpbmdzPWEuc3Vic2NyaWJlXyhjLGUpfWZ1bmN0aW9uICRiKGEsYyxlKXt0aGlzLnBhdGg9Yzt0aGlzLnBhcnNlZFBhdGg9ZXx8JGIucGFyc2VUcmFja05hbWUoYyk7dGhpcy5ub2RlPSRiLmZpbmROb2RlKGEsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8YTt0aGlzLnJvb3ROb2RlPWF9ZnVuY3Rpb24gU2ooKXt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubkNhY2hlZE9iamVjdHNfPTA7dmFyIGE9Cnt9O3RoaXMuX2luZGljZXNCeVVVSUQ9YTtmb3IodmFyIGM9MCxlPWFyZ3VtZW50cy5sZW5ndGg7YyE9PWU7KytjKWFbYXJndW1lbnRzW2NdLnV1aWRdPWM7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9W107dGhpcy5fYmluZGluZ3M9W107dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O3ZhciBnPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGcuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1nLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBnLl9iaW5kaW5ncy5sZW5ndGh9fX1mdW5jdGlvbiBUaihhLGMsZSl7dGhpcy5fbWl4ZXI9YTt0aGlzLl9jbGlwPWM7dGhpcy5fbG9jYWxSb290PWV8fG51bGw7YT1jLnRyYWNrcztjPWEubGVuZ3RoO2U9QXJyYXkoYyk7Zm9yKHZhciBnPXtlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxyPTA7ciE9PQpjOysrcil7dmFyIHY9YVtyXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtlW3JdPXY7di5zZXR0aW5ncz1nfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9Zzt0aGlzLl9pbnRlcnBvbGFudHM9ZTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPUFycmF5KGMpO3RoaXMuX3dlaWdodEludGVycG9sYW50PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9dGhpcy5fY2FjaGVJbmRleD1udWxsO3RoaXMubG9vcD0yMjAxO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDt0aGlzLnRpbWU9MDt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy53ZWlnaHQ9dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMudGltZVNjYWxlPTE7dGhpcy5yZXBldGl0aW9ucz1JbmZpbml0eTt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMTt0aGlzLnplcm9TbG9wZUF0RW5kPXRoaXMuemVyb1Nsb3BlQXRTdGFydD0KITB9ZnVuY3Rpb24gcWkoYSl7dGhpcy5fcm9vdD1hO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gYmgoYSxjKXsic3RyaW5nIj09PXR5cGVvZiBhJiYoY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLiIpLGE9Yyk7dGhpcy52YWx1ZT1hfWZ1bmN0aW9uIHJpKGEsYyxlKXtRZC5jYWxsKHRoaXMsYSxjKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9ZXx8MX1mdW5jdGlvbiBVaihhLGMsZSxnKXt0aGlzLnJheT1uZXcgRChhLGMpO3RoaXMubmVhcj1lfHwwO3RoaXMuZmFyPWd8fEluZmluaXR5O3RoaXMuY2FtZXJhPW51bGw7dGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7fSxMT0Q6e30sUG9pbnRzOnt0aHJlc2hvbGQ6MX0sU3ByaXRlOnt9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnBhcmFtcyx7UG9pbnRDbG91ZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4iKTsKcmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBWaihhLGMpe3JldHVybiBhLmRpc3RhbmNlLWMuZGlzdGFuY2V9ZnVuY3Rpb24gc2koYSxjLGUsZyl7aWYoITEhPT1hLnZpc2libGUmJihhLnJheWNhc3QoYyxlKSwhMD09PWcpKXthPWEuY2hpbGRyZW47Zz0wO2Zvcih2YXIgcj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sYyxlLCEwKX19ZnVuY3Rpb24gV2ooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMucGhpPXZvaWQgMCE9PWM/YzowO3RoaXMudGhldGE9dm9pZCAwIT09ZT9lOjA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gWGooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMudGhldGE9dm9pZCAwIT09Yz9jOjA7dGhpcy55PXZvaWQgMCE9PWU/ZTowO3JldHVybiB0aGlzfWZ1bmN0aW9uIHRpKGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBmKEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGYoLUluZmluaXR5LAotSW5maW5pdHkpfWZ1bmN0aW9uIHVpKGEsYyl7dGhpcy5zdGFydD12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5lbmQ9dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIGNnKGEpe0EuY2FsbCh0aGlzKTt0aGlzLm1hdGVyaWFsPWE7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIGRnKGEsYyxlLGcpe3RoaXMub2JqZWN0PWE7dGhpcy5zaXplPXZvaWQgMCE9PWM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2NzExNjgwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9MyplLmZhY2VzLmxlbmd0aDplJiZlLmlzQnVmZmVyR2VvbWV0cnkmJihjPWUuYXR0cmlidXRlcy5ub3JtYWwuY291bnQpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX0KZnVuY3Rpb24gWGUoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy5saWdodD1hO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWM7YT1uZXcgdmE7Yz1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKHZhciBlPTAsZz0xOzMyPmU7ZSsrLGcrKyl7dmFyIHI9ZS8zMipNYXRoLlBJKjIsdj1nLzMyKk1hdGguUEkqMjtjLnB1c2goTWF0aC5jb3MociksTWF0aC5zaW4ociksMSxNYXRoLmNvcyh2KSxNYXRoLnNpbih2KSwxKX1hLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKTtjPW5ldyBGYih7Zm9nOiExfSk7dGhpcy5jb25lPW5ldyBJYihhLGMpO3RoaXMuYWRkKHRoaXMuY29uZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBZaihhKXt2YXIgYz1bXTthJiZhLmlzQm9uZSYmYy5wdXNoKGEpOwpmb3IodmFyIGU9MDtlPGEuY2hpbGRyZW4ubGVuZ3RoO2UrKyljLnB1c2guYXBwbHkoYyxZaihhLmNoaWxkcmVuW2VdKSk7cmV0dXJuIGN9ZnVuY3Rpb24gWWUoYSl7Zm9yKHZhciBjPVlqKGEpLGU9bmV3IHZhLGc9W10scj1bXSx2PW5ldyBJKDAsMCwxKSx6PW5ldyBJKDAsMSwwKSxFPTA7RTxjLmxlbmd0aDtFKyspe3ZhciBGPWNbRV07Ri5wYXJlbnQmJkYucGFyZW50LmlzQm9uZSYmKGcucHVzaCgwLDAsMCksZy5wdXNoKDAsMCwwKSxyLnB1c2godi5yLHYuZyx2LmIpLHIucHVzaCh6LnIsei5nLHouYikpfWUuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGcsMykpO2UuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKHIsMykpO2c9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6MixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0cmFuc3BhcmVudDohMH0pO0liLmNhbGwodGhpcyxlLGcpO3RoaXMucm9vdD1hO3RoaXMuYm9uZXM9Yzt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0KITF9ZnVuY3Rpb24gWmUoYSxjLGUpe3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5jb2xvcj1lO2E9bmV3IEJkKGMsNCwyKTtjPW5ldyBMKHt3aXJlZnJhbWU6ITAsZm9nOiExfSk7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiAkZShhLGMpe3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodEhlbHBlciI7dGhpcy5saWdodD1hO3RoaXMuY29sb3I9YzthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSwzKSk7YS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtjPW5ldyBGYih7Zm9nOiExfSk7VmIuY2FsbCh0aGlzLGEsYyk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLAoxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7dGhpcy5hZGQobmV3IHhhKGEsbmV3IEwoe3NpZGU6MSxmb2c6ITF9KSkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYWYoYSxjLGUpe0EuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWEubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9ZTthPW5ldyBSZChjKTthLnJvdGF0ZVkoLjUqTWF0aC5QSSk7dGhpcy5tYXRlcmlhbD1uZXcgTCh7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3ZvaWQgMD09PXRoaXMuY29sb3ImJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0yKTtjPWEuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmMuY291bnQpLDMpKTt0aGlzLmFkZChuZXcgeGEoYSx0aGlzLm1hdGVyaWFsKSk7CnRoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYmYoYSxjKXt0aGlzLmxpZ2h0UHJvYmU9YTt0aGlzLnNpemU9YzthPW5ldyBxYih7ZGVmaW5lczp7R0FNTUFfT1VUUFVUOiIifSx1bmlmb3Jtczp7c2g6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5zaC5jb2VmZmljaWVudHN9LGludGVuc2l0eTp7dmFsdWU6dGhpcy5saWdodFByb2JlLmludGVuc2l0eX19LHZlcnRleFNoYWRlcjoidmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59IixmcmFnbWVudFNoYWRlcjoiI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgbm9ybWFsLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0Ly8gbWF0cml4IGlzIGFzc3VtZWQgdG8gYmUgb3J0aG9nb25hbFxuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIG5vcm1hbCwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgbGluZWFyVG9PdXRwdXQoIGluIHZlYzMgYSApIHtcblx0I2lmZGVmIEdBTU1BX09VVFBVVFxuXHRcdHJldHVybiBwb3coIGEsIHZlYzMoIDEuMCAvIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApICk7XG5cdCNlbHNlXG5cdFx0cmV0dXJuIGE7XG5cdCNlbmRpZlxufVxuLy8gc291cmNlOiBodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9wYXBlcnMvZW52bWFwL2Vudm1hcC5wZGZcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0Ly8gYmFuZCAwXG5cdHZlYzMgcmVzdWx0IFx4M2Qgc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHQvLyBiYW5kIDFcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0Ly8gYmFuZCAyXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudW5pZm9ybSB2ZWMzIHNoWyA5IF07IC8vIHNoIGNvZWZmaWNpZW50c1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7IC8vIGxpZ2h0IHByb2JlIGludGVuc2l0eVxudmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBzaCApO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBSRUNJUFJPQ0FMX1BJICogaXJyYWRpYW5jZSAqIGludGVuc2l0eTtcblx0b3V0Z29pbmdMaWdodCBceDNkIGxpbmVhclRvT3V0cHV0KCBvdXRnb2luZ0xpZ2h0ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIDEuMCApO1xufSJ9KTsKYz1uZXcgQmQoMSwzMiwxNik7eGEuY2FsbCh0aGlzLGMsYSk7dGhpcy5vbkJlZm9yZVJlbmRlcigpfWZ1bmN0aW9uIGNoKGEsYyxlLGcpe2E9YXx8MTA7Yz1jfHwxMDtlPW5ldyBJKHZvaWQgMCE9PWU/ZTo0NDczOTI0KTtnPW5ldyBJKHZvaWQgMCE9PWc/Zzo4OTQ3ODQ4KTt2YXIgcj1jLzIsdj1hL2Msej1hLzI7YT1bXTtmb3IodmFyIEU9W10sRj0wLEo9MCxQPS16O0Y8PWM7RisrLFArPXYpe2EucHVzaCgteiwwLFAseiwwLFApO2EucHVzaChQLDAsLXosUCwwLHopO3ZhciBSPUY9PT1yP2U6ZztSLnRvQXJyYXkoRSxKKTtKKz0zO1IudG9BcnJheShFLEopO0orPTM7Ui50b0FycmF5KEUsSik7Sis9MztSLnRvQXJyYXkoRSxKKTtKKz0zfWM9bmV3IHZhO2MuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGEsMykpO2MuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO2U9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxjLGUpfWZ1bmN0aW9uIGRoKGEsCmMsZSxnLHIsdil7YT1hfHwxMDtjPWN8fDE2O2U9ZXx8ODtnPWd8fDY0O3I9bmV3IEkodm9pZCAwIT09cj9yOjQ0NzM5MjQpO3Y9bmV3IEkodm9pZCAwIT09dj92Ojg5NDc4NDgpO3ZhciB6PVtdLEU9W10sRjtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgSj1GL2MqMipNYXRoLlBJO3ZhciBQPU1hdGguc2luKEopKmE7Sj1NYXRoLmNvcyhKKSphO3oucHVzaCgwLDAsMCk7ei5wdXNoKFAsMCxKKTt2YXIgUj1GJjE/cjp2O0UucHVzaChSLnIsUi5nLFIuYik7RS5wdXNoKFIucixSLmcsUi5iKX1mb3IoRj0wO0Y8PWU7RisrKXtSPUYmMT9yOnY7dmFyIFM9YS1hL2UqRjtmb3IoYz0wO2M8ZztjKyspSj1jL2cqMipNYXRoLlBJLFA9TWF0aC5zaW4oSikqUyxKPU1hdGguY29zKEopKlMsei5wdXNoKFAsMCxKKSxFLnB1c2goUi5yLFIuZyxSLmIpLEo9KGMrMSkvZyoyKk1hdGguUEksUD1NYXRoLnNpbihKKSpTLEo9TWF0aC5jb3MoSikqUyx6LnB1c2goUCwwLEopLEUucHVzaChSLnIsUi5nLFIuYil9YT0KbmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHosMykpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO3o9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxhLHopfWZ1bmN0aW9uIGNmKGEsYyxlLGcpe3RoaXMuYXVkaW89YTt0aGlzLnJhbmdlPWN8fDE7dGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlPWV8fDE2O3RoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZT1nfHwyO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKigzKih0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUrMip0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUpKzMpKSwzKSk7Yz1uZXcgRmIoe2NvbG9yOjY1MjgwfSk7ZT1uZXcgRmIoe2NvbG9yOjE2Nzc2OTYwfSk7VmIuY2FsbCh0aGlzLGEsW2UsY10pO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZWcoYSxjLGUsZyl7dGhpcy5vYmplY3Q9YTt0aGlzLnNpemU9dm9pZCAwIT09CmM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2Nzc2OTYwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9ZS5mYWNlcy5sZW5ndGg6Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLiIpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBkZihhLGMsZSl7QS5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1lOwp2b2lkIDA9PT1jJiYoYz0xKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbLWMsYywwLGMsYywwLGMsLWMsMCwtYywtYywwLC1jLGMsMF0sMykpO2M9bmV3IEZiKHtmb2c6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy5saWdodFBsYW5lKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMCwwLDAsMCwwLDFdLDMpKTt0aGlzLnRhcmdldExpbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGZnKGEpe2Z1bmN0aW9uIGMoVixXLGhhKXtlKFYsaGEpO2UoVyxoYSl9ZnVuY3Rpb24gZShWLFcpe3YucHVzaCgwLDAsMCk7ei5wdXNoKFcucixXLmcsVy5iKTt2b2lkIDA9PT1FW1ZdJiYoRVtWXT1bXSk7RVtWXS5wdXNoKHYubGVuZ3RoLzMtMSl9dmFyIGc9bmV3IHZhLHI9bmV3IEZiKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6MX0pLAp2PVtdLHo9W10sRT17fSxGPW5ldyBJKDE2NzU1MjAwKSxKPW5ldyBJKDE2NzExNjgwKSxQPW5ldyBJKDQzNzc1KSxSPW5ldyBJKDE2Nzc3MjE1KSxTPW5ldyBJKDMzNTU0NDMpO2MoIm4xIiwibjIiLEYpO2MoIm4yIiwibjQiLEYpO2MoIm40IiwibjMiLEYpO2MoIm4zIiwibjEiLEYpO2MoImYxIiwiZjIiLEYpO2MoImYyIiwiZjQiLEYpO2MoImY0IiwiZjMiLEYpO2MoImYzIiwiZjEiLEYpO2MoIm4xIiwiZjEiLEYpO2MoIm4yIiwiZjIiLEYpO2MoIm4zIiwiZjMiLEYpO2MoIm40IiwiZjQiLEYpO2MoInAiLCJuMSIsSik7YygicCIsIm4yIixKKTtjKCJwIiwibjMiLEopO2MoInAiLCJuNCIsSik7YygidTEiLCJ1MiIsUCk7YygidTIiLCJ1MyIsUCk7YygidTMiLCJ1MSIsUCk7YygiYyIsInQiLFIpO2MoInAiLCJjIixTKTtjKCJjbjEiLCJjbjIiLFMpO2MoImNuMyIsImNuNCIsUyk7YygiY2YxIiwiY2YyIixTKTtjKCJjZjMiLCJjZjQiLFMpO2cuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBjYSh2LDMpKTtnLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBjYSh6LDMpKTtJYi5jYWxsKHRoaXMsZyxyKTt0aGlzLmNhbWVyYT1hO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnBvaW50TWFwPUU7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBQYihhLGMsZSxnLHIsdix6KXtlaC5zZXQocix2LHopLnVucHJvamVjdChnKTthPWNbYV07aWYodm9pZCAwIT09YSlmb3IoZT1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxjPTAsZz1hLmxlbmd0aDtjPGc7YysrKWUuc2V0WFlaKGFbY10sZWgueCxlaC55LGVoLnopfWZ1bmN0aW9uIGhkKGEsYyl7dGhpcy5vYmplY3Q9YTt2b2lkIDA9PT1jJiYoYz0xNjc3Njk2MCk7YT1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LAo0LDAsNCwxLDUsMiw2LDMsN10pO3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoMjQpLGc9bmV3IHZhO2cuc2V0SW5kZXgobmV3IFEoYSwxKSk7Zy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUShlLDMpKTtJYi5jYWxsKHRoaXMsZyxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZ2coYSxjKXt0aGlzLnR5cGU9IkJveDNIZWxwZXIiO3RoaXMuYm94PWE7Yz1jfHwxNjc3Njk2MDthPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgZT1uZXcgdmE7ZS5zZXRJbmRleChuZXcgUShhLDEpKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX0KZnVuY3Rpb24gaGcoYSxjLGUpe3RoaXMudHlwZT0iUGxhbmVIZWxwZXIiO3RoaXMucGxhbmU9YTt0aGlzLnNpemU9dm9pZCAwPT09Yz8xOmM7YT12b2lkIDAhPT1lP2U6MTY3NzY5NjA7Yz1uZXcgdmE7Yy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsLTEsMSwtMSwxLDEsLTEsLTEsMSwxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLDEsMCwwLDEsMCwwLDBdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1ZiLmNhbGwodGhpcyxjLG5ldyBGYih7Y29sb3I6YX0pKTtjPW5ldyB2YTtjLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB4YShjLG5ldyBMKHtjb2xvcjphLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMX0pKSl9ZnVuY3Rpb24gaWQoYSxjLGUsZyxyLHYpe0EuY2FsbCh0aGlzKTsKdm9pZCAwPT09YSYmKGE9bmV3IGsoMCwwLDEpKTt2b2lkIDA9PT1jJiYoYz1uZXcgaygwLDAsMCkpO3ZvaWQgMD09PWUmJihlPTEpO3ZvaWQgMD09PWcmJihnPTE2Nzc2OTYwKTt2b2lkIDA9PT1yJiYocj0uMiplKTt2b2lkIDA9PT12JiYodj0uMipyKTt2b2lkIDA9PT1maCYmKGZoPW5ldyB2YSxmaC5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzAsMCwwLDAsMSwwXSwzKSksdmk9bmV3IGZkKDAsLjUsMSw1LDEpLHZpLnRyYW5zbGF0ZSgwLC0uNSwwKSk7dGhpcy5wb3NpdGlvbi5jb3B5KGMpO3RoaXMubGluZT1uZXcgVmIoZmgsbmV3IEZiKHtjb2xvcjpnfSkpO3RoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuYWRkKHRoaXMubGluZSk7dGhpcy5jb25lPW5ldyB4YSh2aSxuZXcgTCh7Y29sb3I6Z30pKTt0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMuc2V0RGlyZWN0aW9uKGEpO3RoaXMuc2V0TGVuZ3RoKGUsCnIsdil9ZnVuY3Rpb24gaWcoYSl7YT1hfHwxO3ZhciBjPVswLDAsMCxhLDAsMCwwLDAsMCwwLGEsMCwwLDAsMCwwLDAsYV07YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7YS5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgY2EoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSk7Yz1uZXcgRmIoe3ZlcnRleENvbG9yczoyfSk7SWIuY2FsbCh0aGlzLGEsYyl9ZnVuY3Rpb24gWmooYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTtaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIjt0aGlzLmNsb3NlZD0hMH1mdW5jdGlvbiBhayhhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpOwpaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIn1mdW5jdGlvbiB3aShhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpO1piLmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9ImNhdG11bGxyb20ifXZvaWQgMD09PU51bWJlci5FUFNJTE9OJiYoTnVtYmVyLkVQU0lMT049TWF0aC5wb3coMiwtNTIpKTt2b2lkIDA9PT1OdW1iZXIuaXNJbnRlZ2VyJiYoTnVtYmVyLmlzSW50ZWdlcj1mdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhJiZpc0Zpbml0ZShhKSYmTWF0aC5mbG9vcihhKT09PWF9KTt2b2lkIDA9PT1NYXRoLnNpZ24mJihNYXRoLnNpZ249ZnVuY3Rpb24oYSl7cmV0dXJuIDA+YT8tMTowPGE/MTorYX0pOyExPT09Im5hbWUiaW4gRnVuY3Rpb24ucHJvdG90eXBlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCJuYW1lIiwKe2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvblxzKihbXlwoXHNdKikvKVsxXX19KTt2b2lkIDA9PT1PYmplY3QuYXNzaWduJiYoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIGM9T2JqZWN0KGEpLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgZz1hcmd1bWVudHNbZV07aWYodm9pZCAwIT09ZyYmbnVsbCE9PWcpZm9yKHZhciByIGluIGcpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcscikmJihjW3JdPWdbcl0pfXJldHVybiBjfSk7T2JqZWN0LmFzc2lnbihkLnByb3RvdHlwZSx7YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7dmFyIGU9CnRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1lW2FdJiYoZVthXT1bXSk7LTE9PT1lW2FdLmluZGV4T2YoYykmJmVbYV0ucHVzaChjKX0saGFzRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTt2YXIgZT10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PWVbYV0mJi0xIT09ZVthXS5pbmRleE9mKGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09dGhpcy5fbGlzdGVuZXJzJiYoYT10aGlzLl9saXN0ZW5lcnNbYV0sdm9pZCAwIT09YSYmKGM9YS5pbmRleE9mKGMpLC0xIT09YyYmYS5zcGxpY2UoYywxKSkpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyl7dmFyIGM9dGhpcy5fbGlzdGVuZXJzW2EudHlwZV07aWYodm9pZCAwIT09Yyl7YS50YXJnZXQ9dGhpcztjPWMuc2xpY2UoMCk7Zm9yKHZhciBlPTAsZz1jLmxlbmd0aDtlPGc7ZSsrKWNbZV0uY2FsbCh0aGlzLAphKX19fX0pO2Zvcih2YXIgWWI9W10samc9MDsyNTY+amc7amcrKylZYltqZ109KDE2PmpnPyIwIjoiIikramcudG9TdHJpbmcoMTYpO3ZhciBoYj17REVHMlJBRDpNYXRoLlBJLzE4MCxSQUQyREVHOjE4MC9NYXRoLlBJLGdlbmVyYXRlVVVJRDpmdW5jdGlvbigpe3ZhciBhPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGM9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxnPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihZYlthJjI1NV0rWWJbYT4+OCYyNTVdK1liW2E+PjE2JjI1NV0rWWJbYT4+MjQmMjU1XSsiLSIrWWJbYyYyNTVdK1liW2M+PjgmMjU1XSsiLSIrWWJbYz4+MTYmMTV8NjRdK1liW2M+PjI0JjI1NV0rIi0iK1liW2UmNjN8MTI4XStZYltlPj44JjI1NV0rIi0iK1liW2U+PjE2JjI1NV0rWWJbZT4+MjQmMjU1XStZYltnJjI1NV0rWWJbZz4+OCYyNTVdK1liW2c+PjE2JjI1NV0rWWJbZz4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX0sCmNsYW1wOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gTWF0aC5tYXgoYyxNYXRoLm1pbihlLGEpKX0sZXVjbGlkZWFuTW9kdWxvOmZ1bmN0aW9uKGEsYyl7cmV0dXJuKGElYytjKSVjfSxtYXBMaW5lYXI6ZnVuY3Rpb24oYSxjLGUsZyxyKXtyZXR1cm4gZysoYS1jKSooci1nKS8oZS1jKX0sbGVycDpmdW5jdGlvbihhLGMsZSl7cmV0dXJuKDEtZSkqYStlKmN9LHNtb290aHN0ZXA6ZnVuY3Rpb24oYSxjLGUpe2lmKGE8PWMpcmV0dXJuIDA7aWYoYT49ZSlyZXR1cm4gMTthPShhLWMpLyhlLWMpO3JldHVybiBhKmEqKDMtMiphKX0sc21vb3RoZXJzdGVwOmZ1bmN0aW9uKGEsYyxlKXtpZihhPD1jKXJldHVybiAwO2lmKGE+PWUpcmV0dXJuIDE7YT0oYS1jKS8oZS1jKTtyZXR1cm4gYSphKmEqKGEqKDYqYS0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGErTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihjLWErMSkpfSxyYW5kRmxvYXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYSsKTWF0aC5yYW5kb20oKSooYy1hKX0scmFuZEZsb2F0U3ByZWFkOmZ1bmN0aW9uKGEpe3JldHVybiBhKiguNS1NYXRoLnJhbmRvbSgpKX0sZGVnVG9SYWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuREVHMlJBRH0scmFkVG9EZWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuUkFEMkRFR30saXNQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiAwPT09KGEmYS0xKSYmMCE9PWF9LGNlaWxQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhhKS9NYXRoLkxOMikpfSxmbG9vclBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhhKS9NYXRoLkxOMikpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZi5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy54PWF9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl9LApzZXQ6ZnVuY3Rpb24oYSl7dGhpcy55PWF9fX0pO09iamVjdC5hc3NpZ24oZi5wcm90b3R5cGUse2lzVmVjdG9yMjohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YTt0aGlzLnk9YztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhKXt0aGlzLnk9YTtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgMDp0aGlzLng9YzticmVhaztjYXNlIDE6dGhpcy55PWM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2EpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrCmEpO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGEsYyk7dGhpcy54Kz1hLng7dGhpcy55Kz1hLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYztyZXR1cm4gdGhpc30sCnN1YjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyhhLGMpO3RoaXMueC09YS54O3RoaXMueS09YS55O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54LT1hO3RoaXMueS09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLngqPWEueDt0aGlzLnkqPWEueTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTtyZXR1cm4gdGhpc30sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LGFwcGx5TWF0cml4MzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnk7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVszXSplK2FbNl07dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LGEueSk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYywKdGhpcy55KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3JldHVybiB0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguY2VpbCh0aGlzLngpO3RoaXMueT1NYXRoLmNlaWwodGhpcy55KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpOwpyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55fSxjcm9zczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueS10aGlzLnkqYS54fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxhbmdsZTpmdW5jdGlvbigpe3ZhciBhPU1hdGguYXRhbjIodGhpcy55LHRoaXMueCk7MD5hJiYoYSs9MipNYXRoLlBJKTtyZXR1cm4gYX0sCmRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sZGlzdGFuY2VUb1NxdWFyZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LWEueDthPXRoaXMueS1hLnk7cmV0dXJuIGMqYythKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55fSwKZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9dGhpcy54LWEueCxyPXRoaXMueS1hLnk7dGhpcy54PWcqZS1yKmMrYS54O3RoaXMueT1nKmMrciplK2EueTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKGgsCntzbGVycDpmdW5jdGlvbihhLGMsZSxnKXtyZXR1cm4gZS5jb3B5KGEpLnNsZXJwKGMsZyl9LHNsZXJwRmxhdDpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT1lW2crMF0sRj1lW2crMV0sSj1lW2crMl07ZT1lW2crM107Zz1yW3YrMF07dmFyIFA9clt2KzFdLFI9clt2KzJdO3I9clt2KzNdO2lmKGUhPT1yfHxFIT09Z3x8RiE9PVB8fEohPT1SKXt2PTEtejt2YXIgUz1FKmcrRipQK0oqUitlKnIsVj0wPD1TPzE6LTEsVz0xLVMqUztXPk51bWJlci5FUFNJTE9OJiYoVz1NYXRoLnNxcnQoVyksUz1NYXRoLmF0YW4yKFcsUypWKSx2PU1hdGguc2luKHYqUykvVyx6PU1hdGguc2luKHoqUykvVyk7Vio9ejtFPUUqditnKlY7Rj1GKnYrUCpWO0o9Sip2K1IqVjtlPWUqdityKlY7dj09PTEteiYmKHo9MS9NYXRoLnNxcnQoRSpFK0YqRitKKkorZSplKSxFKj16LEYqPXosSio9eixlKj16KX1hW2NdPUU7YVtjKzFdPUY7YVtjKzJdPUo7YVtjKzNdPWV9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaC5wcm90b3R5cGUsCnt4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3k9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3o9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx3OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3c9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24oaC5wcm90b3R5cGUse2lzUXVhdGVybmlvbjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fdz1nO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwKdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YS54O3RoaXMuX3k9YS55O3RoaXMuX3o9YS56O3RoaXMuX3c9YS53O3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUV1bGVyOmZ1bmN0aW9uKGEsYyl7aWYoIWF8fCFhLmlzRXVsZXIpdGhyb3cgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBlPWEuX3gsZz1hLl95LHI9YS5fejthPWEub3JkZXI7dmFyIHY9TWF0aC5jb3Msej1NYXRoLnNpbixFPXYoZS8yKSxGPXYoZy8yKTt2PXYoci8yKTtlPXooZS8yKTtnPXooZy8yKTtyPXooci8yKTsiWFlaIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJZWFoiPT09CmE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOiJaWFkiPT09YT8odGhpcy5feD1lKkYqdi1FKmcqcix0aGlzLl95PUUqZyp2K2UqRipyLHRoaXMuX3o9RSpGKnIrZSpnKnYsdGhpcy5fdz1FKkYqdi1lKmcqcik6IlpZWCI9PT1hPyh0aGlzLl94PWUqRip2LUUqZypyLHRoaXMuX3k9RSpnKnYrZSpGKnIsdGhpcy5fej1FKkYqci1lKmcqdix0aGlzLl93PUUqRip2K2UqZypyKToiWVpYIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqditlKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJYWlkiPT09YSYmKHRoaXMuX3g9ZSpGKnYtRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOyExIT09YyYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsCmMpe2MvPTI7dmFyIGU9TWF0aC5zaW4oYyk7dGhpcy5feD1hLngqZTt0aGlzLl95PWEueSplO3RoaXMuX3o9YS56KmU7dGhpcy5fdz1NYXRoLmNvcyhjKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihhKXt2YXIgYz1hLmVsZW1lbnRzLGU9Y1swXTthPWNbNF07dmFyIGc9Y1s4XSxyPWNbMV0sdj1jWzVdLHo9Y1s5XSxFPWNbMl0sRj1jWzZdO2M9Y1sxMF07dmFyIEo9ZSt2K2M7MDxKPyhlPS41L01hdGguc3FydChKKzEpLHRoaXMuX3c9LjI1L2UsdGhpcy5feD0oRi16KSplLHRoaXMuX3k9KGctRSkqZSx0aGlzLl96PShyLWEpKmUpOmU+diYmZT5jPyhlPTIqTWF0aC5zcXJ0KDErZS12LWMpLHRoaXMuX3c9KEYteikvZSx0aGlzLl94PS4yNSplLHRoaXMuX3k9KGErcikvZSx0aGlzLl96PShnK0UpL2UpOnY+Yz8oZT0yKk1hdGguc3FydCgxK3YtZS1jKSx0aGlzLl93PShnLUUpL2UsdGhpcy5feD0oYStyKS9lLAp0aGlzLl95PS4yNSplLHRoaXMuX3o9KHorRikvZSk6KGU9MipNYXRoLnNxcnQoMStjLWUtdiksdGhpcy5fdz0oci1hKS9lLHRoaXMuX3g9KGcrRSkvZSx0aGlzLl95PSh6K0YpL2UsdGhpcy5fej0uMjUqZSk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tVW5pdFZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLmRvdChjKSsxOzFFLTY+ZT8oZT0wLE1hdGguYWJzKGEueCk+TWF0aC5hYnMoYS56KT8odGhpcy5feD0tYS55LHRoaXMuX3k9YS54LHRoaXMuX3o9MCk6KHRoaXMuX3g9MCx0aGlzLl95PS1hLnosdGhpcy5fej1hLnkpKToodGhpcy5feD1hLnkqYy56LWEueipjLnksdGhpcy5feT1hLnoqYy54LWEueCpjLnosdGhpcy5fej1hLngqYy55LWEueSpjLngpO3RoaXMuX3c9ZTtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoaGIuY2xhbXAodGhpcy5kb3QoYSksLTEsCjEpKSl9LHJvdGF0ZVRvd2FyZHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmFuZ2xlVG8oYSk7aWYoMD09PWUpcmV0dXJuIHRoaXM7dGhpcy5zbGVycChhLE1hdGgubWluKDEsYy9lKSk7cmV0dXJuIHRoaXN9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5feCo9LTE7dGhpcy5feSo9LTE7dGhpcy5feio9LTE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3gqYS5feCt0aGlzLl95KmEuX3krdGhpcy5feiphLl96K3RoaXMuX3cqYS5fd30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feioKdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxlbmd0aCgpOzA9PT1hPyh0aGlzLl96PXRoaXMuX3k9dGhpcy5feD0wLHRoaXMuX3c9MSk6KGE9MS9hLHRoaXMuX3gqPWEsdGhpcy5feSo9YSx0aGlzLl96Kj1hLHRoaXMuX3cqPWEpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09Yz8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSxjKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSx0aGlzKX0sbXVsdGlwbHlRdWF0ZXJuaW9uczpmdW5jdGlvbihhLApjKXt2YXIgZT1hLl94LGc9YS5feSxyPWEuX3o7YT1hLl93O3ZhciB2PWMuX3gsej1jLl95LEU9Yy5fejtjPWMuX3c7dGhpcy5feD1lKmMrYSp2K2cqRS1yKno7dGhpcy5feT1nKmMrYSp6K3Iqdi1lKkU7dGhpcy5fej1yKmMrYSpFK2Uqei1nKnY7dGhpcy5fdz1hKmMtZSp2LWcqei1yKkU7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzbGVycDpmdW5jdGlvbihhLGMpe2lmKDA9PT1jKXJldHVybiB0aGlzO2lmKDE9PT1jKXJldHVybiB0aGlzLmNvcHkoYSk7dmFyIGU9dGhpcy5feCxnPXRoaXMuX3kscj10aGlzLl96LHY9dGhpcy5fdyx6PXYqYS5fdytlKmEuX3grZyphLl95K3IqYS5fejswPno/KHRoaXMuX3c9LWEuX3csdGhpcy5feD0tYS5feCx0aGlzLl95PS1hLl95LHRoaXMuX3o9LWEuX3osej0teik6dGhpcy5jb3B5KGEpO2lmKDE8PXopcmV0dXJuIHRoaXMuX3c9dix0aGlzLl94PWUsdGhpcy5feT1nLHRoaXMuX3o9cix0aGlzO2E9MS16Kno7aWYoYTw9TnVtYmVyLkVQU0lMT04pcmV0dXJuIHo9CjEtYyx0aGlzLl93PXoqditjKnRoaXMuX3csdGhpcy5feD16KmUrYyp0aGlzLl94LHRoaXMuX3k9eipnK2MqdGhpcy5feSx0aGlzLl96PXoqcitjKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpczthPU1hdGguc3FydChhKTt2YXIgRT1NYXRoLmF0YW4yKGEseik7ej1NYXRoLnNpbigoMS1jKSpFKS9hO2M9TWF0aC5zaW4oYypFKS9hO3RoaXMuX3c9dip6K3RoaXMuX3cqYzt0aGlzLl94PWUqeit0aGlzLl94KmM7dGhpcy5feT1nKnordGhpcy5feSpjO3RoaXMuX3o9cip6K3RoaXMuX3oqYzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5feD09PXRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fdz09PXRoaXMuX3d9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuX3g9YVtjXTt0aGlzLl95PWFbYysxXTsKdGhpcy5fej1hW2MrMl07dGhpcy5fdz1hW2MrM107dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy5feDthW2MrMV09dGhpcy5feTthW2MrMl09dGhpcy5fejthW2MrM109dGhpcy5fdztyZXR1cm4gYX0sX29uQ2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9YTtyZXR1cm4gdGhpc30sX29uQ2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9fSk7dmFyIHhpPW5ldyBrLGJrPW5ldyBoO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse2lzVmVjdG9yMzohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMueD1hO3RoaXMueT1jO3RoaXMuej1lO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy56PXRoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sCnNldFk6ZnVuY3Rpb24oYSl7dGhpcy55PWE7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYSl7dGhpcy56PWE7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihhLGMpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy54PWM7YnJlYWs7Y2FzZSAxOnRoaXMueT1jO2JyZWFrO2Nhc2UgMjp0aGlzLno9YzticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy54PWEueDt0aGlzLnk9YS55Owp0aGlzLno9YS56O3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYSxjKTt0aGlzLngrPWEueDt0aGlzLnkrPWEueTt0aGlzLnorPWEuejtyZXR1cm4gdGhpc30sYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7dGhpcy56PWEueitjLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYzt0aGlzLnorPWEueipjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5zdWJWZWN0b3JzKGEsYyk7dGhpcy54LT1hLng7dGhpcy55LT1hLnk7dGhpcy56LT1hLno7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngtPWE7dGhpcy55LT1hO3RoaXMuei09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3RoaXMuej1hLnotYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyhhLGMpO3RoaXMueCo9YS54O3RoaXMueSo9YS55O3RoaXMueio9YS56O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngqPWE7dGhpcy55Kj1hO3RoaXMueio9CmE7cmV0dXJuIHRoaXN9LG11bHRpcGx5VmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngqYy54O3RoaXMueT1hLnkqYy55O3RoaXMuej1hLnoqYy56O3JldHVybiB0aGlzfSxhcHBseUV1bGVyOmZ1bmN0aW9uKGEpe2EmJmEuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tRXVsZXIoYSkpfSxhcHBseUF4aXNBbmdsZTpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tQXhpc0FuZ2xlKGEsYykpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbM10qZSthWzZdKmc7dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XSoKZzt0aGlzLno9YVsyXSpjK2FbNV0qZSthWzhdKmc7cmV0dXJuIHRoaXN9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3ZhciByPTEvKGFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSk7dGhpcy54PShhWzBdKmMrYVs0XSplK2FbOF0qZythWzEyXSkqcjt0aGlzLnk9KGFbMV0qYythWzVdKmUrYVs5XSpnK2FbMTNdKSpyO3RoaXMuej0oYVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKSpyO3JldHVybiB0aGlzfSxhcHBseVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9YS54LHY9YS55LHo9YS56O2E9YS53O3ZhciBFPWEqYyt2KmcteiplLEY9YSplK3oqYy1yKmcsSj1hKmcrciplLXYqYztjPS1yKmMtdiplLXoqZzt0aGlzLng9RSphK2MqLXIrRiotei1KKi12O3RoaXMueT1GKmErYyotditKKi1yLUUqLXo7dGhpcy56PUoqYStjKi16K0UqLXYtRiotcjtyZXR1cm4gdGhpc30sCnByb2plY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5wcm9qZWN0aW9uTWF0cml4KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCl9LHRyYW5zZm9ybURpcmVjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVs0XSplK2FbOF0qZzt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmc7dGhpcy56PWFbMl0qYythWzZdKmUrYVsxMF0qZztyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3RoaXMuei89YS56O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGEueSk7dGhpcy56PU1hdGgubWF4KHRoaXMueixhLnopO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChhLnosTWF0aC5taW4oYy56LHRoaXMueikpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSwKTWF0aC5taW4oYyx0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBMZW5ndGg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihlfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChhLE1hdGgubWluKGMsZSkpKX0sZmxvb3I6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT1NYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PU1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0KMD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55K3RoaXMueiphLnp9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KSsKTWF0aC5hYnModGhpcy56KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7dGhpcy56Kz0oYS56LXRoaXMueikqYztyZXR1cm4gdGhpc30sbGVycFZlY3RvcnM6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiB0aGlzLnN1YlZlY3RvcnMoYyxhKS5tdWx0aXBseVNjYWxhcihlKS5hZGQoYSl9LGNyb3NzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHZvaWQgMCE9PWM/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyhhLGMpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLAphKX0sY3Jvc3NWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O3ZhciByPWMueCx2PWMueTtjPWMuejt0aGlzLng9ZypjLWEqdjt0aGlzLnk9YSpyLWUqYzt0aGlzLno9ZSp2LWcqcjtyZXR1cm4gdGhpc30scHJvamVjdE9uVmVjdG9yOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZG90KHRoaXMpL2EubGVuZ3RoU3EoKTtyZXR1cm4gdGhpcy5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKGMpfSxwcm9qZWN0T25QbGFuZTpmdW5jdGlvbihhKXt4aS5jb3B5KHRoaXMpLnByb2plY3RPblZlY3RvcihhKTtyZXR1cm4gdGhpcy5zdWIoeGkpfSxyZWZsZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN1Yih4aS5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoYSkpKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hY29zKGhiLmNsYW1wKHRoaXMuZG90KGEpL01hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqYS5sZW5ndGhTcSgpKSwtMSwxKSl9LGRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sCmRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueC1hLngsZT10aGlzLnktYS55O2E9dGhpcy56LWEuejtyZXR1cm4gYypjK2UqZSthKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpK01hdGguYWJzKHRoaXMuei1hLnopfSxzZXRGcm9tU3BoZXJpY2FsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoYS5yYWRpdXMsYS5waGksYS50aGV0YSl9LHNldEZyb21TcGhlcmljYWxDb29yZHM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPU1hdGguc2luKGMpKmE7dGhpcy54PWcqTWF0aC5zaW4oZSk7dGhpcy55PU1hdGguY29zKGMpKmE7dGhpcy56PWcqTWF0aC5jb3MoZSk7cmV0dXJuIHRoaXN9LHNldEZyb21DeWxpbmRyaWNhbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYS5yYWRpdXMsYS50aGV0YSwKYS55KX0sc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLng9YSpNYXRoLnNpbihjKTt0aGlzLnk9ZTt0aGlzLno9YSpNYXRoLmNvcyhjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLng9YVsxMl07dGhpcy55PWFbMTNdO3RoaXMuej1hWzE0XTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDApLmxlbmd0aCgpLGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMSkubGVuZ3RoKCk7YT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYSwyKS5sZW5ndGgoKTt0aGlzLng9Yzt0aGlzLnk9ZTt0aGlzLno9YTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeENvbHVtbjpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmZyb21BcnJheShhLmVsZW1lbnRzLDQqYyl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS54PT09CnRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnp9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07dGhpcy56PWFbYysyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O2FbYysyXT10aGlzLno7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3RoaXMueD1hLmdldFgoYyk7dGhpcy55PWEuZ2V0WShjKTt0aGlzLno9YS5nZXRaKGMpO3JldHVybiB0aGlzfX0pO3ZhciBlZT1uZXcgaztPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtpc01hdHJpeDM6ITAsc2V0OmZ1bmN0aW9uKGEsCmMsZSxnLHIsdix6LEUsRil7dmFyIEo9dGhpcy5lbGVtZW50cztKWzBdPWE7SlsxXT1nO0pbMl09ejtKWzNdPWM7Sls0XT1yO0pbNV09RTtKWzZdPWU7Sls3XT12O0pbOF09RjtyZXR1cm4gdGhpc30saWRlbnRpdHk6ZnVuY3Rpb24oKXt0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXg0OmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLnNldChhWzBdLGFbNF0sYVs4XSxhWzFdLGFbNV0sYVs5XSxhWzJdLGFbNl0sYVsxMF0pO3JldHVybiB0aGlzfSwKYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MCxlPWEuY291bnQ7YzxlO2MrKyllZS54PWEuZ2V0WChjKSxlZS55PWEuZ2V0WShjKSxlZS56PWEuZ2V0WihjKSxlZS5hcHBseU1hdHJpeDModGhpcyksYS5zZXRYWVooYyxlZS54LGVlLnksZWUueik7cmV0dXJuIGF9LG11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyxhKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhhLHRoaXMpfSxtdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5lbGVtZW50cyxnPWMuZWxlbWVudHM7Yz10aGlzLmVsZW1lbnRzO2E9ZVswXTt2YXIgcj1lWzNdLHY9ZVs2XSx6PWVbMV0sRT1lWzRdLEY9ZVs3XSxKPWVbMl0sUD1lWzVdO2U9ZVs4XTt2YXIgUj1nWzBdLFM9Z1szXSxWPWdbNl0sVz1nWzFdLGhhPWdbNF0sZmE9Z1s3XSxyYT1nWzJdLHBhPWdbNV07Zz1nWzhdOwpjWzBdPWEqUityKlcrdipyYTtjWzNdPWEqUytyKmhhK3YqcGE7Y1s2XT1hKlYrcipmYSt2Kmc7Y1sxXT16KlIrRSpXK0YqcmE7Y1s0XT16KlMrRSpoYStGKnBhO2NbN109eipWK0UqZmErRipnO2NbMl09SipSK1AqVytlKnJhO2NbNV09SipTK1AqaGErZSpwYTtjWzhdPUoqVitQKmZhK2UqZztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cztjWzBdKj1hO2NbM10qPWE7Y1s2XSo9YTtjWzFdKj1hO2NbNF0qPWE7Y1s3XSo9YTtjWzJdKj1hO2NbNV0qPWE7Y1s4XSo9YTtyZXR1cm4gdGhpc30sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbMV0sZz1hWzJdLHI9YVszXSx2PWFbNF0sej1hWzVdLEU9YVs2XSxGPWFbN107YT1hWzhdO3JldHVybiBjKnYqYS1jKnoqRi1lKnIqYStlKnoqRStnKnIqRi1nKnYqRX0sZ2V0SW52ZXJzZTpmdW5jdGlvbihhLGMpe2EmJmEuaXNNYXRyaXg0JiYKY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIpO3ZhciBlPWEuZWxlbWVudHM7YT10aGlzLmVsZW1lbnRzO3ZhciBnPWVbMF0scj1lWzFdLHY9ZVsyXSx6PWVbM10sRT1lWzRdLEY9ZVs1XSxKPWVbNl0sUD1lWzddO2U9ZVs4XTt2YXIgUj1lKkUtRipQLFM9RipKLWUqeixWPVAqei1FKkosVz1nKlIrcipTK3YqVjtpZigwPT09Vyl7aWYoITA9PT1jKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9Yz0xL1c7YVswXT1SKmM7YVsxXT0odipQLWUqcikqYzthWzJdPShGKnItdipFKSpjO2FbM109UypjO2FbNF09CihlKmctdipKKSpjO2FbNV09KHYqei1GKmcpKmM7YVs2XT1WKmM7YVs3XT0ocipKLVAqZykqYzthWzhdPShFKmctcip6KSpjO3JldHVybiB0aGlzfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3ZhciBjPWFbMV07YVsxXT1hWzNdO2FbM109YztjPWFbMl07YVsyXT1hWzZdO2FbNl09YztjPWFbNV07YVs1XT1hWzddO2FbN109YztyZXR1cm4gdGhpc30sZ2V0Tm9ybWFsTWF0cml4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KGEpLmdldEludmVyc2UodGhpcykudHJhbnNwb3NlKCl9LHRyYW5zcG9zZUludG9BcnJheTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2FbMF09Y1swXTthWzFdPWNbM107YVsyXT1jWzZdO2FbM109Y1sxXTthWzRdPWNbNF07YVs1XT1jWzddO2FbNl09Y1syXTthWzddPWNbNV07YVs4XT1jWzhdO3JldHVybiB0aGlzfSxzZXRVdlRyYW5zZm9ybTpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT0KTWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTt0aGlzLnNldChlKkUsZSpyLC1lKihFKnYrcip6KSt2K2EsLWcqcixnKkUsLWcqKC1yKnYrRSp6KSt6K2MsMCwwLDEpfSxzY2FsZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSo9YTtlWzNdKj1hO2VbNl0qPWE7ZVsxXSo9YztlWzRdKj1jO2VbN10qPWM7cmV0dXJuIHRoaXN9LHJvdGF0ZTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3ZhciBlPXRoaXMuZWxlbWVudHMsZz1lWzBdLHI9ZVszXSx2PWVbNl0sej1lWzFdLEU9ZVs0XSxGPWVbN107ZVswXT1jKmcrYSp6O2VbM109YypyK2EqRTtlWzZdPWMqdithKkY7ZVsxXT0tYSpnK2MqejtlWzRdPS1hKnIrYypFO2VbN109LWEqditjKkY7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSs9YSplWzJdO2VbM10rPWEqZVs1XTtlWzZdKz1hKmVbOF07ZVsxXSs9YyplWzJdO2VbNF0rPQpjKmVbNV07ZVs3XSs9YyplWzhdO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Zm9yKHZhciBlPTA7OT5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmVsZW1lbnRzW2VdPWFbZStjXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTt2YXIgZT10aGlzLmVsZW1lbnRzO2FbY109ZVswXTthW2MrMV09ZVsxXTthW2MrMl09ZVsyXTthW2MrM109ZVszXTthW2MrNF09ZVs0XTthW2MrNV09ZVs1XTthW2MrNl09ZVs2XTthW2MrN109ZVs3XTthW2MrOF09ZVs4XTtyZXR1cm4gYX19KTt2YXIgZWYsRGQ9e2dldERhdGFVUkw6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gYS5zcmM7CmlmKCEoYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSl7dm9pZCAwPT09ZWYmJihlZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSk7ZWYud2lkdGg9YS53aWR0aDtlZi5oZWlnaHQ9YS5oZWlnaHQ7dmFyIGM9ZWYuZ2V0Q29udGV4dCgiMmQiKTthIGluc3RhbmNlb2YgSW1hZ2VEYXRhP2MucHV0SW1hZ2VEYXRhKGEsMCwwKTpjLmRyYXdJbWFnZShhLDAsMCxhLndpZHRoLGEuaGVpZ2h0KTthPWVmfXJldHVybiAyMDQ4PGEud2lkdGh8fDIwNDg8YS5oZWlnaHQ/YS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTphLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9fSxOaz0wO2wuREVGQVVMVF9JTUFHRT12b2lkIDA7bC5ERUZBVUxUX01BUFBJTkc9MzAwO2wucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmwsaXNUZXh0dXJlOiEwLHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsCnRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmltYWdlPWEuaW1hZ2U7dGhpcy5taXBtYXBzPWEubWlwbWFwcy5zbGljZSgwKTt0aGlzLm1hcHBpbmc9YS5tYXBwaW5nO3RoaXMud3JhcFM9YS53cmFwUzt0aGlzLndyYXBUPWEud3JhcFQ7dGhpcy5tYWdGaWx0ZXI9YS5tYWdGaWx0ZXI7dGhpcy5taW5GaWx0ZXI9YS5taW5GaWx0ZXI7dGhpcy5hbmlzb3Ryb3B5PWEuYW5pc290cm9weTt0aGlzLmZvcm1hdD1hLmZvcm1hdDt0aGlzLnR5cGU9YS50eXBlO3RoaXMub2Zmc2V0LmNvcHkoYS5vZmZzZXQpO3RoaXMucmVwZWF0LmNvcHkoYS5yZXBlYXQpO3RoaXMuY2VudGVyLmNvcHkoYS5jZW50ZXIpO3RoaXMucm90YXRpb249CmEucm90YXRpb247dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeC5jb3B5KGEubWF0cml4KTt0aGlzLmdlbmVyYXRlTWlwbWFwcz1hLmdlbmVyYXRlTWlwbWFwczt0aGlzLnByZW11bHRpcGx5QWxwaGE9YS5wcmVtdWx0aXBseUFscGhhO3RoaXMuZmxpcFk9YS5mbGlwWTt0aGlzLnVucGFja0FsaWdubWVudD1hLnVucGFja0FsaWdubWVudDt0aGlzLmVuY29kaW5nPWEuZW5jb2Rpbmc7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhO2lmKCFjJiZ2b2lkIDAhPT1hLnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIGEudGV4dHVyZXNbdGhpcy51dWlkXTt2YXIgZT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZywKcmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O2lmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe3ZhciBnPXRoaXMuaW1hZ2U7dm9pZCAwPT09Zy51dWlkJiYoZy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpKTtpZighYyYmdm9pZCAwPT09YS5pbWFnZXNbZy51dWlkXSl7aWYoQXJyYXkuaXNBcnJheShnKSl7dmFyIHI9CltdO2Zvcih2YXIgdj0wLHo9Zy5sZW5ndGg7djx6O3YrKylyLnB1c2goRGQuZ2V0RGF0YVVSTChnW3ZdKSl9ZWxzZSByPURkLmdldERhdGFVUkwoZyk7YS5pbWFnZXNbZy51dWlkXT17dXVpZDpnLnV1aWQsdXJsOnJ9fWUuaW1hZ2U9Zy51dWlkfWN8fChhLnRleHR1cmVzW3RoaXMudXVpZF09ZSk7cmV0dXJuIGV9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9LHRyYW5zZm9ybVV2OmZ1bmN0aW9uKGEpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gYTthLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCk7aWYoMD5hLnh8fDE8YS54KXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFFMzphLngtPU1hdGguZmxvb3IoYS54KTticmVhaztjYXNlIDEwMDE6YS54PTA+YS54PzA6MTticmVhaztjYXNlIDEwMDI6YS54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGEueCklMik/TWF0aC5jZWlsKGEueCktYS54OmEueC1NYXRoLmZsb29yKGEueCl9aWYoMD4KYS55fHwxPGEueSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxRTM6YS55LT1NYXRoLmZsb29yKGEueSk7YnJlYWs7Y2FzZSAxMDAxOmEueT0wPmEueT8wOjE7YnJlYWs7Y2FzZSAxMDAyOmEueT0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihhLnkpJTIpP01hdGguY2VpbChhLnkpLWEueTphLnktTWF0aC5mbG9vcihhLnkpfXRoaXMuZmxpcFkmJihhLnk9MS1hLnkpO3JldHVybiBhfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp9LHNldDpmdW5jdGlvbihhKXt0aGlzLno9YX19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudz1hfX19KTtPYmplY3QuYXNzaWduKHAucHJvdG90eXBlLAp7aXNWZWN0b3I0OiEwLHNldDpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLng9YTt0aGlzLnk9Yzt0aGlzLno9ZTt0aGlzLnc9ZztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMudz10aGlzLno9dGhpcy55PXRoaXMueD1hO3JldHVybiB0aGlzfSxzZXRYOmZ1bmN0aW9uKGEpe3RoaXMueD1hO3JldHVybiB0aGlzfSxzZXRZOmZ1bmN0aW9uKGEpe3RoaXMueT1hO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGEpe3RoaXMuej1hO3JldHVybiB0aGlzfSxzZXRXOmZ1bmN0aW9uKGEpe3RoaXMudz1hO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMueD1jO2JyZWFrO2Nhc2UgMTp0aGlzLnk9YzticmVhaztjYXNlIDI6dGhpcy56PWM7YnJlYWs7Y2FzZSAzOnRoaXMudz1jO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiB0aGlzLng7CmNhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTt0aGlzLno9YS56O3RoaXMudz12b2lkIDAhPT1hLnc/YS53OjE7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhhLGMpO3RoaXMueCs9YS54O3RoaXMueSs9YS55O3RoaXMueis9YS56O3RoaXMudys9YS53O3JldHVybiB0aGlzfSwKYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3RoaXMudys9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3RoaXMuej1hLnorYy56O3RoaXMudz1hLncrYy53O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7dGhpcy56Kz1hLnoqYzt0aGlzLncrPWEudypjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYSxjKTt0aGlzLngtPWEueDt0aGlzLnktPWEueTt0aGlzLnotPWEuejt0aGlzLnctPWEudztyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueC09CmE7dGhpcy55LT1hO3RoaXMuei09YTt0aGlzLnctPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTt0aGlzLno9YS56LWMuejt0aGlzLnc9YS53LWMudztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTt0aGlzLnoqPWE7dGhpcy53Kj1hO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9dGhpcy53O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbNF0qZSthWzhdKmcrYVsxMl0qcjt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmcrYVsxM10qcjt0aGlzLno9YVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKnI7dGhpcy53PWFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSpyO3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMudz0yKk1hdGguYWNvcyhhLncpO3ZhciBjPU1hdGguc3FydCgxLWEudyphLncpOzFFLTQ+Yz8odGhpcy54PTEsdGhpcy56PXRoaXMueT0wKToodGhpcy54PWEueC9jLHRoaXMueT1hLnkvYyx0aGlzLno9YS56L2MpO3JldHVybiB0aGlzfSxzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYSl7YT1hLmVsZW1lbnRzO3ZhciBjPWFbMF07dmFyIGU9YVs0XTt2YXIgZz1hWzhdLHI9YVsxXSx2PWFbNV0sej1hWzldO3ZhciBFPWFbMl07dmFyIEY9YVs2XTt2YXIgSj1hWzEwXTtpZiguMDE+TWF0aC5hYnMoZS1yKSYmLjAxPk1hdGguYWJzKGctRSkmJi4wMT5NYXRoLmFicyh6LUYpKXtpZiguMT5NYXRoLmFicyhlK3IpJiYuMT5NYXRoLmFicyhnK0UpJiYuMT5NYXRoLmFicyh6K0YpJiYuMT5NYXRoLmFicyhjK3YrSi0zKSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpczthPU1hdGguUEk7CmM9KGMrMSkvMjt2PSh2KzEpLzI7Sj0oSisxKS8yO2U9KGUrcikvNDtnPShnK0UpLzQ7ej0oeitGKS80O2M+diYmYz5KPy4wMT5jPyhGPTAsZT1FPS43MDcxMDY3ODEpOihGPU1hdGguc3FydChjKSxFPWUvRixlPWcvRik6dj5KPy4wMT52PyhGPS43MDcxMDY3ODEsRT0wLGU9LjcwNzEwNjc4MSk6KEU9TWF0aC5zcXJ0KHYpLEY9ZS9FLGU9ei9FKTouMDE+Sj8oRT1GPS43MDcxMDY3ODEsZT0wKTooZT1NYXRoLnNxcnQoSiksRj1nL2UsRT16L2UpO3RoaXMuc2V0KEYsRSxlLGEpO3JldHVybiB0aGlzfWE9TWF0aC5zcXJ0KChGLXopKihGLXopKyhnLUUpKihnLUUpKyhyLWUpKihyLWUpKTsuMDAxPk1hdGguYWJzKGEpJiYoYT0xKTt0aGlzLng9KEYteikvYTt0aGlzLnk9KGctRSkvYTt0aGlzLno9KHItZSkvYTt0aGlzLnc9TWF0aC5hY29zKChjK3YrSi0xKS8yKTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LAphLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5taW4odGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5tYXgodGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEueCxNYXRoLm1pbihjLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEueSxNYXRoLm1pbihjLnksdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEueixNYXRoLm1pbihjLnosdGhpcy56KSk7dGhpcy53PU1hdGgubWF4KGEudyxNYXRoLm1pbihjLncsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYSxNYXRoLm1pbihjLAp0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueikpO3RoaXMudz1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7dGhpcy53PU1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3RoaXMudz1NYXRoLmNlaWwodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9Ck1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3RoaXMuej1NYXRoLnJvdW5kKHRoaXMueik7dGhpcy53PU1hdGgucm91bmQodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9MD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTt0aGlzLnc9MD50aGlzLnc/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLng9LXRoaXMueDt0aGlzLnk9LXRoaXMueTt0aGlzLno9LXRoaXMuejt0aGlzLnc9LXRoaXMudztyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLngqYS54K3RoaXMueSphLnkrdGhpcy56KgphLnordGhpcy53KmEud30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3RoaXMueis9KGEuei0KdGhpcy56KSpjO3RoaXMudys9KGEudy10aGlzLncpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnomJmEudz09PXRoaXMud30sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTt0aGlzLno9YVtjKzJdO3RoaXMudz1hW2MrM107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTthW2MrMl09dGhpcy56O2FbYyszXT10aGlzLnc7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpOwp0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7dGhpcy56PWEuZ2V0WihjKTt0aGlzLnc9YS5nZXRXKGMpO3JldHVybiB0aGlzfX0pO20ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm0saXNXZWJHTFJlbmRlclRhcmdldDohMCxzZXRTaXplOmZ1bmN0aW9uKGEsYyl7aWYodGhpcy53aWR0aCE9PWF8fHRoaXMuaGVpZ2h0IT09Yyl0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9Yyx0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YSx0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWMsdGhpcy5kaXNwb3NlKCk7dGhpcy52aWV3cG9ydC5zZXQoMCwwLGEsYyk7dGhpcy5zY2lzc29yLnNldCgwLDAsYSxjKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy53aWR0aD1hLndpZHRoO3RoaXMuaGVpZ2h0PWEuaGVpZ2h0O3RoaXMudmlld3BvcnQuY29weShhLnZpZXdwb3J0KTsKdGhpcy50ZXh0dXJlPWEudGV4dHVyZS5jbG9uZSgpO3RoaXMuZGVwdGhCdWZmZXI9YS5kZXB0aEJ1ZmZlcjt0aGlzLnN0ZW5jaWxCdWZmZXI9YS5zdGVuY2lsQnVmZmVyO3RoaXMuZGVwdGhUZXh0dXJlPWEuZGVwdGhUZXh0dXJlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO24ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm4saXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7bS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zYW1wbGVzPWEuc2FtcGxlcztyZXR1cm4gdGhpc319KTt2YXIgcWM9bmV3IGssUWI9bmV3IHEseG09bmV3IGsoMCwwLDApLHltPW5ldyBrKDEsMSwxKSxFZD1uZXcgayxnaD1uZXcgayxmYz1uZXcgaztPYmplY3QuYXNzaWduKHEucHJvdG90eXBlLHtpc01hdHJpeDQ6ITAsCnNldDpmdW5jdGlvbihhLGMsZSxnLHIsdix6LEUsRixKLFAsUixTLFYsVyxoYSl7dmFyIGZhPXRoaXMuZWxlbWVudHM7ZmFbMF09YTtmYVs0XT1jO2ZhWzhdPWU7ZmFbMTJdPWc7ZmFbMV09cjtmYVs1XT12O2ZhWzldPXo7ZmFbMTNdPUU7ZmFbMl09RjtmYVs2XT1KO2ZhWzEwXT1QO2ZhWzE0XT1SO2ZhWzNdPVM7ZmFbN109VjtmYVsxMV09VztmYVsxNV09aGE7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBxKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07Y1s5XT1hWzldO2NbMTBdPQphWzEwXTtjWzExXT1hWzExXTtjWzEyXT1hWzEyXTtjWzEzXT1hWzEzXTtjWzE0XT1hWzE0XTtjWzE1XT1hWzE1XTtyZXR1cm4gdGhpc30sY29weVBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMTJdPWFbMTJdO2NbMTNdPWFbMTNdO2NbMTRdPWFbMTRdO3JldHVybiB0aGlzfSxleHRyYWN0QmFzaXM6ZnVuY3Rpb24oYSxjLGUpe2Euc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApO2Muc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpO2Uuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpO3JldHVybiB0aGlzfSxtYWtlQmFzaXM6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KGEueCxjLngsZS54LDAsYS55LGMueSxlLnksMCxhLnosYy56LGUueiwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxleHRyYWN0Um90YXRpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEuZWxlbWVudHMsZz0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwKMCkubGVuZ3RoKCkscj0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwxKS5sZW5ndGgoKTthPTEvcWMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDIpLmxlbmd0aCgpO2NbMF09ZVswXSpnO2NbMV09ZVsxXSpnO2NbMl09ZVsyXSpnO2NbM109MDtjWzRdPWVbNF0qcjtjWzVdPWVbNV0qcjtjWzZdPWVbNl0qcjtjWzddPTA7Y1s4XT1lWzhdKmE7Y1s5XT1lWzldKmE7Y1sxMF09ZVsxMF0qYTtjWzExXT0wO2NbMTJdPTA7Y1sxM109MDtjWzE0XT0wO2NbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihhKXthJiZhLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEueCxnPWEueSxyPWEueix2PU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7CnZhciB6PU1hdGguY29zKGcpO2c9TWF0aC5zaW4oZyk7dmFyIEU9TWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTtpZigiWFlaIj09PWEub3JkZXIpe2E9dipFO3ZhciBGPXYqcixKPWUqRSxQPWUqcjtjWzBdPXoqRTtjWzRdPS16KnI7Y1s4XT1nO2NbMV09RitKKmc7Y1s1XT1hLVAqZztjWzldPS1lKno7Y1syXT1QLWEqZztjWzZdPUorRipnO2NbMTBdPXYqen1lbHNlIllYWiI9PT1hLm9yZGVyPyhhPXoqRSxGPXoqcixKPWcqRSxQPWcqcixjWzBdPWErUCplLGNbNF09SiplLUYsY1s4XT12KmcsY1sxXT12KnIsY1s1XT12KkUsY1s5XT0tZSxjWzJdPUYqZS1KLGNbNl09UCthKmUsY1sxMF09dip6KToiWlhZIj09PWEub3JkZXI/KGE9eipFLEY9eipyLEo9ZypFLFA9ZypyLGNbMF09YS1QKmUsY1s0XT0tdipyLGNbOF09SitGKmUsY1sxXT1GK0oqZSxjWzVdPXYqRSxjWzldPVAtYSplLGNbMl09LXYqZyxjWzZdPWUsY1sxMF09dip6KToiWllYIj09PWEub3JkZXI/KGE9dipFLEY9dipyLEo9ZSoKRSxQPWUqcixjWzBdPXoqRSxjWzRdPUoqZy1GLGNbOF09YSpnK1AsY1sxXT16KnIsY1s1XT1QKmcrYSxjWzldPUYqZy1KLGNbMl09LWcsY1s2XT1lKnosY1sxMF09dip6KToiWVpYIj09PWEub3JkZXI/KGE9dip6LEY9dipnLEo9ZSp6LFA9ZSpnLGNbMF09eipFLGNbNF09UC1hKnIsY1s4XT1KKnIrRixjWzFdPXIsY1s1XT12KkUsY1s5XT0tZSpFLGNbMl09LWcqRSxjWzZdPUYqcitKLGNbMTBdPWEtUCpyKToiWFpZIj09PWEub3JkZXImJihhPXYqeixGPXYqZyxKPWUqeixQPWUqZyxjWzBdPXoqRSxjWzRdPS1yLGNbOF09ZypFLGNbMV09YSpyK1AsY1s1XT12KkUsY1s5XT1GKnItSixjWzJdPUoqci1GLGNbNl09ZSpFLGNbMTBdPVAqcithKTtjWzNdPTA7Y1s3XT0wO2NbMTFdPTA7Y1sxMl09MDtjWzEzXT0wO2NbMTRdPTA7Y1sxNV09MTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcG9zZSh4bSxhLHltKX0sbG9va0F0OmZ1bmN0aW9uKGEsCmMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cztmYy5zdWJWZWN0b3JzKGEsYyk7MD09PWZjLmxlbmd0aFNxKCkmJihmYy56PTEpO2ZjLm5vcm1hbGl6ZSgpO0VkLmNyb3NzVmVjdG9ycyhlLGZjKTswPT09RWQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhlLnopP2ZjLngrPTFFLTQ6ZmMueis9MUUtNCxmYy5ub3JtYWxpemUoKSxFZC5jcm9zc1ZlY3RvcnMoZSxmYykpO0VkLm5vcm1hbGl6ZSgpO2doLmNyb3NzVmVjdG9ycyhmYyxFZCk7Z1swXT1FZC54O2dbNF09Z2gueDtnWzhdPWZjLng7Z1sxXT1FZC55O2dbNV09Z2gueTtnWzldPWZjLnk7Z1syXT1FZC56O2dbNl09Z2guejtnWzEwXT1mYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1jPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLAp0aGlzLm11bHRpcGx5TWF0cmljZXMoYSxjKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYSx0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihhLGMpe3ZhciBlPWEuZWxlbWVudHMsZz1jLmVsZW1lbnRzO2M9dGhpcy5lbGVtZW50czthPWVbMF07dmFyIHI9ZVs0XSx2PWVbOF0sej1lWzEyXSxFPWVbMV0sRj1lWzVdLEo9ZVs5XSxQPWVbMTNdLFI9ZVsyXSxTPWVbNl0sVj1lWzEwXSxXPWVbMTRdLGhhPWVbM10sZmE9ZVs3XSxyYT1lWzExXTtlPWVbMTVdO3ZhciBwYT1nWzBdLHFhPWdbNF0sdWE9Z1s4XSxvYT1nWzEyXSx0YT1nWzFdLEJhPWdbNV0sVGE9Z1s5XSxVYT1nWzEzXSxDYT1nWzJdLEhhPWdbNl0sRGE9Z1sxMF0sTWE9Z1sxNF0sZGI9Z1szXSx0Yj1nWzddLEthPWdbMTFdO2c9Z1sxNV07Y1swXT1hKnBhK3IqdGErdipDYSt6KmRiO2NbNF09YSpxYStyKkJhK3YqCkhhK3oqdGI7Y1s4XT1hKnVhK3IqVGErdipEYSt6KkthO2NbMTJdPWEqb2ErcipVYSt2Kk1hK3oqZztjWzFdPUUqcGErRip0YStKKkNhK1AqZGI7Y1s1XT1FKnFhK0YqQmErSipIYStQKnRiO2NbOV09RSp1YStGKlRhK0oqRGErUCpLYTtjWzEzXT1FKm9hK0YqVWErSipNYStQKmc7Y1syXT1SKnBhK1MqdGErVipDYStXKmRiO2NbNl09UipxYStTKkJhK1YqSGErVyp0YjtjWzEwXT1SKnVhK1MqVGErVipEYStXKkthO2NbMTRdPVIqb2ErUypVYStWKk1hK1cqZztjWzNdPWhhKnBhK2ZhKnRhK3JhKkNhK2UqZGI7Y1s3XT1oYSpxYStmYSpCYStyYSpIYStlKnRiO2NbMTFdPWhhKnVhK2ZhKlRhK3JhKkRhK2UqS2E7Y1sxNV09aGEqb2ErZmEqVWErcmEqTWErZSpnO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2NbMF0qPWE7Y1s0XSo9YTtjWzhdKj1hO2NbMTJdKj1hO2NbMV0qPWE7Y1s1XSo9YTtjWzldKj1hO2NbMTNdKj1hO2NbMl0qPQphO2NbNl0qPWE7Y1sxMF0qPWE7Y1sxNF0qPWE7Y1szXSo9YTtjWzddKj1hO2NbMTFdKj1hO2NbMTVdKj1hO3JldHVybiB0aGlzfSxhcHBseVRvQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGU9YS5jb3VudDtjPGU7YysrKXFjLng9YS5nZXRYKGMpLHFjLnk9YS5nZXRZKGMpLHFjLno9YS5nZXRaKGMpLHFjLmFwcGx5TWF0cml4NCh0aGlzKSxhLnNldFhZWihjLHFjLngscWMueSxxYy56KTtyZXR1cm4gYX0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbNF0sZz1hWzhdLHI9YVsxMl0sdj1hWzFdLHo9YVs1XSxFPWFbOV0sRj1hWzEzXSxKPWFbMl0sUD1hWzZdLFI9YVsxMF0sUz1hWzE0XTtyZXR1cm4gYVszXSooK3IqRSpQLWcqRipQLXIqeipSK2UqRipSK2cqeipTLWUqRSpTKSthWzddKigrYypFKlMtYypGKlIrcip2KlItZyp2KlMrZypGKkotcipFKkopK2FbMTFdKigrYypGKlAtYyp6KlMtcip2KlArZSp2KlMrCnIqeipKLWUqRipKKSthWzE1XSooLWcqeipKLWMqRSpQK2MqeipSK2cqdipQLWUqdipSK2UqRSpKKX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50czt2YXIgYz1hWzFdO2FbMV09YVs0XTthWzRdPWM7Yz1hWzJdO2FbMl09YVs4XTthWzhdPWM7Yz1hWzZdO2FbNl09YVs5XTthWzldPWM7Yz1hWzNdO2FbM109YVsxMl07YVsxMl09YztjPWFbN107YVs3XT1hWzEzXTthWzEzXT1jO2M9YVsxMV07YVsxMV09YVsxNF07YVsxNF09YztyZXR1cm4gdGhpc30sc2V0UG9zaXRpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHM7YS5pc1ZlY3RvcjM/KGdbMTJdPWEueCxnWzEzXT1hLnksZ1sxNF09YS56KTooZ1sxMl09YSxnWzEzXT1jLGdbMTRdPWUpO3JldHVybiB0aGlzfSxnZXRJbnZlcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5lbGVtZW50cyxnPWEuZWxlbWVudHM7YT1nWzBdO3ZhciByPWdbMV0sdj1nWzJdLHo9Z1szXSxFPWdbNF0sRj1nWzVdLApKPWdbNl0sUD1nWzddLFI9Z1s4XSxTPWdbOV0sVj1nWzEwXSxXPWdbMTFdLGhhPWdbMTJdLGZhPWdbMTNdLHJhPWdbMTRdO2c9Z1sxNV07dmFyIHBhPVMqcmEqUC1mYSpWKlArZmEqSipXLUYqcmEqVy1TKkoqZytGKlYqZyxxYT1oYSpWKlAtUipyYSpQLWhhKkoqVytFKnJhKlcrUipKKmctRSpWKmcsdWE9UipmYSpQLWhhKlMqUCtoYSpGKlctRSpmYSpXLVIqRipnK0UqUypnLG9hPWhhKlMqSi1SKmZhKkotaGEqRipWK0UqZmEqVitSKkYqcmEtRSpTKnJhLHRhPWEqcGErcipxYSt2KnVhK3oqb2E7aWYoMD09PXRhKXtpZighMD09PWMpdGhyb3cgRXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7cmV0dXJuIHRoaXMuaWRlbnRpdHkoKX1jPTEvdGE7ZVswXT0KcGEqYztlWzFdPShmYSpWKnotUypyYSp6LWZhKnYqVytyKnJhKlcrUyp2KmctcipWKmcpKmM7ZVsyXT0oRipyYSp6LWZhKkoqeitmYSp2KlAtcipyYSpQLUYqdipnK3IqSipnKSpjO2VbM109KFMqSip6LUYqVip6LVMqdipQK3IqVipQK0YqdipXLXIqSipXKSpjO2VbNF09cWEqYztlWzVdPShSKnJhKnotaGEqVip6K2hhKnYqVy1hKnJhKlctUip2KmcrYSpWKmcpKmM7ZVs2XT0oaGEqSip6LUUqcmEqei1oYSp2KlArYSpyYSpQK0UqdipnLWEqSipnKSpjO2VbN109KEUqVip6LVIqSip6K1IqdipQLWEqVipQLUUqdipXK2EqSipXKSpjO2VbOF09dWEqYztlWzldPShoYSpTKnotUipmYSp6LWhhKnIqVythKmZhKlcrUipyKmctYSpTKmcpKmM7ZVsxMF09KEUqZmEqei1oYSpGKnoraGEqcipQLWEqZmEqUC1FKnIqZythKkYqZykqYztlWzExXT0oUipGKnotRSpTKnotUipyKlArYSpTKlArRSpyKlctYSpGKlcpKmM7ZVsxMl09b2EqYztlWzEzXT0oUipmYSp2LWhhKlMqditoYSpyKlYtYSpmYSpWLQpSKnIqcmErYSpTKnJhKSpjO2VbMTRdPShoYSpGKnYtRSpmYSp2LWhhKnIqSithKmZhKkorRSpyKnJhLWEqRipyYSkqYztlWzE1XT0oRSpTKnYtUipGKnYrUipyKkotYSpTKkotRSpyKlYrYSpGKlYpKmM7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLngsZz1hLnk7YT1hLno7Y1swXSo9ZTtjWzRdKj1nO2NbOF0qPWE7Y1sxXSo9ZTtjWzVdKj1nO2NbOV0qPWE7Y1syXSo9ZTtjWzZdKj1nO2NbMTBdKj1hO2NbM10qPWU7Y1s3XSo9ZztjWzExXSo9YTtyZXR1cm4gdGhpc30sZ2V0TWF4U2NhbGVPbkF4aXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoYVswXSphWzBdK2FbMV0qYVsxXSthWzJdKmFbMl0sYVs0XSphWzRdK2FbNV0qYVs1XSthWzZdKmFbNl0sYVs4XSphWzhdK2FbOV0qYVs5XSthWzEwXSphWzEwXSkpfSxtYWtlVHJhbnNsYXRpb246ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KDEsCjAsMCxhLDAsMSwwLGMsMCwwLDEsZSwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWDpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KDEsMCwwLDAsMCxjLC1hLDAsMCxhLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsMCxhLDAsMCwxLDAsMCwtYSwwLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWjpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsLWEsMCwwLGEsYywwLDAsMCwwLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uQXhpczpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9MS1lLHI9YS54LHY9YS55O2E9YS56O3ZhciB6PWcqcixFPWcqdjt0aGlzLnNldCh6KgpyK2Useip2LWMqYSx6KmErYyp2LDAseip2K2MqYSxFKnYrZSxFKmEtYypyLDAseiphLWMqdixFKmErYypyLGcqYSphK2UsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNjYWxlOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldChhLDAsMCwwLDAsYywwLDAsMCwwLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNoZWFyOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldCgxLGMsZSwwLGEsMSxlLDAsYSxjLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sY29tcG9zZTpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cyxyPWMuX3gsdj1jLl95LHo9Yy5feixFPWMuX3csRj1yK3IsSj12K3YsUD16K3o7Yz1yKkY7dmFyIFI9cipKO3IqPVA7dmFyIFM9dipKO3YqPVA7eio9UDtGKj1FO0oqPUU7RSo9UDtQPWUueDt2YXIgVj1lLnk7ZT1lLno7Z1swXT0oMS0oUyt6KSkqUDtnWzFdPShSK0UpKlA7Z1syXT0oci1KKSpQO2dbM109MDtnWzRdPShSLUUpKlY7Z1s1XT0oMS0oYyt6KSkqClY7Z1s2XT0oditGKSpWO2dbN109MDtnWzhdPShyK0opKmU7Z1s5XT0odi1GKSplO2dbMTBdPSgxLShjK1MpKSplO2dbMTFdPTA7Z1sxMl09YS54O2dbMTNdPWEueTtnWzE0XT1hLno7Z1sxNV09MTtyZXR1cm4gdGhpc30sZGVjb21wb3NlOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLmVsZW1lbnRzLHI9cWMuc2V0KGdbMF0sZ1sxXSxnWzJdKS5sZW5ndGgoKSx2PXFjLnNldChnWzRdLGdbNV0sZ1s2XSkubGVuZ3RoKCksej1xYy5zZXQoZ1s4XSxnWzldLGdbMTBdKS5sZW5ndGgoKTswPnRoaXMuZGV0ZXJtaW5hbnQoKSYmKHI9LXIpO2EueD1nWzEyXTthLnk9Z1sxM107YS56PWdbMTRdO1FiLmNvcHkodGhpcyk7YT0xL3I7Zz0xL3Y7dmFyIEU9MS96O1FiLmVsZW1lbnRzWzBdKj1hO1FiLmVsZW1lbnRzWzFdKj1hO1FiLmVsZW1lbnRzWzJdKj1hO1FiLmVsZW1lbnRzWzRdKj1nO1FiLmVsZW1lbnRzWzVdKj1nO1FiLmVsZW1lbnRzWzZdKj1nO1FiLmVsZW1lbnRzWzhdKj1FO1FiLmVsZW1lbnRzWzldKj0KRTtRYi5lbGVtZW50c1sxMF0qPUU7Yy5zZXRGcm9tUm90YXRpb25NYXRyaXgoUWIpO2UueD1yO2UueT12O2Uuej16O3JldHVybiB0aGlzfSxtYWtlUGVyc3BlY3RpdmU6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZvaWQgMD09PXYmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO3ZhciB6PXRoaXMuZWxlbWVudHM7elswXT0yKnIvKGMtYSk7els0XT0wO3pbOF09KGMrYSkvKGMtYSk7elsxMl09MDt6WzFdPTA7els1XT0yKnIvKGUtZyk7els5XT0oZStnKS8oZS1nKTt6WzEzXT0wO3pbMl09MDt6WzZdPTA7elsxMF09LSh2K3IpLyh2LXIpO3pbMTRdPS0yKnYqci8odi1yKTt6WzNdPTA7els3XT0wO3pbMTFdPS0xO3pbMTVdPTA7cmV0dXJuIHRoaXN9LG1ha2VPcnRob2dyYXBoaWM6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZhciB6PQp0aGlzLmVsZW1lbnRzLEU9MS8oYy1hKSxGPTEvKGUtZyksSj0xLyh2LXIpO3pbMF09MipFO3pbNF09MDt6WzhdPTA7elsxMl09LSgoYythKSpFKTt6WzFdPTA7els1XT0yKkY7els5XT0wO3pbMTNdPS0oKGUrZykqRik7elsyXT0wO3pbNl09MDt6WzEwXT0tMipKO3pbMTRdPS0oKHYrcikqSik7elszXT0wO3pbN109MDt6WzExXT0wO3pbMTVdPTE7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2E9YS5lbGVtZW50cztmb3IodmFyIGU9MDsxNj5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7MTY+ZTtlKyspdGhpcy5lbGVtZW50c1tlXT1hW2UrY107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGU9dGhpcy5lbGVtZW50czthW2NdPWVbMF07CmFbYysxXT1lWzFdO2FbYysyXT1lWzJdO2FbYyszXT1lWzNdO2FbYys0XT1lWzRdO2FbYys1XT1lWzVdO2FbYys2XT1lWzZdO2FbYys3XT1lWzddO2FbYys4XT1lWzhdO2FbYys5XT1lWzldO2FbYysxMF09ZVsxMF07YVtjKzExXT1lWzExXTthW2MrMTJdPWVbMTJdO2FbYysxM109ZVsxM107YVtjKzE0XT1lWzE0XTthW2MrMTVdPWVbMTVdO3JldHVybiBhfX0pO3ZhciBjaz1uZXcgcSxkaz1uZXcgaDt1LlJvdGF0aW9uT3JkZXJzPSJYWVogWVpYIFpYWSBYWlkgWVhaIFpZWCIuc3BsaXQoIiAiKTt1LkRlZmF1bHRPcmRlcj0iWFlaIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1LnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihhKXt0aGlzLl94PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihhKXt0aGlzLl95PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sCno6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5fej1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LG9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JkZXJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9vcmRlcj1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19fSk7T2JqZWN0LmFzc2lnbih1LnByb3RvdHlwZSx7aXNFdWxlcjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fb3JkZXI9Z3x8dGhpcy5fb3JkZXI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5feD1hLl94O3RoaXMuX3k9YS5feTt0aGlzLl96PWEuX3o7dGhpcy5fb3JkZXI9YS5fb3JkZXI7CnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz1oYi5jbGFtcCxyPWEuZWxlbWVudHM7YT1yWzBdO3ZhciB2PXJbNF0sej1yWzhdLEU9clsxXSxGPXJbNV0sSj1yWzldLFA9clsyXSxSPXJbNl07cj1yWzEwXTtjPWN8fHRoaXMuX29yZGVyOyJYWVoiPT09Yz8odGhpcy5feT1NYXRoLmFzaW4oZyh6LC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyh6KT8odGhpcy5feD1NYXRoLmF0YW4yKC1KLHIpLHRoaXMuX3o9TWF0aC5hdGFuMigtdixhKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihSLEYpLHRoaXMuX3o9MCkpOiJZWFoiPT09Yz8odGhpcy5feD1NYXRoLmFzaW4oLWcoSiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoSik/KHRoaXMuX3k9TWF0aC5hdGFuMih6LHIpLHRoaXMuX3o9TWF0aC5hdGFuMihFLEYpKToodGhpcy5feT1NYXRoLmF0YW4yKC1QLGEpLHRoaXMuX3o9MCkpOiJaWFkiPT09Yz8odGhpcy5feD0KTWF0aC5hc2luKGcoUiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoUik/KHRoaXMuX3k9TWF0aC5hdGFuMigtUCxyKSx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKEUsYSkpKToiWllYIj09PWM/KHRoaXMuX3k9TWF0aC5hc2luKC1nKFAsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFApPyh0aGlzLl94PU1hdGguYXRhbjIoUixyKSx0aGlzLl96PU1hdGguYXRhbjIoRSxhKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpKToiWVpYIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKGcoRSwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoRSk/KHRoaXMuX3g9TWF0aC5hdGFuMigtSixGKSx0aGlzLl95PU1hdGguYXRhbjIoLVAsYSkpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKHoscikpKToiWFpZIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKC1nKHYsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKHYpPyh0aGlzLl94PQpNYXRoLmF0YW4yKFIsRiksdGhpcy5feT1NYXRoLmF0YW4yKHosYSkpOih0aGlzLl94PU1hdGguYXRhbjIoLUosciksdGhpcy5feT0wKSk6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAiK2MpO3RoaXMuX29yZGVyPWM7ITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEsYyxlKXtjay5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihhKTtyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoY2ssYyxlKX0sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5zZXQoYS54LGEueSxhLnosY3x8dGhpcy5fb3JkZXIpfSxyZW9yZGVyOmZ1bmN0aW9uKGEpe2RrLnNldEZyb21FdWxlcih0aGlzKTtyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbihkayxhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLl94PT09CnRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fb3JkZXI9PT10aGlzLl9vcmRlcn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YVswXTt0aGlzLl95PWFbMV07dGhpcy5fej1hWzJdO3ZvaWQgMCE9PWFbM10mJih0aGlzLl9vcmRlcj1hWzNdKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLl94O2FbYysxXT10aGlzLl95O2FbYysyXT10aGlzLl96O2FbYyszXT10aGlzLl9vcmRlcjtyZXR1cm4gYX0sdG9WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiBhP2Euc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgayh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pOwpPYmplY3QuYXNzaWduKHgucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrPTE8PGF8MH0sZW5hYmxlOmZ1bmN0aW9uKGEpe3RoaXMubWFzaz10aGlzLm1hc2t8MTw8YXwwfSxlbmFibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9LTF9LHRvZ2dsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2tePTE8PGF8MH0sZGlzYWJsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2smPX4oMTw8YXwwKX0sZGlzYWJsZUFsbDpmdW5jdGlvbigpe3RoaXMubWFzaz0wfSx0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiAwIT09KHRoaXMubWFzayZhLm1hc2spfX0pO3ZhciBPaz0wLGVrPW5ldyBrLGZmPW5ldyBoLGpkPW5ldyBxLGhoPW5ldyBrLGtnPW5ldyBrLHptPW5ldyBrLEFtPW5ldyBoLGZrPW5ldyBrKDEsMCwwKSxnaz1uZXcgaygwLDEsMCksaGs9bmV3IGsoMCwwLDEpLEJtPXt0eXBlOiJhZGRlZCJ9LENtPXt0eXBlOiJyZW1vdmVkIn07QS5EZWZhdWx0VXA9bmV3IGsoMCwxLDApO0EuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9CiEwO0EucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkEsaXNPYmplY3QzRDohMCxvbkJlZm9yZVJlbmRlcjpmdW5jdGlvbigpe30sb25BZnRlclJlbmRlcjpmdW5jdGlvbigpe30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMubWF0cml4LnByZW11bHRpcGx5KGEpO3RoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX0sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShhKTtyZXR1cm4gdGhpc30sc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsYyl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoYSxjKX0sc2V0Um90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihhLAohMCl9LHNldFJvdGF0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGEpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5jb3B5KGEpfSxyb3RhdGVPbkF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlT25Xb3JsZEF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoZmssYSl9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGdrLGEpfSxyb3RhdGVaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhoayxhKX0sdHJhbnNsYXRlT25BeGlzOmZ1bmN0aW9uKGEsCmMpe2VrLmNvcHkoYSkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbik7dGhpcy5wb3NpdGlvbi5hZGQoZWsubXVsdGlwbHlTY2FsYXIoYykpO3JldHVybiB0aGlzfSx0cmFuc2xhdGVYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhmayxhKX0sdHJhbnNsYXRlWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoZ2ssYSl9LHRyYW5zbGF0ZVo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGhrLGEpfSxsb2NhbFRvV29ybGQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfSx3b3JsZFRvTG9jYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KGpkLmdldEludmVyc2UodGhpcy5tYXRyaXhXb3JsZCkpfSxsb29rQXQ6ZnVuY3Rpb24oYSxjLGUpe2EuaXNWZWN0b3IzP2hoLmNvcHkoYSk6aGguc2V0KGEsYyxlKTthPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsCiExKTtrZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P2pkLmxvb2tBdChrZyxoaCx0aGlzLnVwKTpqZC5sb29rQXQoaGgsa2csdGhpcy51cCk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChqZCk7YSYmKGpkLmV4dHJhY3RSb3RhdGlvbihhLm1hdHJpeFdvcmxkKSxmZi5zZXRGcm9tUm90YXRpb25NYXRyaXgoamQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShmZi5pbnZlcnNlKCkpKX0sYWRkOmZ1bmN0aW9uKGEpe2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBjPTA7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl0aGlzLmFkZChhcmd1bWVudHNbY10pO3JldHVybiB0aGlzfWlmKGE9PT10aGlzKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLGEpLHRoaXM7YSYmYS5pc09iamVjdDNEPwoobnVsbCE9PWEucGFyZW50JiZhLnBhcmVudC5yZW1vdmUoYSksYS5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2goYSksYS5kaXNwYXRjaEV2ZW50KEJtKSk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsYSk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihhKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW2NdKTtyZXR1cm4gdGhpc31jPXRoaXMuY2hpbGRyZW4uaW5kZXhPZihhKTstMSE9PWMmJihhLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGMsMSksYS5kaXNwYXRjaEV2ZW50KENtKSk7cmV0dXJuIHRoaXN9LGF0dGFjaDpmdW5jdGlvbihhKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtqZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpO251bGwhPT0KYS5wYXJlbnQmJihhLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksamQubXVsdGlwbHkoYS5wYXJlbnQubWF0cml4V29ybGQpKTthLmFwcGx5TWF0cml4KGpkKTthLnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTt0aGlzLmFkZChhKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0QnlJZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsYSl9LGdldE9iamVjdEJ5TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIixhKX0sZ2V0T2JqZWN0QnlQcm9wZXJ0eTpmdW5jdGlvbihhLGMpe2lmKHRoaXNbYV09PT1jKXJldHVybiB0aGlzO2Zvcih2YXIgZT0wLGc9dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5jaGlsZHJlbltlXS5nZXRPYmplY3RCeVByb3BlcnR5KGEsYyk7aWYodm9pZCAwIT09cilyZXR1cm4gcn19LGdldFdvcmxkUG9zaXRpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09CmEmJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtyZXR1cm4gYS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9LGdldFdvcmxkUXVhdGVybmlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBoKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShrZyxhLHptKTtyZXR1cm4gYX0sZ2V0V29ybGRTY2FsZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7CnRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGtnLEFtLGEpO3JldHVybiBhfSxnZXRXb3JsZERpcmVjdGlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KGNbOF0sY1s5XSxjWzEwXSkubm9ybWFsaXplKCl9LHJheWNhc3Q6ZnVuY3Rpb24oKXt9LHRyYXZlcnNlOmZ1bmN0aW9uKGEpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlKGEpfSx0cmF2ZXJzZVZpc2libGU6ZnVuY3Rpb24oYSl7aWYoITEhPT10aGlzLnZpc2libGUpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlVmlzaWJsZShhKX19LAp0cmF2ZXJzZUFuY2VzdG9yczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBhcmVudDtudWxsIT09YyYmKGEoYyksYy50cmF2ZXJzZUFuY2VzdG9ycyhhKSl9LHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSk7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7aWYodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHxhKW51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLGE9ITA7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0KMCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS51cGRhdGVNYXRyaXhXb3JsZChhKX0sdXBkYXRlV29ybGRNYXRyaXg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLnBhcmVudDshMD09PWEmJm51bGwhPT1lJiZlLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7bnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KTtpZighMD09PWMpZm9yKGE9dGhpcy5jaGlsZHJlbixjPTAsZT1hLmxlbmd0aDtjPGU7YysrKWFbY10udXBkYXRlV29ybGRNYXRyaXgoITEsITApfSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhQLFIpe3ZvaWQgMD09PVBbUi51dWlkXSYmKFBbUi51dWlkXT1SLnRvSlNPTihhKSk7cmV0dXJuIFIudXVpZH1mdW5jdGlvbiBlKFApe3ZhciBSPQpbXSxTO2ZvcihTIGluIFApe3ZhciBWPVBbU107ZGVsZXRlIFYubWV0YWRhdGE7Ui5wdXNoKFYpfXJldHVybiBSfXZhciBnPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGEscj17fTtnJiYoYT17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fX0sci5tZXRhZGF0YT17dmVyc2lvbjo0LjUsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTt2YXIgdj17fTt2LnV1aWQ9dGhpcy51dWlkO3YudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih2Lm5hbWU9dGhpcy5uYW1lKTshMD09PXRoaXMuY2FzdFNoYWRvdyYmKHYuY2FzdFNoYWRvdz0hMCk7ITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9ITApOyExPT09dGhpcy52aXNpYmxlJiYodi52aXNpYmxlPSExKTshMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHYuZnJ1c3R1bUN1bGxlZD0hMSk7MCE9PXRoaXMucmVuZGVyT3JkZXImJgoodi5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKTsie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJih2LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO3YubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2s7di5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpOyExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYodi5tYXRyaXhBdXRvVXBkYXRlPSExKTt0aGlzLmlzTWVzaCYmMCE9PXRoaXMuZHJhd01vZGUmJih2LmRyYXdNb2RlPXRoaXMuZHJhd01vZGUpO2lmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7di5nZW9tZXRyeT1jKGEuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTt2YXIgej10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09eiYmdm9pZCAwIT09ei5zaGFwZXMpaWYoej16LnNoYXBlcyxBcnJheS5pc0FycmF5KHopKWZvcih2YXIgRT0wLEY9ei5sZW5ndGg7RTxGO0UrKyljKGEuc2hhcGVzLHpbRV0pO2Vsc2UgYyhhLnNoYXBlcywKeil9aWYodm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXt6PVtdO0U9MDtmb3IoRj10aGlzLm1hdGVyaWFsLmxlbmd0aDtFPEY7RSsrKXoucHVzaChjKGEubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbRV0pKTt2Lm1hdGVyaWFsPXp9ZWxzZSB2Lm1hdGVyaWFsPWMoYS5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYoMDx0aGlzLmNoaWxkcmVuLmxlbmd0aClmb3Iodi5jaGlsZHJlbj1bXSxFPTA7RTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtFKyspdi5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bRV0udG9KU09OKGEpLm9iamVjdCk7aWYoZyl7Zz1lKGEuZ2VvbWV0cmllcyk7RT1lKGEubWF0ZXJpYWxzKTtGPWUoYS50ZXh0dXJlcyk7dmFyIEo9ZShhLmltYWdlcyk7ej1lKGEuc2hhcGVzKTswPGcubGVuZ3RoJiYoci5nZW9tZXRyaWVzPWcpOzA8RS5sZW5ndGgmJihyLm1hdGVyaWFscz1FKTswPEYubGVuZ3RoJiYoci50ZXh0dXJlcz1GKTsKMDxKLmxlbmd0aCYmKHIuaW1hZ2VzPUopOzA8ei5sZW5ndGgmJihyLnNoYXBlcz16KX1yLm9iamVjdD12O3JldHVybiByfSxjbG9uZTpmdW5jdGlvbihhKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyxhKX0sY29weTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPSEwKTt0aGlzLm5hbWU9YS5uYW1lO3RoaXMudXAuY29weShhLnVwKTt0aGlzLnBvc2l0aW9uLmNvcHkoYS5wb3NpdGlvbik7dGhpcy5xdWF0ZXJuaW9uLmNvcHkoYS5xdWF0ZXJuaW9uKTt0aGlzLnNjYWxlLmNvcHkoYS5zY2FsZSk7dGhpcy5tYXRyaXguY29weShhLm1hdHJpeCk7dGhpcy5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPWEubWF0cml4V29ybGROZWVkc1VwZGF0ZTt0aGlzLmxheWVycy5tYXNrPWEubGF5ZXJzLm1hc2s7dGhpcy52aXNpYmxlPWEudmlzaWJsZTsKdGhpcy5jYXN0U2hhZG93PWEuY2FzdFNoYWRvdzt0aGlzLnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93O3RoaXMuZnJ1c3R1bUN1bGxlZD1hLmZydXN0dW1DdWxsZWQ7dGhpcy5yZW5kZXJPcmRlcj1hLnJlbmRlck9yZGVyO3RoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhLnVzZXJEYXRhKSk7aWYoITA9PT1jKWZvcihjPTA7YzxhLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5hZGQoYS5jaGlsZHJlbltjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt5LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp5LGlzU2NlbmU6ITAsY29weTpmdW5jdGlvbihhLGMpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsYyk7bnVsbCE9PWEuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD1hLmJhY2tncm91bmQuY2xvbmUoKSk7bnVsbCE9PWEuZm9nJiYodGhpcy5mb2c9YS5mb2cuY2xvbmUoKSk7Cm51bGwhPT1hLm92ZXJyaWRlTWF0ZXJpYWwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9YS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpO3RoaXMuYXV0b1VwZGF0ZT1hLmF1dG9VcGRhdGU7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3ZhciBjPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7bnVsbCE9PXRoaXMuYmFja2dyb3VuZCYmKGMub2JqZWN0LmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihhKSk7bnVsbCE9PXRoaXMuZm9nJiYoYy5vYmplY3QuZm9nPXRoaXMuZm9nLnRvSlNPTigpKTtyZXR1cm4gY30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIga2Q9W25ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrXSxXYz1uZXcgayxnZj1uZXcgayxoZj1uZXcgayxqZj1uZXcgaywKRmQ9bmV3IGssR2Q9bmV3IGssZmU9bmV3IGssbGc9bmV3IGssaWg9bmV3IGssamg9bmV3IGssS2Q9bmV3IGs7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSx7aXNCb3gzOiEwLHNldDpmdW5jdGlvbihhLGMpe3RoaXMubWluLmNvcHkoYSk7dGhpcy5tYXguY29weShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbUFycmF5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LGc9SW5maW5pdHkscj0tSW5maW5pdHksdj0tSW5maW5pdHksej0tSW5maW5pdHksRT0wLEY9YS5sZW5ndGg7RTxGO0UrPTMpe3ZhciBKPWFbRV0sUD1hW0UrMV0sUj1hW0UrMl07SjxjJiYoYz1KKTtQPGUmJihlPVApO1I8ZyYmKGc9Uik7Sj5yJiYocj1KKTtQPnYmJih2PVApO1I+eiYmKHo9Uil9dGhpcy5taW4uc2V0KGMsZSxnKTt0aGlzLm1heC5zZXQocix2LHopO3JldHVybiB0aGlzfSxzZXRGcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LApnPUluZmluaXR5LHI9LUluZmluaXR5LHY9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxGPWEuY291bnQ7RTxGO0UrKyl7dmFyIEo9YS5nZXRYKEUpLFA9YS5nZXRZKEUpLFI9YS5nZXRaKEUpO0o8YyYmKGM9Sik7UDxlJiYoZT1QKTtSPGcmJihnPVIpO0o+ciYmKHI9Sik7UD52JiYodj1QKTtSPnomJih6PVIpfXRoaXMubWluLnNldChjLGUsZyk7dGhpcy5tYXguc2V0KHIsdix6KTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYVtjXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGEsYyl7Yz1XYy5jb3B5KGMpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGEpLnN1YihjKTt0aGlzLm1heC5jb3B5KGEpLmFkZChjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpOwpyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdChhKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5taW4uY29weShhLm1pbik7dGhpcy5tYXguY29weShhLm1heCk7cmV0dXJuIHRoaXN9LG1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PUluZmluaXR5O3RoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/CmEuc2V0KDAsMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwLDApOmEuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEpO3RoaXMubWF4Lm1heChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5taW4uc3ViKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkU2NhbGFyKC1hKTt0aGlzLm1heC5hZGRTY2FsYXIoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjO2EudXBkYXRlV29ybGRNYXRyaXgoITEsCiExKTt2YXIgZT1hLmdlb21ldHJ5O2lmKHZvaWQgMCE9PWUpaWYoZS5pc0dlb21ldHJ5KXt2YXIgZz1lLnZlcnRpY2VzO2U9MDtmb3IoYz1nLmxlbmd0aDtlPGM7ZSsrKVdjLmNvcHkoZ1tlXSksV2MuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChXYyl9ZWxzZSBpZihlLmlzQnVmZmVyR2VvbWV0cnkmJihnPWUuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1nKSlmb3IoZT0wLGM9Zy5jb3VudDtlPGM7ZSsrKVdjLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KFdjKTthPWEuY2hpbGRyZW47ZT0wO2ZvcihjPWEubGVuZ3RoO2U8YztlKyspdGhpcy5leHBhbmRCeU9iamVjdChhW2VdKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnl8fAphLno8dGhpcy5taW4uenx8YS56PnRoaXMubWF4Lno/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD1hLm1pbi56JiZhLm1heC56PD10aGlzLm1heC56fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLnNldCgoYS54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLChhLnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKGEuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4Lng8dGhpcy5taW4ueHx8CmEubWluLng+dGhpcy5tYXgueHx8YS5tYXgueTx0aGlzLm1pbi55fHxhLm1pbi55PnRoaXMubWF4Lnl8fGEubWF4Lno8dGhpcy5taW4uenx8YS5taW4uej50aGlzLm1heC56PyExOiEwfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3RoaXMuY2xhbXBQb2ludChhLmNlbnRlcixXYyk7cmV0dXJuIFdjLmRpc3RhbmNlVG9TcXVhcmVkKGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXtpZigwPGEubm9ybWFsLngpe3ZhciBjPWEubm9ybWFsLngqdGhpcy5taW4ueDt2YXIgZT1hLm5vcm1hbC54KnRoaXMubWF4Lnh9ZWxzZSBjPWEubm9ybWFsLngqdGhpcy5tYXgueCxlPWEubm9ybWFsLngqdGhpcy5taW4ueDswPGEubm9ybWFsLnk/KGMrPWEubm9ybWFsLnkqdGhpcy5taW4ueSxlKz1hLm5vcm1hbC55KnRoaXMubWF4LnkpOihjKz1hLm5vcm1hbC55KnRoaXMubWF4LnksZSs9YS5ub3JtYWwueSp0aGlzLm1pbi55KTswPGEubm9ybWFsLno/CihjKz1hLm5vcm1hbC56KnRoaXMubWluLnosZSs9YS5ub3JtYWwueip0aGlzLm1heC56KTooYys9YS5ub3JtYWwueip0aGlzLm1heC56LGUrPWEubm9ybWFsLnoqdGhpcy5taW4ueik7cmV0dXJuIGM8PS1hLmNvbnN0YW50JiZlPj0tYS5jb25zdGFudH0saW50ZXJzZWN0c1RyaWFuZ2xlOmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKGxnKTtpaC5zdWJWZWN0b3JzKHRoaXMubWF4LGxnKTtnZi5zdWJWZWN0b3JzKGEuYSxsZyk7aGYuc3ViVmVjdG9ycyhhLmIsbGcpO2pmLnN1YlZlY3RvcnMoYS5jLGxnKTtGZC5zdWJWZWN0b3JzKGhmLGdmKTtHZC5zdWJWZWN0b3JzKGpmLGhmKTtmZS5zdWJWZWN0b3JzKGdmLGpmKTthPVswLC1GZC56LEZkLnksMCwtR2QueixHZC55LDAsLWZlLnosZmUueSxGZC56LDAsLUZkLngsR2QueiwwLC1HZC54LGZlLnosMCwtZmUueCwtRmQueSxGZC54LDAsLUdkLnksR2QueCwwLC1mZS55LGZlLngsMF07aWYoIUMoYSwKZ2YsaGYsamYsaWgpKXJldHVybiExO2E9WzEsMCwwLDAsMSwwLDAsMCwxXTtpZighQyhhLGdmLGhmLGpmLGloKSlyZXR1cm4hMTtqaC5jcm9zc1ZlY3RvcnMoRmQsR2QpO2E9W2poLngsamgueSxqaC56XTtyZXR1cm4gQyhhLGdmLGhmLGpmLGloKX0sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFdjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihhKS5sZW5ndGgoKX0sZ2V0Qm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmY29uc29sZS5lcnJvcigiVEhSRUUuQm94MzogLmdldEJvdW5kaW5nU3BoZXJlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpO3RoaXMuZ2V0Q2VudGVyKGEuY2VudGVyKTsKYS5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKFdjKS5sZW5ndGgoKTtyZXR1cm4gYX0saW50ZXJzZWN0OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1heChhLm1pbik7dGhpcy5tYXgubWluKGEubWF4KTt0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7a2RbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7a2RbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7CmtkWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO2tkWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO3RoaXMuc2V0RnJvbVBvaW50cyhrZCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGQoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWluLmVxdWFscyh0aGlzLm1pbikmJmEubWF4LmVxdWFscyh0aGlzLm1heCl9fSk7dmFyIERtPW5ldyB3O09iamVjdC5hc3NpZ24oRy5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMuY2VudGVyLmNvcHkoYSk7dGhpcy5yYWRpdXM9CmM7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmNlbnRlcjt2b2lkIDAhPT1jP2UuY29weShjKTpEbS5zZXRGcm9tUG9pbnRzKGEpLmdldENlbnRlcihlKTtmb3IodmFyIGc9Yz0wLHI9YS5sZW5ndGg7ZzxyO2crKyljPU1hdGgubWF4KGMsZS5kaXN0YW5jZVRvU3F1YXJlZChhW2ddKSk7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5jb3B5KGEuY2VudGVyKTt0aGlzLnJhZGl1cz1hLnJhZGl1cztyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD49dGhpcy5yYWRpdXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLQp0aGlzLnJhZGl1c30saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnJhZGl1cythLnJhZGl1cztyZXR1cm4gYS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1jKmN9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyhhLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c30sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKGEpO3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7Yy5jb3B5KGEpO2U+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihjLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksYy5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSk7CnJldHVybiBjfSxnZXRCb3VuZGluZ0JveDpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyB3KTthLnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlcik7YS5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyk7cmV0dXJuIGF9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoYSk7dGhpcy5yYWRpdXMqPWEuZ2V0TWF4U2NhbGVPbkF4aXMoKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuY2VudGVyLmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZhLnJhZGl1cz09PXRoaXMucmFkaXVzfX0pO3ZhciBsZD1uZXcgayx5aT1uZXcgayxraD1uZXcgayxIZD1uZXcgayx6aT1uZXcgayxsaD1uZXcgayxBaT1uZXcgazsKT2JqZWN0LmFzc2lnbihELnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5vcmlnaW4uY29weShhKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm9yaWdpbi5jb3B5KGEub3JpZ2luKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGEuZGlyZWN0aW9uKTtyZXR1cm4gdGhpc30sYXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxsb29rQXQ6ZnVuY3Rpb24oYSl7dGhpcy5kaXJlY3Rpb24uY29weShhKS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxyZWNhc3Q6ZnVuY3Rpb24oYSl7dGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGEsCmxkKSk7cmV0dXJuIHRoaXN9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO2Muc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKTthPWMuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gMD5hP2MuY29weSh0aGlzLm9yaWdpbik6Yy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEpKX0sZGlzdGFuY2VTcVRvUG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9bGQuc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA+YylyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoYSk7bGQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYykuYWRkKHRoaXMub3JpZ2luKTsKcmV0dXJuIGxkLmRpc3RhbmNlVG9TcXVhcmVkKGEpfSxkaXN0YW5jZVNxVG9TZWdtZW50OmZ1bmN0aW9uKGEsYyxlLGcpe3lpLmNvcHkoYSkuYWRkKGMpLm11bHRpcGx5U2NhbGFyKC41KTtraC5jb3B5KGMpLnN1YihhKS5ub3JtYWxpemUoKTtIZC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoeWkpO3ZhciByPS41KmEuZGlzdGFuY2VUbyhjKSx2PS10aGlzLmRpcmVjdGlvbi5kb3Qoa2gpLHo9SGQuZG90KHRoaXMuZGlyZWN0aW9uKSxFPS1IZC5kb3Qoa2gpLEY9SGQubGVuZ3RoU3EoKSxKPU1hdGguYWJzKDEtdip2KTtpZigwPEope2E9dipFLXo7Yz12KnotRTt2YXIgUD1yKko7MDw9YT9jPj0tUD9jPD1QPyhyPTEvSixhKj1yLGMqPXIsdj1hKihhK3YqYysyKnopK2MqKHYqYStjKzIqRSkrRik6KGM9cixhPU1hdGgubWF4KDAsLSh2KmMreikpLHY9LWEqYStjKihjKzIqRSkrRik6KGM9LXIsYT1NYXRoLm1heCgwLC0odipjK3opKSx2PS1hKmErYyooYysyKkUpK0YpOmM8PS1QPyhhPU1hdGgubWF4KDAsCi0oLXYqcit6KSksYz0wPGE/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRik6Yzw9UD8oYT0wLGM9TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9YyooYysyKkUpK0YpOihhPU1hdGgubWF4KDAsLSh2KnIreikpLGM9MDxhP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRil9ZWxzZSBjPTA8dj8tcjpyLGE9TWF0aC5tYXgoMCwtKHYqYyt6KSksdj0tYSphK2MqKGMrMipFKStGO2UmJmUuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKTtnJiZnLmNvcHkoa2gpLm11bHRpcGx5U2NhbGFyKGMpLmFkZCh5aSk7cmV0dXJuIHZ9LGludGVyc2VjdFNwaGVyZTpmdW5jdGlvbihhLGMpe2xkLnN1YlZlY3RvcnMoYS5jZW50ZXIsdGhpcy5vcmlnaW4pO3ZhciBlPWxkLmRvdCh0aGlzLmRpcmVjdGlvbiksZz1sZC5kb3QobGQpLWUqZTthPWEucmFkaXVzKmEucmFkaXVzOwppZihnPmEpcmV0dXJuIG51bGw7YT1NYXRoLnNxcnQoYS1nKTtnPWUtYTtlKz1hO3JldHVybiAwPmcmJjA+ZT9udWxsOjA+Zz90aGlzLmF0KGUsYyk6dGhpcy5hdChnLGMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGRpc3RhbmNlVG9QbGFuZTpmdW5jdGlvbihhKXt2YXIgYz1hLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1jKXJldHVybiAwPT09YS5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDthPS0odGhpcy5vcmlnaW4uZG90KGEubm9ybWFsKSthLmNvbnN0YW50KS9jO3JldHVybiAwPD1hP2E6bnVsbH0saW50ZXJzZWN0UGxhbmU6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGEpO3JldHVybiBudWxsPT09YT9udWxsOnRoaXMuYXQoYSxjKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKcmV0dXJuIDA9PT1jfHwwPmEubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqYz8hMDohMX0saW50ZXJzZWN0Qm94OmZ1bmN0aW9uKGEsYyl7dmFyIGU9MS90aGlzLmRpcmVjdGlvbi54O3ZhciBnPTEvdGhpcy5kaXJlY3Rpb24ueTt2YXIgcj0xL3RoaXMuZGlyZWN0aW9uLnosdj10aGlzLm9yaWdpbjtpZigwPD1lKXt2YXIgej0oYS5taW4ueC12LngpKmU7ZSo9YS5tYXgueC12Lnh9ZWxzZSB6PShhLm1heC54LXYueCkqZSxlKj1hLm1pbi54LXYueDtpZigwPD1nKXt2YXIgRT0oYS5taW4ueS12LnkpKmc7Zyo9YS5tYXgueS12Lnl9ZWxzZSBFPShhLm1heC55LXYueSkqZyxnKj1hLm1pbi55LXYueTtpZih6Pmd8fEU+ZSlyZXR1cm4gbnVsbDtpZihFPnp8fHohPT16KXo9RTtpZihnPGV8fGUhPT1lKWU9ZzswPD1yPyhFPShhLm1pbi56LXYueikqcixhPShhLm1heC56LXYueikqcik6KEU9KGEubWF4Lnotdi56KSpyLGE9KGEubWluLnotdi56KSpyKTtpZih6PmF8fEU+ZSlyZXR1cm4gbnVsbDsKaWYoRT56fHx6IT09eil6PUU7aWYoYTxlfHxlIT09ZSllPWE7cmV0dXJuIDA+ZT9udWxsOnRoaXMuYXQoMDw9ej96OmUsYyl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveChhLGxkKX0saW50ZXJzZWN0VHJpYW5nbGU6ZnVuY3Rpb24oYSxjLGUsZyxyKXt6aS5zdWJWZWN0b3JzKGMsYSk7bGguc3ViVmVjdG9ycyhlLGEpO0FpLmNyb3NzVmVjdG9ycyh6aSxsaCk7Yz10aGlzLmRpcmVjdGlvbi5kb3QoQWkpO2lmKDA8Yyl7aWYoZylyZXR1cm4gbnVsbDtnPTF9ZWxzZSBpZigwPmMpZz0tMSxjPS1jO2Vsc2UgcmV0dXJuIG51bGw7SGQuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbixhKTthPWcqdGhpcy5kaXJlY3Rpb24uZG90KGxoLmNyb3NzVmVjdG9ycyhIZCxsaCkpO2lmKDA+YSlyZXR1cm4gbnVsbDtlPWcqdGhpcy5kaXJlY3Rpb24uZG90KHppLmNyb3NzKEhkKSk7aWYoMD5lfHxhK2U+YylyZXR1cm4gbnVsbDthPS1nKkhkLmRvdChBaSk7CnJldHVybiAwPmE/bnVsbDp0aGlzLmF0KGEvYyxyKX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMub3JpZ2luLmFwcGx5TWF0cml4NChhKTt0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmYS5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX19KTt2YXIgSWM9bmV3IGssbWQ9bmV3IGssQmk9bmV3IGssbmQ9bmV3IGssa2Y9bmV3IGssbGY9bmV3IGssaWs9bmV3IGssQ2k9bmV3IGssRGk9bmV3IGssRWk9bmV3IGs7T2JqZWN0LmFzc2lnbihCLHtnZXROb3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7dm9pZCAwPT09ZyYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZz1uZXcgayk7Zy5zdWJWZWN0b3JzKGUsYyk7SWMuc3ViVmVjdG9ycyhhLGMpO2cuY3Jvc3MoSWMpOwphPWcubGVuZ3RoU3EoKTtyZXR1cm4gMDxhP2cubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoYSkpOmcuc2V0KDAsMCwwKX0sZ2V0QmFyeWNvb3JkOmZ1bmN0aW9uKGEsYyxlLGcscil7SWMuc3ViVmVjdG9ycyhnLGMpO21kLnN1YlZlY3RvcnMoZSxjKTtCaS5zdWJWZWN0b3JzKGEsYyk7YT1JYy5kb3QoSWMpO2M9SWMuZG90KG1kKTtlPUljLmRvdChCaSk7dmFyIHY9bWQuZG90KG1kKTtnPW1kLmRvdChCaSk7dmFyIHo9YSp2LWMqYzt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldEJhcnljb29yZCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxyPW5ldyBrKTtpZigwPT09eilyZXR1cm4gci5zZXQoLTIsLTEsLTEpO3o9MS96O3Y9KHYqZS1jKmcpKno7YT0oYSpnLWMqZSkqejtyZXR1cm4gci5zZXQoMS12LWEsYSx2KX0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhLGMsZSxnKXtCLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtyZXR1cm4gMDw9bmQueCYmCjA8PW5kLnkmJjE+PW5kLngrbmQueX0sZ2V0VVY6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtFLnNldCgwLDApO0UuYWRkU2NhbGVkVmVjdG9yKHIsbmQueCk7RS5hZGRTY2FsZWRWZWN0b3IodixuZC55KTtFLmFkZFNjYWxlZFZlY3Rvcih6LG5kLnopO3JldHVybiBFfSxpc0Zyb250RmFjaW5nOmZ1bmN0aW9uKGEsYyxlLGcpe0ljLnN1YlZlY3RvcnMoZSxjKTttZC5zdWJWZWN0b3JzKGEsYyk7cmV0dXJuIDA+SWMuY3Jvc3MobWQpLmRvdChnKT8hMDohMX19KTtPYmplY3QuYXNzaWduKEIucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuYS5jb3B5KGEpO3RoaXMuYi5jb3B5KGMpO3RoaXMuYy5jb3B5KGUpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLmEuY29weShhW2NdKTt0aGlzLmIuY29weShhW2VdKTt0aGlzLmMuY29weShhW2ddKTtyZXR1cm4gdGhpc30sCmNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYS5jb3B5KGEuYSk7dGhpcy5iLmNvcHkoYS5iKTt0aGlzLmMuY29weShhLmMpO3JldHVybiB0aGlzfSxnZXRBcmVhOmZ1bmN0aW9uKCl7SWMuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKTttZC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpO3JldHVybi41KkljLmNyb3NzKG1kKS5sZW5ndGgoKX0sZ2V0TWlkcG9pbnQ6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9LGdldE5vcm1hbDpmdW5jdGlvbihhKXtyZXR1cm4gQi5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsYSl9LGdldFBsYW5lOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3JldHVybiBhLnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGdldEJhcnljb29yZDpmdW5jdGlvbihhLGMpe3JldHVybiBCLmdldEJhcnljb29yZChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGMpfSxnZXRVVjpmdW5jdGlvbihhLGMsZSxnLHIpe3JldHVybiBCLmdldFVWKGEsdGhpcy5hLHRoaXMuYix0aGlzLmMsYyxlLGcscil9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuY29udGFpbnNQb2ludChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihhKXtyZXR1cm4gQi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGEpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX0sY2xvc2VzdFBvaW50VG9Qb2ludDpmdW5jdGlvbihhLApjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7dmFyIGU9dGhpcy5hLGc9dGhpcy5iLHI9dGhpcy5jO2tmLnN1YlZlY3RvcnMoZyxlKTtsZi5zdWJWZWN0b3JzKHIsZSk7Q2kuc3ViVmVjdG9ycyhhLGUpO3ZhciB2PWtmLmRvdChDaSksej1sZi5kb3QoQ2kpO2lmKDA+PXYmJjA+PXopcmV0dXJuIGMuY29weShlKTtEaS5zdWJWZWN0b3JzKGEsZyk7dmFyIEU9a2YuZG90KERpKSxGPWxmLmRvdChEaSk7aWYoMDw9RSYmRjw9RSlyZXR1cm4gYy5jb3B5KGcpO3ZhciBKPXYqRi1FKno7aWYoMD49SiYmMDw9diYmMD49RSlyZXR1cm4gZz12Lyh2LUUpLGMuY29weShlKS5hZGRTY2FsZWRWZWN0b3Ioa2YsZyk7RWkuc3ViVmVjdG9ycyhhLHIpO2E9a2YuZG90KEVpKTt2YXIgUD1sZi5kb3QoRWkpO2lmKDA8PVAmJmE8PVApcmV0dXJuIGMuY29weShyKTt2PWEqei0KdipQO2lmKDA+PXYmJjA8PXomJjA+PVApcmV0dXJuIEo9ei8oei1QKSxjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGxmLEopO3o9RSpQLWEqRjtpZigwPj16JiYwPD1GLUUmJjA8PWEtUClyZXR1cm4gaWsuc3ViVmVjdG9ycyhyLGcpLEo9KEYtRSkvKEYtRSsoYS1QKSksYy5jb3B5KGcpLmFkZFNjYWxlZFZlY3RvcihpayxKKTtyPTEvKHorditKKTtnPXYqcjtKKj1yO3JldHVybiBjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGtmLGcpLmFkZFNjYWxlZFZlY3RvcihsZixKKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmEuZXF1YWxzKHRoaXMuYSkmJmEuYi5lcXVhbHModGhpcy5iKSYmYS5jLmVxdWFscyh0aGlzLmMpfX0pO3ZhciBFbT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSwKYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LApkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsCmxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NywKbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LApyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LGxjPXtoOjAsCnM6MCxsOjB9LG1oPXtoOjAsczowLGw6MH07T2JqZWN0LmFzc2lnbihJLnByb3RvdHlwZSx7aXNDb2xvcjohMCxyOjEsZzoxLGI6MSxzZXQ6ZnVuY3Rpb24oYSl7YSYmYS5pc0NvbG9yP3RoaXMuY29weShhKToibnVtYmVyIj09PXR5cGVvZiBhP3RoaXMuc2V0SGV4KGEpOiJzdHJpbmciPT09dHlwZW9mIGEmJnRoaXMuc2V0U3R5bGUoYSk7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLmI9dGhpcy5nPXRoaXMucj1hO3JldHVybiB0aGlzfSxzZXRIZXg6ZnVuY3Rpb24oYSl7YT1NYXRoLmZsb29yKGEpO3RoaXMucj0oYT4+MTYmMjU1KS8yNTU7dGhpcy5nPShhPj44JjI1NSkvMjU1O3RoaXMuYj0oYSYyNTUpLzI1NTtyZXR1cm4gdGhpc30sc2V0UkdCOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnI9YTt0aGlzLmc9Yzt0aGlzLmI9ZTtyZXR1cm4gdGhpc30sc2V0SFNMOmZ1bmN0aW9uKGEsYyxlKXthPWhiLmV1Y2xpZGVhbk1vZHVsbyhhLDEpO2M9aGIuY2xhbXAoYywwLAoxKTtlPWhiLmNsYW1wKGUsMCwxKTswPT09Yz90aGlzLnI9dGhpcy5nPXRoaXMuYj1lOihjPS41Pj1lP2UqKDErYyk6ZStjLWUqYyxlPTIqZS1jLHRoaXMucj1OKGUsYyxhKzEvMyksdGhpcy5nPU4oZSxjLGEpLHRoaXMuYj1OKGUsYyxhLTEvMykpO3JldHVybiB0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHope3ZvaWQgMCE9PXomJjE+cGFyc2VGbG9hdCh6KSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrYSsiIHdpbGwgYmUgaWdub3JlZC4iKX12YXIgZTtpZihlPS9eKCg/OnJnYnxoc2wpYT8pXChccyooW15cKV0qKVwpLy5leGVjKGEpKXt2YXIgZz1lWzJdO3N3aXRjaChlWzFdKXtjYXNlICJyZ2IiOmNhc2UgInJnYmEiOmlmKGU9L14oXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoZykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVsxXSwKMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludChlWzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVszXSwxMCkpLzI1NSxjKGVbNV0pLHRoaXM7aWYoZT0vXihcZCspJVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhnKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludChlWzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQoZVsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KGVbM10sMTApKS8xMDAsYyhlWzVdKSx0aGlzO2JyZWFrO2Nhc2UgImhzbCI6Y2FzZSAiaHNsYSI6aWYoZT0vXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspJVxzKixccyooXGQrKSVccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKGcpKXtnPXBhcnNlRmxvYXQoZVsxXSkvMzYwO3ZhciByPXBhcnNlSW50KGVbMl0sCjEwKS8xMDAsdj1wYXJzZUludChlWzNdLDEwKS8xMDA7YyhlWzVdKTtyZXR1cm4gdGhpcy5zZXRIU0woZyxyLHYpfX19ZWxzZSBpZihlPS9eIyhbQS1GYS1mMC05XSspJC8uZXhlYyhhKSl7ZT1lWzFdO2c9ZS5sZW5ndGg7aWYoMz09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgxKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCg0KStlLmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9YSYmMDxhLmxlbmd0aCYmKGU9RW1bYV0sdm9pZCAwIT09ZT90aGlzLnNldEhleChlKToKY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK2EpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucj1hLnI7dGhpcy5nPWEuZzt0aGlzLmI9YS5iO3JldHVybiB0aGlzfSxjb3B5R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO2M9MDxjPzEvYzoxO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb252ZXJ0R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhKXt0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsCmEpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhKXt0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKHRoaXMsYSk7cmV0dXJuIHRoaXN9LGNvcHlTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oYSl7dGhpcy5yPU8oYS5yKTt0aGlzLmc9TyhhLmcpO3RoaXMuYj1PKGEuYik7cmV0dXJuIHRoaXN9LGNvcHlMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oYSl7dGhpcy5yPUgoYS5yKTt0aGlzLmc9SChhLmcpO3RoaXMuYj1IKGEuYik7cmV0dXJuIHRoaXN9LGNvbnZlcnRTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oKXt0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyk7cmV0dXJuIHRoaXN9LGNvbnZlcnRMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oKXt0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyk7cmV0dXJuIHRoaXN9LGdldEhleDpmdW5jdGlvbigpe3JldHVybiAyNTUqdGhpcy5yPDwxNl4yNTUqdGhpcy5nPDw4XjI1NSp0aGlzLmI8PDB9LGdldEhleFN0cmluZzpmdW5jdGlvbigpe3JldHVybigiMDAwMDAwIisKdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX0sZ2V0SFNMOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9e2g6MCxzOjAsbDowfSk7dmFyIGM9dGhpcy5yLGU9dGhpcy5nLGc9dGhpcy5iLHI9TWF0aC5tYXgoYyxlLGcpLHY9TWF0aC5taW4oYyxlLGcpLHosRT0odityKS8yO2lmKHY9PT1yKXY9ej0wO2Vsc2V7dmFyIEY9ci12O3Y9LjU+PUU/Ri8ocit2KTpGLygyLXItdik7c3dpdGNoKHIpe2Nhc2UgYzp6PShlLWcpL0YrKGU8Zz82OjApO2JyZWFrO2Nhc2UgZTp6PShnLWMpL0YrMjticmVhaztjYXNlIGc6ej0oYy1lKS9GKzR9ei89Nn1hLmg9ejthLnM9djthLmw9RTtyZXR1cm4gYX0sZ2V0U3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm4icmdiKCIrKDI1NSp0aGlzLnJ8MCkrIiwiKygyNTUqdGhpcy5nfDApKyIsIisoMjU1KnRoaXMuYnwwKSsiKSJ9LG9mZnNldEhTTDpmdW5jdGlvbihhLApjLGUpe3RoaXMuZ2V0SFNMKGxjKTtsYy5oKz1hO2xjLnMrPWM7bGMubCs9ZTt0aGlzLnNldEhTTChsYy5oLGxjLnMsbGMubCk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhKXt0aGlzLnIrPWEucjt0aGlzLmcrPWEuZzt0aGlzLmIrPWEuYjtyZXR1cm4gdGhpc30sYWRkQ29sb3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy5yPWEucitjLnI7dGhpcy5nPWEuZytjLmc7dGhpcy5iPWEuYitjLmI7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnIrPWE7dGhpcy5nKz1hO3RoaXMuYis9YTtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEpe3RoaXMucj1NYXRoLm1heCgwLHRoaXMuci1hLnIpO3RoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1hLmcpO3RoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1hLmIpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLnIqPWEucjt0aGlzLmcqPWEuZzt0aGlzLmIqPWEuYjtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5yKj0KYTt0aGlzLmcqPWE7dGhpcy5iKj1hO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy5yKz0oYS5yLXRoaXMucikqYzt0aGlzLmcrPShhLmctdGhpcy5nKSpjO3RoaXMuYis9KGEuYi10aGlzLmIpKmM7cmV0dXJuIHRoaXN9LGxlcnBIU0w6ZnVuY3Rpb24oYSxjKXt0aGlzLmdldEhTTChsYyk7YS5nZXRIU0wobWgpO2E9aGIubGVycChsYy5oLG1oLmgsYyk7dmFyIGU9aGIubGVycChsYy5zLG1oLnMsYyk7Yz1oYi5sZXJwKGxjLmwsbWgubCxjKTt0aGlzLnNldEhTTChhLGUsYyk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5yPT09dGhpcy5yJiZhLmc9PT10aGlzLmcmJmEuYj09PXRoaXMuYn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5yPWFbY107dGhpcy5nPWFbYysxXTt0aGlzLmI9YVtjKzJdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PQpjJiYoYz0wKTthW2NdPXRoaXMucjthW2MrMV09dGhpcy5nO2FbYysyXT10aGlzLmI7cmV0dXJuIGF9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEhleCgpfX0pO09iamVjdC5hc3NpZ24oSy5wcm90b3R5cGUse2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYT1hLmE7dGhpcy5iPWEuYjt0aGlzLmM9YS5jO3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hdGVyaWFsSW5kZXg9YS5tYXRlcmlhbEluZGV4O2Zvcih2YXIgYz0wLGU9YS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtjPGU7YysrKXRoaXMudmVydGV4Tm9ybWFsc1tjXT1hLnZlcnRleE5vcm1hbHNbY10uY2xvbmUoKTtjPTA7Zm9yKGU9YS52ZXJ0ZXhDb2xvcnMubGVuZ3RoO2M8ZTtjKyspdGhpcy52ZXJ0ZXhDb2xvcnNbY109YS52ZXJ0ZXhDb2xvcnNbY10uY2xvbmUoKTsKcmV0dXJuIHRoaXN9fSk7dmFyIFBrPTA7TS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TSxpc01hdGVyaWFsOiEwLG9uQmVmb3JlQ29tcGlsZTpmdW5jdGlvbigpe30sc2V0VmFsdWVzOmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpZm9yKHZhciBjIGluIGEpe3ZhciBlPWFbY107aWYodm9pZCAwPT09ZSljb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAnIitjKyInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIik7ZWxzZSBpZigic2hhZGluZyI9PT1jKWNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PWU/ITA6ITE7ZWxzZXt2YXIgZz10aGlzW2NdO3ZvaWQgMD09PWc/Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAnIitjKyInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIik6CmcmJmcuaXNDb2xvcj9nLnNldChlKTpnJiZnLmlzVmVjdG9yMyYmZSYmZS5pc1ZlY3RvcjM/Zy5jb3B5KGUpOnRoaXNbY109ZX19fSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhyKXt2YXIgdj1bXSx6O2Zvcih6IGluIHIpe3ZhciBFPXJbel07ZGVsZXRlIEUubWV0YWRhdGE7di5wdXNoKEUpfXJldHVybiB2fXZhciBlPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGE7ZSYmKGE9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO3ZhciBnPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O2cudXVpZD10aGlzLnV1aWQ7Zy50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGcubmFtZT10aGlzLm5hbWUpO3RoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKGcuY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyk7CnZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYoZy5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpO3RoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKGcuZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihnLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpO3RoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKGcuc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyk7dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJgp0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihnLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oYSkudXVpZCxnLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYoZy5tYXA9dGhpcy5tYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihnLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04oYSkudXVpZCk7dGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihnLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYoZy5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKGcuYW9NYXA9dGhpcy5hb01hcC50b0pTT04oYSkudXVpZCwKZy5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KTt0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihnLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTihhKS51dWlkLGcuYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKTt0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYoZy5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKGEpLnV1aWQsZy5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxnLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYoZy5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKGEpLnV1aWQsZy5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLGcuZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpO3RoaXMucm91Z2huZXNzTWFwJiYKdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYoZy5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihnLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04oYSkudXVpZCk7dGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihnLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYoZy5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYoZy5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKGEpLnV1aWQsZy5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHksZy5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8sCnZvaWQgMCE9PXRoaXMuY29tYmluZSYmKGcuY29tYmluZT10aGlzLmNvbWJpbmUpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYoZy5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpKTt0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKGcuZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04oYSkudXVpZCk7dm9pZCAwIT09dGhpcy5zaXplJiYoZy5zaXplPXRoaXMuc2l6ZSk7dm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbik7MSE9PXRoaXMuYmxlbmRpbmcmJihnLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpOyEwPT09dGhpcy5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyk7MCE9PXRoaXMuc2lkZSYmKGcuc2lkZT10aGlzLnNpZGUpOzAhPT10aGlzLnZlcnRleENvbG9ycyYmKGcudmVydGV4Q29sb3JzPQp0aGlzLnZlcnRleENvbG9ycyk7MT50aGlzLm9wYWNpdHkmJihnLm9wYWNpdHk9dGhpcy5vcGFjaXR5KTshMD09PXRoaXMudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpO2cuZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jO2cuZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0O2cuZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGU7Zy5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGU7Zy5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jO2cuc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWY7Zy5zdGVuY2lsTWFzaz10aGlzLnN0ZW5jaWxNYXNrO2cuc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbDtnLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbDtnLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzczt0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKGcucm90YXRpb249dGhpcy5yb3RhdGlvbik7ITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJgooZy5wb2x5Z29uT2Zmc2V0PSEwKTswIT09dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcik7MCE9PXRoaXMucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpO3RoaXMubGluZXdpZHRoJiYxIT09dGhpcy5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCk7dm9pZCAwIT09dGhpcy5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSk7dm9pZCAwIT09dGhpcy5nYXBTaXplJiYoZy5nYXBTaXplPXRoaXMuZ2FwU2l6ZSk7dm9pZCAwIT09dGhpcy5zY2FsZSYmKGcuc2NhbGU9dGhpcy5zY2FsZSk7ITA9PT10aGlzLmRpdGhlcmluZyYmKGcuZGl0aGVyaW5nPSEwKTswPHRoaXMuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpOyEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihnLnByZW11bHRpcGxpZWRBbHBoYT0KdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpOyEwPT09dGhpcy53aXJlZnJhbWUmJihnLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSk7MTx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCYmKGcud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKTsicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYoZy53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihnLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pOyEwPT09dGhpcy5tb3JwaFRhcmdldHMmJihnLm1vcnBoVGFyZ2V0cz0hMCk7ITA9PT10aGlzLm1vcnBoTm9ybWFscyYmKGcubW9ycGhOb3JtYWxzPSEwKTshMD09PXRoaXMuc2tpbm5pbmcmJihnLnNraW5uaW5nPSEwKTshMT09PXRoaXMudmlzaWJsZSYmKGcudmlzaWJsZT0hMSk7ITE9PT10aGlzLnRvbmVNYXBwZWQmJihnLnRvbmVNYXBwZWQ9ITEpOwoie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihnLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2UmJihlPWMoYS50ZXh0dXJlcyksYT1jKGEuaW1hZ2VzKSwwPGUubGVuZ3RoJiYoZy50ZXh0dXJlcz1lKSwwPGEubGVuZ3RoJiYoZy5pbWFnZXM9YSkpO3JldHVybiBnfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm5hbWU9YS5uYW1lO3RoaXMuZm9nPWEuZm9nO3RoaXMubGlnaHRzPWEubGlnaHRzO3RoaXMuYmxlbmRpbmc9YS5ibGVuZGluZzt0aGlzLnNpZGU9YS5zaWRlO3RoaXMuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZzt0aGlzLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9yczt0aGlzLm9wYWNpdHk9YS5vcGFjaXR5O3RoaXMudHJhbnNwYXJlbnQ9YS50cmFuc3BhcmVudDt0aGlzLmJsZW5kU3JjPWEuYmxlbmRTcmM7dGhpcy5ibGVuZERzdD1hLmJsZW5kRHN0O3RoaXMuYmxlbmRFcXVhdGlvbj0KYS5ibGVuZEVxdWF0aW9uO3RoaXMuYmxlbmRTcmNBbHBoYT1hLmJsZW5kU3JjQWxwaGE7dGhpcy5ibGVuZERzdEFscGhhPWEuYmxlbmREc3RBbHBoYTt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1hLmJsZW5kRXF1YXRpb25BbHBoYTt0aGlzLmRlcHRoRnVuYz1hLmRlcHRoRnVuYzt0aGlzLmRlcHRoVGVzdD1hLmRlcHRoVGVzdDt0aGlzLmRlcHRoV3JpdGU9YS5kZXB0aFdyaXRlO3RoaXMuc3RlbmNpbFdyaXRlPWEuc3RlbmNpbFdyaXRlO3RoaXMuc3RlbmNpbEZ1bmM9YS5zdGVuY2lsRnVuYzt0aGlzLnN0ZW5jaWxSZWY9YS5zdGVuY2lsUmVmO3RoaXMuc3RlbmNpbE1hc2s9YS5zdGVuY2lsTWFzazt0aGlzLnN0ZW5jaWxGYWlsPWEuc3RlbmNpbEZhaWw7dGhpcy5zdGVuY2lsWkZhaWw9YS5zdGVuY2lsWkZhaWw7dGhpcy5zdGVuY2lsWlBhc3M9YS5zdGVuY2lsWlBhc3M7dGhpcy5jb2xvcldyaXRlPWEuY29sb3JXcml0ZTt0aGlzLnByZWNpc2lvbj1hLnByZWNpc2lvbjt0aGlzLnBvbHlnb25PZmZzZXQ9CmEucG9seWdvbk9mZnNldDt0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9YS5wb2x5Z29uT2Zmc2V0RmFjdG9yO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPWEucG9seWdvbk9mZnNldFVuaXRzO3RoaXMuZGl0aGVyaW5nPWEuZGl0aGVyaW5nO3RoaXMuYWxwaGFUZXN0PWEuYWxwaGFUZXN0O3RoaXMucHJlbXVsdGlwbGllZEFscGhhPWEucHJlbXVsdGlwbGllZEFscGhhO3RoaXMudmlzaWJsZT1hLnZpc2libGU7dGhpcy50b25lTWFwcGVkPWEudG9uZU1hcHBlZDt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS51c2VyRGF0YSkpO3RoaXMuY2xpcFNoYWRvd3M9YS5jbGlwU2hhZG93czt0aGlzLmNsaXBJbnRlcnNlY3Rpb249YS5jbGlwSW50ZXJzZWN0aW9uO3ZhciBjPWEuY2xpcHBpbmdQbGFuZXMsZT1udWxsO2lmKG51bGwhPT1jKXt2YXIgZz1jLmxlbmd0aDtlPUFycmF5KGcpO2Zvcih2YXIgcj0wO3IhPT1nOysrcillW3JdPWNbcl0uY2xvbmUoKX10aGlzLmNsaXBwaW5nUGxhbmVzPQplO3RoaXMuc2hhZG93U2lkZT1hLnNoYWRvd1NpZGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7TC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7TC5wcm90b3R5cGUuY29uc3RydWN0b3I9TDtMLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsPSEwO0wucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWFwPWEubWFwO3RoaXMubGlnaHRNYXA9YS5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1hLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9YS5hb01hcEludGVuc2l0eTt0aGlzLnNwZWN1bGFyTWFwPWEuc3BlY3VsYXJNYXA7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuZW52TWFwPWEuZW52TWFwOwp0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1hLndpcmVmcmFtZUxpbmVjYXA7dGhpcy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0cztyZXR1cm4gdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KFEucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUS5wcm90b3R5cGUse2lzQnVmZmVyQXR0cmlidXRlOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuaXRlbVNpemU6MDt0aGlzLmFycmF5PWE7cmV0dXJuIHRoaXN9LHNldER5bmFtaWM6ZnVuY3Rpb24oYSl7dGhpcy5keW5hbWljPWE7cmV0dXJuIHRoaXN9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmFycmF5PW5ldyBhLmFycmF5LmNvbnN0cnVjdG9yKGEuYXJyYXkpO3RoaXMuaXRlbVNpemU9YS5pdGVtU2l6ZTt0aGlzLmNvdW50PWEuY291bnQ7dGhpcy5ub3JtYWxpemVkPWEubm9ybWFsaXplZDt0aGlzLmR5bmFtaWM9YS5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuaXRlbVNpemU7ZSo9Yy5pdGVtU2l6ZTtmb3IodmFyIGc9MCxyPXRoaXMuaXRlbVNpemU7ZzxyO2crKyl0aGlzLmFycmF5W2ErZ109Yy5hcnJheVtlK2ddO3JldHVybiB0aGlzfSxjb3B5QXJyYXk6ZnVuY3Rpb24oYSl7dGhpcy5hcnJheS5zZXQoYSk7cmV0dXJuIHRoaXN9LGNvcHlDb2xvcnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9CnRoaXMuYXJyYXksZT0wLGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IEkpO2NbZSsrXT12LnI7Y1tlKytdPXYuZztjW2UrK109di5ifXJldHVybiB0aGlzfSxjb3B5VmVjdG9yMnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgZik7Y1tlKytdPXYueDtjW2UrK109di55fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yM3NBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9CmFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IGspO2NbZSsrXT12Lng7Y1tlKytdPXYueTtjW2UrK109di56fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yNHNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgcCk7Y1tlKytdPXYueDtjW2UrK109di55O2NbZSsrXT12Lno7Y1tlKytdPXYud31yZXR1cm4gdGhpc30sc2V0OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5hcnJheS5zZXQoYSxjKTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKgp0aGlzLml0ZW1TaXplXX0sc2V0WDpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplXT1jO3JldHVybiB0aGlzfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsxXX0sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzFdPWM7cmV0dXJuIHRoaXN9LGdldFo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzJdfSxzZXRaOmZ1bmN0aW9uKGEsYyl7dGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrMl09YztyZXR1cm4gdGhpc30sZ2V0VzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrM119LHNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSszXT1jO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErCjFdPWU7cmV0dXJuIHRoaXN9LHNldFhZWjpmdW5jdGlvbihhLGMsZSxnKXthKj10aGlzLml0ZW1TaXplO3RoaXMuYXJyYXlbYSswXT1jO3RoaXMuYXJyYXlbYSsxXT1lO3RoaXMuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErMV09ZTt0aGlzLmFycmF5W2ErMl09Zzt0aGlzLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc30sb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLApub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fSk7VC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7VC5wcm90b3R5cGUuY29uc3RydWN0b3I9VDtYLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtYLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YO2FhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTthYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YWE7bGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2xhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sYTtaLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtaLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aO2JhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7ZWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2VhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lYTtjYS5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jYTtrYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7a2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWthO09iamVjdC5hc3NpZ24oWS5wcm90b3R5cGUse2NvbXB1dGVHcm91cHM6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZT12b2lkIDA7YT1hLmZhY2VzO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgcj1hW2ddO2lmKHIubWF0ZXJpYWxJbmRleCE9PWUpe2U9ci5tYXRlcmlhbEluZGV4O3ZvaWQgMCE9PXYmJih2LmNvdW50PTMqZy12LnN0YXJ0LGMucHVzaCh2KSk7dmFyIHY9e3N0YXJ0OjMqZyxtYXRlcmlhbEluZGV4OmV9fX12b2lkIDAhPT12JiYodi5jb3VudD0zKmctdi5zdGFydCxjLnB1c2godikpO3RoaXMuZ3JvdXBzPWN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihhKXt2YXIgYz1hLmZhY2VzLGU9YS52ZXJ0aWNlcyxnPWEuZmFjZVZlcnRleFV2cyxyPWdbMF0mJgowPGdbMF0ubGVuZ3RoLHY9Z1sxXSYmMDxnWzFdLmxlbmd0aCx6PWEubW9ycGhUYXJnZXRzLEU9ei5sZW5ndGg7aWYoMDxFKXt2YXIgRj1bXTtmb3IodmFyIEo9MDtKPEU7SisrKUZbSl09e25hbWU6eltKXS5uYW1lLGRhdGE6W119O3RoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uPUZ9dmFyIFA9YS5tb3JwaE5vcm1hbHMsUj1QLmxlbmd0aDtpZigwPFIpe3ZhciBTPVtdO2ZvcihKPTA7SjxSO0orKylTW0pdPXtuYW1lOlBbSl0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWw9U312YXIgVj1hLnNraW5JbmRpY2VzLFc9YS5za2luV2VpZ2h0cyxoYT1WLmxlbmd0aD09PWUubGVuZ3RoLGZhPVcubGVuZ3RoPT09ZS5sZW5ndGg7MDxlLmxlbmd0aCYmMD09PWMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5EaXJlY3RHZW9tZXRyeTogRmFjZWxlc3MgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtmb3IoSj0wO0o8Yy5sZW5ndGg7SisrKXt2YXIgcmE9Y1tKXTsKdGhpcy52ZXJ0aWNlcy5wdXNoKGVbcmEuYV0sZVtyYS5iXSxlW3JhLmNdKTt2YXIgcGE9cmEudmVydGV4Tm9ybWFsczszPT09cGEubGVuZ3RoP3RoaXMubm9ybWFscy5wdXNoKHBhWzBdLHBhWzFdLHBhWzJdKToocGE9cmEubm9ybWFsLHRoaXMubm9ybWFscy5wdXNoKHBhLHBhLHBhKSk7cGE9cmEudmVydGV4Q29sb3JzOzM9PT1wYS5sZW5ndGg/dGhpcy5jb2xvcnMucHVzaChwYVswXSxwYVsxXSxwYVsyXSk6KHBhPXJhLmNvbG9yLHRoaXMuY29sb3JzLnB1c2gocGEscGEscGEpKTshMD09PXImJihwYT1nWzBdW0pdLHZvaWQgMCE9PXBhP3RoaXMudXZzLnB1c2gocGFbMF0scGFbMV0scGFbMl0pOihjb25zb2xlLndhcm4oIlRIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgIixKKSx0aGlzLnV2cy5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpOyEwPT09diYmKHBhPWdbMV1bSl0sdm9pZCAwIT09cGE/dGhpcy51dnMyLnB1c2gocGFbMF0sCnBhWzFdLHBhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAiLEopLHRoaXMudXZzMi5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpO2ZvcihwYT0wO3BhPEU7cGErKyl7dmFyIHFhPXpbcGFdLnZlcnRpY2VzO0ZbcGFdLmRhdGEucHVzaChxYVtyYS5hXSxxYVtyYS5iXSxxYVtyYS5jXSl9Zm9yKHBhPTA7cGE8UjtwYSsrKXFhPVBbcGFdLnZlcnRleE5vcm1hbHNbSl0sU1twYV0uZGF0YS5wdXNoKHFhLmEscWEuYixxYS5jKTtoYSYmdGhpcy5za2luSW5kaWNlcy5wdXNoKFZbcmEuYV0sVltyYS5iXSxWW3JhLmNdKTtmYSYmdGhpcy5za2luV2VpZ2h0cy5wdXNoKFdbcmEuYV0sV1tyYS5iXSxXW3JhLmNdKX10aGlzLmNvbXB1dGVHcm91cHMoYSk7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9YS52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWEuZ3JvdXBzTmVlZFVwZGF0ZTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt2YXIgUWs9MSxYYz1uZXcgcSxGaT1uZXcgQSxuaD1uZXcgayxnZT1uZXcgdyxHaT1uZXcgdyxKYz1uZXcgazt2YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6dmEsaXNCdWZmZXJHZW9tZXRyeTohMCxnZXRJbmRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4fSxzZXRJbmRleDpmdW5jdGlvbihhKXt0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkoYSk/Cm5ldyAoNjU1MzU8RWEoYSk/ZWE6WikoYSwxKTphfSxhZGRBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe2lmKCEoYyYmYy5pc0J1ZmZlckF0dHJpYnV0ZXx8YyYmYy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuIiksdGhpcy5hZGRBdHRyaWJ1dGUoYSxuZXcgUShjLGUpKTtpZigiaW5kZXgiPT09YSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLiIpLHRoaXMuc2V0SW5kZXgoYyksdGhpczt0aGlzLmF0dHJpYnV0ZXNbYV09YztyZXR1cm4gdGhpc30sZ2V0QXR0cmlidXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbYV19LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2FdOwpyZXR1cm4gdGhpc30sYWRkR3JvdXA6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OmEsY291bnQ6YyxtYXRlcmlhbEluZGV4OnZvaWQgMCE9PWU/ZTowfSl9LGNsZWFyR3JvdXBzOmZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9W119LHNldERyYXdSYW5nZTpmdW5jdGlvbihhLGMpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWE7dGhpcy5kcmF3UmFuZ2UuY291bnQ9Y30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWMmJihhLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYyksYy5uZWVkc1VwZGF0ZT0hMCk7dmFyIGU9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSxjLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoZSksZS5uZWVkc1VwZGF0ZT0hMCk7ZT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSwKYy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO251bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3JldHVybiB0aGlzfSxyb3RhdGVYOmZ1bmN0aW9uKGEpe1hjLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WGMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtYYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1hjLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtYYy5tYWtlU2NhbGUoYSwKYyxlKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGEpe0ZpLmxvb2tBdChhKTtGaS51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KEZpLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIobmgpLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKG5oLngsbmgueSxuaC56KTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O2lmKGEuaXNQb2ludHN8fGEuaXNMaW5lKXthPW5ldyBjYSgzKmMudmVydGljZXMubGVuZ3RoLDMpO3ZhciBlPW5ldyBjYSgzKmMuY29sb3JzLmxlbmd0aCwzKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGEuY29weVZlY3RvcjNzQXJyYXkoYy52ZXJ0aWNlcykpO3RoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsZS5jb3B5Q29sb3JzQXJyYXkoYy5jb2xvcnMpKTsKYy5saW5lRGlzdGFuY2VzJiZjLmxpbmVEaXN0YW5jZXMubGVuZ3RoPT09Yy52ZXJ0aWNlcy5sZW5ndGgmJihhPW5ldyBjYShjLmxpbmVEaXN0YW5jZXMubGVuZ3RoLDEpLHRoaXMuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLGEuY29weUFycmF5KGMubGluZURpc3RhbmNlcykpKTtudWxsIT09Yy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yy5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09Yy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9Yy5ib3VuZGluZ0JveC5jbG9uZSgpKX1lbHNlIGEuaXNNZXNoJiZjJiZjLmlzR2VvbWV0cnkmJnRoaXMuZnJvbUdlb21ldHJ5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MucHVzaChyLngsci55LHIuenx8MCl9dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7CnJldHVybiB0aGlzfSx1cGRhdGVGcm9tT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2VvbWV0cnk7aWYoYS5pc01lc2gpe3ZhciBlPWMuX19kaXJlY3RHZW9tZXRyeTshMD09PWMuZWxlbWVudHNOZWVkVXBkYXRlJiYoZT12b2lkIDAsYy5lbGVtZW50c05lZWRVcGRhdGU9ITEpO2lmKHZvaWQgMD09PWUpcmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KGMpO2UudmVydGljZXNOZWVkVXBkYXRlPWMudmVydGljZXNOZWVkVXBkYXRlO2Uubm9ybWFsc05lZWRVcGRhdGU9Yy5ub3JtYWxzTmVlZFVwZGF0ZTtlLmNvbG9yc05lZWRVcGRhdGU9Yy5jb2xvcnNOZWVkVXBkYXRlO2UudXZzTmVlZFVwZGF0ZT1jLnV2c05lZWRVcGRhdGU7ZS5ncm91cHNOZWVkVXBkYXRlPWMuZ3JvdXBzTmVlZFVwZGF0ZTtjLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMTtjLm5vcm1hbHNOZWVkVXBkYXRlPSExO2MuY29sb3JzTmVlZFVwZGF0ZT0hMTtjLnV2c05lZWRVcGRhdGU9ITE7Yy5ncm91cHNOZWVkVXBkYXRlPSExOwpjPWV9ITA9PT1jLnZlcnRpY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLHZvaWQgMCE9PWUmJihlLmNvcHlWZWN0b3Izc0FycmF5KGMudmVydGljZXMpLGUubmVlZHNVcGRhdGU9ITApLGMudmVydGljZXNOZWVkVXBkYXRlPSExKTshMD09PWMubm9ybWFsc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsdm9pZCAwIT09ZSYmKGUuY29weVZlY3RvcjNzQXJyYXkoYy5ub3JtYWxzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLm5vcm1hbHNOZWVkVXBkYXRlPSExKTshMD09PWMuY29sb3JzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmNvbG9yLHZvaWQgMCE9PWUmJihlLmNvcHlDb2xvcnNBcnJheShjLmNvbG9ycyksZS5uZWVkc1VwZGF0ZT0hMCksYy5jb2xvcnNOZWVkVXBkYXRlPSExKTtjLnV2c05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy51dix2b2lkIDAhPT1lJiYoZS5jb3B5VmVjdG9yMnNBcnJheShjLnV2cyksZS5uZWVkc1VwZGF0ZT0KITApLGMudXZzTmVlZFVwZGF0ZT0hMSk7Yy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZSx2b2lkIDAhPT1lJiYoZS5jb3B5QXJyYXkoYy5saW5lRGlzdGFuY2VzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPSExKTtjLmdyb3Vwc05lZWRVcGRhdGUmJihjLmNvbXB1dGVHcm91cHMoYS5nZW9tZXRyeSksdGhpcy5ncm91cHM9Yy5ncm91cHMsYy5ncm91cHNOZWVkVXBkYXRlPSExKTtyZXR1cm4gdGhpc30sZnJvbUdlb21ldHJ5OmZ1bmN0aW9uKGEpe2EuX19kaXJlY3RHZW9tZXRyeT0obmV3IFkpLmZyb21HZW9tZXRyeShhKTtyZXR1cm4gdGhpcy5mcm9tRGlyZWN0R2VvbWV0cnkoYS5fX2RpcmVjdEdlb21ldHJ5KX0sZnJvbURpcmVjdEdlb21ldHJ5OmZ1bmN0aW9uKGEpe3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsKG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMyphLnZlcnRpY2VzLmxlbmd0aCksCjMpKS5jb3B5VmVjdG9yM3NBcnJheShhLnZlcnRpY2VzKSk7MDxhLm5vcm1hbHMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEubm9ybWFscy5sZW5ndGgpLDMpKS5jb3B5VmVjdG9yM3NBcnJheShhLm5vcm1hbHMpKTswPGEuY29sb3JzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoImNvbG9yIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEuY29sb3JzLmxlbmd0aCksMykpLmNvcHlDb2xvcnNBcnJheShhLmNvbG9ycykpOzA8YS51dnMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMubGVuZ3RoKSwyKSkuY29weVZlY3RvcjJzQXJyYXkoYS51dnMpKTswPGEudXZzMi5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJ1djIiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMyLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGEudXZzMikpOwp0aGlzLmdyb3Vwcz1hLmdyb3Vwcztmb3IodmFyIGMgaW4gYS5tb3JwaFRhcmdldHMpe2Zvcih2YXIgZT1bXSxnPWEubW9ycGhUYXJnZXRzW2NdLHI9MCx2PWcubGVuZ3RoO3I8djtyKyspe3ZhciB6PWdbcl0sRT1uZXcgY2EoMyp6LmRhdGEubGVuZ3RoLDMpO0UubmFtZT16Lm5hbWU7ZS5wdXNoKEUuY29weVZlY3RvcjNzQXJyYXkoei5kYXRhKSl9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY109ZX0wPGEuc2tpbkluZGljZXMubGVuZ3RoJiYoYz1uZXcgY2EoNCphLnNraW5JbmRpY2VzLmxlbmd0aCw0KSx0aGlzLmFkZEF0dHJpYnV0ZSgic2tpbkluZGV4IixjLmNvcHlWZWN0b3I0c0FycmF5KGEuc2tpbkluZGljZXMpKSk7MDxhLnNraW5XZWlnaHRzLmxlbmd0aCYmKGM9bmV3IGNhKDQqYS5za2luV2VpZ2h0cy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5XZWlnaHQiLGMuY29weVZlY3RvcjRzQXJyYXkoYS5za2luV2VpZ2h0cykpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmCih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgdyk7dmFyIGE9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodm9pZCAwIT09YSl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLGMpe2E9MDtmb3IodmFyIGU9Yy5sZW5ndGg7YTxlO2ErKylnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGNbYV0pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5tYXgpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7Cihpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX0sY29tcHV0ZUJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBHKTt2YXIgYT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sYz10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZihhKXt2YXIgZT10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpO2lmKGMpZm9yKHZhciBnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2YXIgdj0KY1tnXTtHaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHYpO2dlLmV4cGFuZEJ5UG9pbnQoR2kubWluKTtnZS5leHBhbmRCeVBvaW50KEdpLm1heCl9Z2UuZ2V0Q2VudGVyKGUpO3ZhciB6PTA7Zz0wO2ZvcihyPWEuY291bnQ7ZzxyO2crKylKYy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsZyksej1NYXRoLm1heCh6LGUuZGlzdGFuY2VUb1NxdWFyZWQoSmMpKTtpZihjKWZvcihnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2PWNbZ107YT0wO2Zvcih2YXIgRT12LmNvdW50O2E8RTthKyspSmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LGEpLHo9TWF0aC5tYXgoeixlLmRpc3RhbmNlVG9TcXVhcmVkKEpjKSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHopO2lzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsCnRoaXMpfX0sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7fSxjb21wdXRlVmVydGV4Tm9ybWFsczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5kZXgsYz10aGlzLmF0dHJpYnV0ZXM7aWYoYy5wb3NpdGlvbil7dmFyIGU9Yy5wb3NpdGlvbi5hcnJheTtpZih2b2lkIDA9PT1jLm5vcm1hbCl0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgUShuZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKSwzKSk7ZWxzZSBmb3IodmFyIGc9Yy5ub3JtYWwuYXJyYXkscj0wLHY9Zy5sZW5ndGg7cjx2O3IrKylnW3JdPTA7Zz1jLm5vcm1hbC5hcnJheTt2YXIgej1uZXcgayxFPW5ldyBrLEY9bmV3IGssSj1uZXcgayxQPW5ldyBrO2lmKGEpe3ZhciBSPWEuYXJyYXk7cj0wO2Zvcih2PWEuY291bnQ7cjx2O3IrPTMpe2E9MypSW3IrMF07dmFyIFM9MypSW3IrMV07dmFyIFY9MypSW3IrMl07ei5mcm9tQXJyYXkoZSxhKTtFLmZyb21BcnJheShlLFMpO0YuZnJvbUFycmF5KGUsVik7Si5zdWJWZWN0b3JzKEYsCkUpO1Auc3ViVmVjdG9ycyh6LEUpO0ouY3Jvc3MoUCk7Z1thXSs9Si54O2dbYSsxXSs9Si55O2dbYSsyXSs9Si56O2dbU10rPUoueDtnW1MrMV0rPUoueTtnW1MrMl0rPUouejtnW1ZdKz1KLng7Z1tWKzFdKz1KLnk7Z1tWKzJdKz1KLnp9fWVsc2UgZm9yKHI9MCx2PWUubGVuZ3RoO3I8djtyKz05KXouZnJvbUFycmF5KGUsciksRS5mcm9tQXJyYXkoZSxyKzMpLEYuZnJvbUFycmF5KGUscis2KSxKLnN1YlZlY3RvcnMoRixFKSxQLnN1YlZlY3RvcnMoeixFKSxKLmNyb3NzKFApLGdbcl09Si54LGdbcisxXT1KLnksZ1tyKzJdPUoueixnW3IrM109Si54LGdbcis0XT1KLnksZ1tyKzVdPUoueixnW3IrNl09Si54LGdbcis3XT1KLnksZ1tyKzhdPUouejt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtjLm5vcm1hbC5uZWVkc1VwZGF0ZT0hMH19LG1lcmdlOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYS5pc0J1ZmZlckdlb21ldHJ5KXt2b2lkIDA9PT1jJiYoYz0wLGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogT3ZlcndyaXRpbmcgb3JpZ2luYWwgZ2VvbWV0cnksIHN0YXJ0aW5nIGF0IG9mZnNldFx4M2QwLiBVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuIikpOwp2YXIgZT10aGlzLmF0dHJpYnV0ZXMsZztmb3IoZyBpbiBlKWlmKHZvaWQgMCE9PWEuYXR0cmlidXRlc1tnXSl7dmFyIHI9ZVtnXS5hcnJheSx2PWEuYXR0cmlidXRlc1tnXSx6PXYuYXJyYXksRT12Lml0ZW1TaXplKmM7dj1NYXRoLm1pbih6Lmxlbmd0aCxyLmxlbmd0aC1FKTtmb3IodmFyIEY9MDtGPHY7RisrLEUrKylyW0VdPXpbRl19cmV0dXJuIHRoaXN9Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsYSl9LG5vcm1hbGl6ZU5vcm1hbHM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbCxjPTAsZT1hLmNvdW50O2M8ZTtjKyspSmMueD1hLmdldFgoYyksSmMueT1hLmdldFkoYyksSmMuej1hLmdldFooYyksSmMubm9ybWFsaXplKCksYS5zZXRYWVooYyxKYy54LEpjLnksSmMueil9LHRvTm9uSW5kZXhlZDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoUCwKUil7dmFyIFM9UC5hcnJheTtQPVAuaXRlbVNpemU7Zm9yKHZhciBWPW5ldyBTLmNvbnN0cnVjdG9yKFIubGVuZ3RoKlApLFcsaGE9MCxmYT0wLHJhPVIubGVuZ3RoO2ZhPHJhO2ZhKyspe1c9UltmYV0qUDtmb3IodmFyIHBhPTA7cGE8UDtwYSsrKVZbaGErK109U1tXKytdfXJldHVybiBuZXcgUShWLFApfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7dmFyIGM9bmV3IHZhLGU9dGhpcy5pbmRleC5hcnJheSxnPXRoaXMuYXR0cmlidXRlcyxyO2ZvcihyIGluIGcpe3ZhciB2PWdbcl07dj1hKHYsZSk7Yy5hZGRBdHRyaWJ1dGUocix2KX12YXIgej10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IociBpbiB6KXt2YXIgRT1bXSxGPXpbcl07Zz0wO2Zvcih2YXIgSj1GLmxlbmd0aDtnPEo7ZysrKXY9RltnXSx2PWEodixlKSxFLnB1c2godik7CmMubW9ycGhBdHRyaWJ1dGVzW3JdPUV9ZT10aGlzLmdyb3VwcztnPTA7Zm9yKHI9ZS5sZW5ndGg7ZzxyO2crKyl2PWVbZ10sYy5hZGRHcm91cCh2LnN0YXJ0LHYuY291bnQsdi5tYXRlcmlhbEluZGV4KTtyZXR1cm4gY30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07YS51dWlkPXRoaXMudXVpZDthLnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYoYS5uYW1lPXRoaXMubmFtZSk7MDxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGgmJihhLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2lmKHZvaWQgMCE9PXRoaXMucGFyYW1ldGVycyl7dmFyIGM9dGhpcy5wYXJhbWV0ZXJzO2ZvcihKIGluIGMpdm9pZCAwIT09Y1tKXSYmKGFbSl09Y1tKXSk7cmV0dXJuIGF9YS5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjPXRoaXMuaW5kZXg7bnVsbCE9PQpjJiYoYS5kYXRhLmluZGV4PXt0eXBlOmMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmFycmF5KX0pO3ZhciBlPXRoaXMuYXR0cmlidXRlcztmb3IoSiBpbiBlKXtjPWVbSl07dmFyIGc9Yy50b0pTT04oKTsiIiE9PWMubmFtZSYmKGcubmFtZT1jLm5hbWUpO2EuZGF0YS5hdHRyaWJ1dGVzW0pdPWd9ZT17fTt2YXIgcj0hMTtmb3IoSiBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Zm9yKHZhciB2PXRoaXMubW9ycGhBdHRyaWJ1dGVzW0pdLHo9W10sRT0wLEY9di5sZW5ndGg7RTxGO0UrKyljPXZbRV0sZz1jLnRvSlNPTigpLCIiIT09Yy5uYW1lJiYoZy5uYW1lPWMubmFtZSksei5wdXNoKGcpOzA8ei5sZW5ndGgmJihlW0pdPXoscj0hMCl9ciYmKGEuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9ZSk7dmFyIEo9dGhpcy5ncm91cHM7MDxKLmxlbmd0aCYmKGEuZGF0YS5ncm91cHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShKKSkpO0o9CnRoaXMuYm91bmRpbmdTcGhlcmU7bnVsbCE9PUomJihhLmRhdGEuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpKLmNlbnRlci50b0FycmF5KCkscmFkaXVzOkoucmFkaXVzfSk7cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB2YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYzt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1hLm5hbWU7dmFyIGU9YS5pbmRleDtudWxsIT09ZSYmdGhpcy5zZXRJbmRleChlLmNsb25lKCkpO2U9YS5hdHRyaWJ1dGVzO2Zvcih6IGluIGUpdGhpcy5hZGRBdHRyaWJ1dGUoeixlW3pdLmNsb25lKCkpO3ZhciBnPWEubW9ycGhBdHRyaWJ1dGVzO2Zvcih6IGluIGcpe3ZhciByPVtdLHY9Z1t6XTtlPTA7Zm9yKGM9di5sZW5ndGg7ZTxjO2UrKylyLnB1c2godltlXS5jbG9uZSgpKTsKdGhpcy5tb3JwaEF0dHJpYnV0ZXNbel09cn12YXIgej1hLmdyb3VwcztlPTA7Zm9yKGM9ei5sZW5ndGg7ZTxjO2UrKylnPXpbZV0sdGhpcy5hZGRHcm91cChnLnN0YXJ0LGcuY291bnQsZy5tYXRlcmlhbEluZGV4KTt6PWEuYm91bmRpbmdCb3g7bnVsbCE9PXomJih0aGlzLmJvdW5kaW5nQm94PXouY2xvbmUoKSk7ej1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT16JiYodGhpcy5ib3VuZGluZ1NwaGVyZT16LmNsb25lKCkpO3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWEuZHJhd1JhbmdlLnN0YXJ0O3RoaXMuZHJhd1JhbmdlLmNvdW50PWEuZHJhd1JhbmdlLmNvdW50O3RoaXMudXNlckRhdGE9YS51c2VyRGF0YTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIgams9bmV3IHEsaGU9bmV3IEQsSGk9bmV3IEcsTGQ9bmV3IGssTWQ9bmV3IGssTmQ9bmV3IGssJGk9bmV3IGssYWo9bmV3IGssYmo9bmV3IGssSWg9Cm5ldyBrLEpoPW5ldyBrLEtoPW5ldyBrLG9lPW5ldyBmLHBlPW5ldyBmLHFlPW5ldyBmLHNmPW5ldyBrLHNnPW5ldyBrO3hhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp4YSxpc01lc2g6ITAsc2V0RHJhd01vZGU6ZnVuY3Rpb24oYSl7dGhpcy5kcmF3TW9kZT1hfSxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZHJhd01vZGU9YS5kcmF3TW9kZTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSxhLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpO3JldHVybiB0aGlzfSx1cGRhdGVNb3JwaFRhcmdldHM6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fSxhPTAsYz1lLmxlbmd0aDthPGM7YSsrKXt2YXIgZz1lW2FdLm5hbWV8fFN0cmluZyhhKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApO3RoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2ddPWF9fX1lbHNlIGE9YS5tb3JwaFRhcmdldHMsdm9pZCAwIT09YSYmMDxhLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5nZW9tZXRyeSwKZz10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtpZih2b2lkIDAhPT1nJiYobnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksSGkuY29weShlLmJvdW5kaW5nU3BoZXJlKSxIaS5hcHBseU1hdHJpeDQociksITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKEhpKSYmKGprLmdldEludmVyc2UociksaGUuY29weShhLnJheSkuYXBwbHlNYXRyaXg0KGprKSxudWxsPT09ZS5ib3VuZGluZ0JveHx8ITEhPT1oZS5pbnRlcnNlY3RzQm94KGUuYm91bmRpbmdCb3gpKSkpaWYoZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4O3I9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZhciB6PWUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLEU9ZS5hdHRyaWJ1dGVzLnV2LEY9ZS5hdHRyaWJ1dGVzLnV2MixKPWUuZ3JvdXBzLFA9ZS5kcmF3UmFuZ2UsUixTO2lmKG51bGwhPT12KWlmKEFycmF5LmlzQXJyYXkoZykpe3ZhciBWPTA7Zm9yKFI9Si5sZW5ndGg7VjwKUjtWKyspe3ZhciBXPUpbVl07dmFyIGhhPWdbVy5tYXRlcmlhbEluZGV4XTt2YXIgZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KTtmb3IoUz1lPU1hdGgubWluKFcuc3RhcnQrVy5jb3VudCxQLnN0YXJ0K1AuY291bnQpO2ZhPFM7ZmErPTMpe2U9di5nZXRYKGZhKTt2YXIgcmE9di5nZXRYKGZhKzEpO3ZhciBwYT12LmdldFgoZmErMik7aWYoZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9fX1lbHNlIGZvcihmYT1NYXRoLm1heCgwLFAuc3RhcnQpLGU9TWF0aC5taW4odi5jb3VudCxQLnN0YXJ0K1AuY291bnQpLFY9ZmEsUj1lO1Y8UjtWKz0zKXtpZihlPXYuZ2V0WChWKSxyYT12LmdldFgoVisxKSxwYT12LmdldFgoVisyKSxlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLApjLnB1c2goZSl9ZWxzZSBpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkoZykpZm9yKFY9MCxSPUoubGVuZ3RoO1Y8UjtWKyspZm9yKFc9SltWXSxoYT1nW1cubWF0ZXJpYWxJbmRleF0sZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KSxTPWU9TWF0aC5taW4oVy5zdGFydCtXLmNvdW50LFAuc3RhcnQrUC5jb3VudCk7ZmE8UztmYSs9Myl7aWYoZT1mYSxyYT1mYSsxLHBhPWZhKzIsZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9ZWxzZSBmb3IoZmE9TWF0aC5tYXgoMCxQLnN0YXJ0KSxlPU1hdGgubWluKHIuY291bnQsUC5zdGFydCtQLmNvdW50KSxWPWZhLFI9ZTtWPFI7Vis9MylpZihlPVYscmE9VisxLHBhPVYrMixlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLGMucHVzaChlKX1lbHNlIGlmKGUuaXNHZW9tZXRyeSlmb3Iocj0KQXJyYXkuaXNBcnJheShnKSx6PWUudmVydGljZXMsRT1lLmZhY2VzLGU9ZS5mYWNlVmVydGV4VXZzWzBdLDA8ZS5sZW5ndGgmJih2PWUpLFY9MCxSPUUubGVuZ3RoO1Y8UjtWKyspaWYoVz1FW1ZdLGU9cj9nW1cubWF0ZXJpYWxJbmRleF06Zyx2b2lkIDAhPT1lJiYoRj16W1cuYV0sSj16W1cuYl0sUD16W1cuY10sZT1BYSh0aGlzLGUsYSxoZSxGLEosUCxzZikpKXYmJnZbVl0mJihoYT12W1ZdLG9lLmNvcHkoaGFbMF0pLHBlLmNvcHkoaGFbMV0pLHFlLmNvcHkoaGFbMl0pLGUudXY9Qi5nZXRVVihzZixGLEosUCxvZSxwZSxxZSxuZXcgZikpLGUuZmFjZT1XLGUuZmFjZUluZGV4PVYsYy5wdXNoKGUpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmdlb21ldHJ5LHRoaXMubWF0ZXJpYWwpKS5jb3B5KHRoaXMpfX0pO3ZhciBSaz0wLFljPW5ldyBxLElpPW5ldyBBLG9oPW5ldyBrO3lhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6eWEsaXNHZW9tZXRyeTohMCxhcHBseU1hdHJpeDpmdW5jdGlvbihhKXtmb3IodmFyIGM9KG5ldyB0KS5nZXROb3JtYWxNYXRyaXgoYSksZT0wLGc9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7ZTxnO2UrKyl0aGlzLnZlcnRpY2VzW2VdLmFwcGx5TWF0cml4NChhKTtlPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7YT10aGlzLmZhY2VzW2VdO2Eubm9ybWFsLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKTtmb3IodmFyIHI9MCx2PWEudmVydGV4Tm9ybWFscy5sZW5ndGg7cjx2O3IrKylhLnZlcnRleE5vcm1hbHNbcl0uYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpfW51bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9ITA7cmV0dXJuIHRoaXN9LApyb3RhdGVYOmZ1bmN0aW9uKGEpe1ljLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WWMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFljKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtZYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1ljLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtZYy5tYWtlU2NhbGUoYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSxsb29rQXQ6ZnVuY3Rpb24oYSl7SWkubG9va0F0KGEpO0lpLnVwZGF0ZU1hdHJpeCgpO3RoaXMuYXBwbHlNYXRyaXgoSWkubWF0cml4KTtyZXR1cm4gdGhpc30sZnJvbUJ1ZmZlckdlb21ldHJ5OmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoViwKVyxoYSxmYSl7dmFyIHJhPXZvaWQgMD09PUU/W106W2UuY29sb3JzW1ZdLmNsb25lKCksZS5jb2xvcnNbV10uY2xvbmUoKSxlLmNvbG9yc1toYV0uY2xvbmUoKV0scGE9dm9pZCAwPT09ej9bXTpbKG5ldyBrKS5mcm9tQXJyYXkoeiwzKlYpLChuZXcgaykuZnJvbUFycmF5KHosMypXKSwobmV3IGspLmZyb21BcnJheSh6LDMqaGEpXTtmYT1uZXcgSyhWLFcsaGEscGEscmEsZmEpO2UuZmFjZXMucHVzaChmYSk7dm9pZCAwIT09RiYmZS5mYWNlVmVydGV4VXZzWzBdLnB1c2goWyhuZXcgZikuZnJvbUFycmF5KEYsMipWKSwobmV3IGYpLmZyb21BcnJheShGLDIqVyksKG5ldyBmKS5mcm9tQXJyYXkoRiwyKmhhKV0pO3ZvaWQgMCE9PUomJmUuZmFjZVZlcnRleFV2c1sxXS5wdXNoKFsobmV3IGYpLmZyb21BcnJheShKLDIqViksKG5ldyBmKS5mcm9tQXJyYXkoSiwyKlcpLChuZXcgZikuZnJvbUFycmF5KEosMipoYSldKX12YXIgZT10aGlzLGc9bnVsbCE9PWEuaW5kZXg/YS5pbmRleC5hcnJheToKdm9pZCAwLHI9YS5hdHRyaWJ1dGVzLHY9ci5wb3NpdGlvbi5hcnJheSx6PXZvaWQgMCE9PXIubm9ybWFsP3Iubm9ybWFsLmFycmF5OnZvaWQgMCxFPXZvaWQgMCE9PXIuY29sb3I/ci5jb2xvci5hcnJheTp2b2lkIDAsRj12b2lkIDAhPT1yLnV2P3IudXYuYXJyYXk6dm9pZCAwLEo9dm9pZCAwIT09ci51djI/ci51djIuYXJyYXk6dm9pZCAwO3ZvaWQgMCE9PUomJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09W10pO2ZvcihyPTA7cjx2Lmxlbmd0aDtyKz0zKWUudmVydGljZXMucHVzaCgobmV3IGspLmZyb21BcnJheSh2LHIpKSx2b2lkIDAhPT1FJiZlLmNvbG9ycy5wdXNoKChuZXcgSSkuZnJvbUFycmF5KEUscikpO3ZhciBQPWEuZ3JvdXBzO2lmKDA8UC5sZW5ndGgpZm9yKHI9MDtyPFAubGVuZ3RoO3IrKyl7dj1QW3JdO3ZhciBSPXYuc3RhcnQsUz1SO2ZvcihSKz12LmNvdW50O1M8UjtTKz0zKXZvaWQgMCE9PWc/YyhnW1NdLGdbUysxXSxnW1MrMl0sdi5tYXRlcmlhbEluZGV4KTpjKFMsClMrMSxTKzIsdi5tYXRlcmlhbEluZGV4KX1lbHNlIGlmKHZvaWQgMCE9PWcpZm9yKHI9MDtyPGcubGVuZ3RoO3IrPTMpYyhnW3JdLGdbcisxXSxnW3IrMl0pO2Vsc2UgZm9yKHI9MDtyPHYubGVuZ3RoLzM7cis9MyljKHIscisxLHIrMik7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sY2VudGVyOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTt0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihvaCkubmVnYXRlKCk7dGhpcy50cmFuc2xhdGUob2gueCxvaC55LG9oLnopO3JldHVybiB0aGlzfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3ZhciBhPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyLApjPXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO2M9MD09PWM/MToxL2M7dmFyIGU9bmV3IHE7ZS5zZXQoYywwLDAsLWMqYS54LDAsYywwLC1jKmEueSwwLDAsYywtYyphLnosMCwwLDAsMSk7dGhpcy5hcHBseU1hdHJpeChlKTtyZXR1cm4gdGhpc30sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBrLGM9bmV3IGssZT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5mYWNlc1tlXSx2PXRoaXMudmVydGljZXNbci5hXSx6PXRoaXMudmVydGljZXNbci5iXTthLnN1YlZlY3RvcnModGhpcy52ZXJ0aWNlc1tyLmNdLHopO2Muc3ViVmVjdG9ycyh2LHopO2EuY3Jvc3MoYyk7YS5ub3JtYWxpemUoKTtyLm5vcm1hbC5jb3B5KGEpfX0sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9ITApO3ZhciBjO3ZhciBlPUFycmF5KHRoaXMudmVydGljZXMubGVuZ3RoKTt2YXIgZz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8CmM7ZysrKWVbZ109bmV3IGs7aWYoYSl7dmFyIHI9bmV3IGssdj1uZXcgazthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyl7Yz10aGlzLmZhY2VzW2FdO3ZhciB6PXRoaXMudmVydGljZXNbYy5hXTt2YXIgRT10aGlzLnZlcnRpY2VzW2MuYl07dmFyIEY9dGhpcy52ZXJ0aWNlc1tjLmNdO3Iuc3ViVmVjdG9ycyhGLEUpO3Yuc3ViVmVjdG9ycyh6LEUpO3IuY3Jvc3Modik7ZVtjLmFdLmFkZChyKTtlW2MuYl0uYWRkKHIpO2VbYy5jXS5hZGQocil9fWVsc2UgZm9yKHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCksYT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPXRoaXMuZmFjZXNbYV0sZVtjLmFdLmFkZChjLm5vcm1hbCksZVtjLmJdLmFkZChjLm5vcm1hbCksZVtjLmNdLmFkZChjLm5vcm1hbCk7Zz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8YztnKyspZVtnXS5ub3JtYWxpemUoKTthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPQp0aGlzLmZhY2VzW2FdLHo9Yy52ZXJ0ZXhOb3JtYWxzLDM9PT16Lmxlbmd0aD8oelswXS5jb3B5KGVbYy5hXSkselsxXS5jb3B5KGVbYy5iXSkselsyXS5jb3B5KGVbYy5jXSkpOih6WzBdPWVbYy5hXS5jbG9uZSgpLHpbMV09ZVtjLmJdLmNsb25lKCkselsyXT1lW2MuY10uY2xvbmUoKSk7MDx0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYTt0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO3ZhciBjPTA7Zm9yKGE9dGhpcy5mYWNlcy5sZW5ndGg7YzxhO2MrKyl7dmFyIGU9dGhpcy5mYWNlc1tjXTt2YXIgZz1lLnZlcnRleE5vcm1hbHM7Mz09PWcubGVuZ3RoPyhnWzBdLmNvcHkoZS5ub3JtYWwpLGdbMV0uY29weShlLm5vcm1hbCksZ1syXS5jb3B5KGUubm9ybWFsKSk6KGdbMF09ZS5ub3JtYWwuY2xvbmUoKSxnWzFdPWUubm9ybWFsLmNsb25lKCksZ1syXT1lLm5vcm1hbC5jbG9uZSgpKX0wPAp0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlTW9ycGhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspe3ZhciBnPXRoaXMuZmFjZXNbZV07Zy5fX29yaWdpbmFsRmFjZU5vcm1hbD9nLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkoZy5ub3JtYWwpOmcuX19vcmlnaW5hbEZhY2VOb3JtYWw9Zy5ub3JtYWwuY2xvbmUoKTtnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzfHwoZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFscz1bXSk7dmFyIHI9MDtmb3IoYT1nLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8YTtyKyspZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1tyXT9nLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzW3JdKTpnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdPWcudmVydGV4Tm9ybWFsc1tyXS5jbG9uZSgpfXZhciB2PW5ldyB5YTsKdi5mYWNlcz10aGlzLmZhY2VzO3I9MDtmb3IoYT10aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7cjxhO3IrKyl7aWYoIXRoaXMubW9ycGhOb3JtYWxzW3JdKXt0aGlzLm1vcnBoTm9ybWFsc1tyXT17fTt0aGlzLm1vcnBoTm9ybWFsc1tyXS5mYWNlTm9ybWFscz1bXTt0aGlzLm1vcnBoTm9ybWFsc1tyXS52ZXJ0ZXhOb3JtYWxzPVtdO2c9dGhpcy5tb3JwaE5vcm1hbHNbcl0uZmFjZU5vcm1hbHM7dmFyIHo9dGhpcy5tb3JwaE5vcm1hbHNbcl0udmVydGV4Tm9ybWFscztlPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKyl7dmFyIEU9bmV3IGs7dmFyIEY9e2E6bmV3IGssYjpuZXcgayxjOm5ldyBrfTtnLnB1c2goRSk7ei5wdXNoKEYpfX16PXRoaXMubW9ycGhOb3JtYWxzW3JdO3YudmVydGljZXM9dGhpcy5tb3JwaFRhcmdldHNbcl0udmVydGljZXM7di5jb21wdXRlRmFjZU5vcm1hbHMoKTt2LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8CmM7ZSsrKWc9dGhpcy5mYWNlc1tlXSxFPXouZmFjZU5vcm1hbHNbZV0sRj16LnZlcnRleE5vcm1hbHNbZV0sRS5jb3B5KGcubm9ybWFsKSxGLmEuY29weShnLnZlcnRleE5vcm1hbHNbMF0pLEYuYi5jb3B5KGcudmVydGV4Tm9ybWFsc1sxXSksRi5jLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzWzJdKX1lPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKylnPXRoaXMuZmFjZXNbZV0sZy5ub3JtYWw9Zy5fX29yaWdpbmFsRmFjZU5vcm1hbCxnLnZlcnRleE5vcm1hbHM9Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc30sY29tcHV0ZUJvdW5kaW5nQm94OmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PW5ldyB3KTt0aGlzLmJvdW5kaW5nQm94LnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT0KbmV3IEcpO3RoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnZlcnRpY2VzKX0sbWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2lmKGEmJmEuaXNHZW9tZXRyeSl7dmFyIGcscj10aGlzLnZlcnRpY2VzLmxlbmd0aCx2PXRoaXMudmVydGljZXMsej1hLnZlcnRpY2VzLEU9dGhpcy5mYWNlcyxGPWEuZmFjZXMsSj10aGlzLmNvbG9ycyxQPWEuY29sb3JzO3ZvaWQgMD09PWUmJihlPTApO3ZvaWQgMCE9PWMmJihnPShuZXcgdCkuZ2V0Tm9ybWFsTWF0cml4KGMpKTtmb3IodmFyIFI9MCxTPXoubGVuZ3RoO1I8UztSKyspe3ZhciBWPXpbUl0uY2xvbmUoKTt2b2lkIDAhPT1jJiZWLmFwcGx5TWF0cml4NChjKTt2LnB1c2goVil9Uj0wO2ZvcihTPVAubGVuZ3RoO1I8UztSKyspSi5wdXNoKFBbUl0uY2xvbmUoKSk7Uj0wO2ZvcihTPUYubGVuZ3RoO1I8UztSKyspe3o9RltSXTt2YXIgVz16LnZlcnRleE5vcm1hbHM7UD16LnZlcnRleENvbG9ycztKPW5ldyBLKHouYStyLHouYityLHouYysKcik7Si5ub3JtYWwuY29weSh6Lm5vcm1hbCk7dm9pZCAwIT09ZyYmSi5ub3JtYWwuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpO2M9MDtmb3Iodj1XLmxlbmd0aDtjPHY7YysrKVY9V1tjXS5jbG9uZSgpLHZvaWQgMCE9PWcmJlYuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpLEoudmVydGV4Tm9ybWFscy5wdXNoKFYpO0ouY29sb3IuY29weSh6LmNvbG9yKTtjPTA7Zm9yKHY9UC5sZW5ndGg7Yzx2O2MrKylWPVBbY10sSi52ZXJ0ZXhDb2xvcnMucHVzaChWLmNsb25lKCkpO0oubWF0ZXJpYWxJbmRleD16Lm1hdGVyaWFsSW5kZXgrZTtFLnB1c2goSil9Uj0wO2ZvcihTPWEuZmFjZVZlcnRleFV2cy5sZW5ndGg7UjxTO1IrKylmb3IoZT1hLmZhY2VWZXJ0ZXhVdnNbUl0sdm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW1JdJiYodGhpcy5mYWNlVmVydGV4VXZzW1JdPVtdKSxjPTAsdj1lLmxlbmd0aDtjPHY7YysrKXtnPWVbY107cj1bXTtFPTA7Zm9yKEY9Zy5sZW5ndGg7RTxGO0UrKylyLnB1c2goZ1tFXS5jbG9uZSgpKTsKdGhpcy5mYWNlVmVydGV4VXZzW1JdLnB1c2gocil9fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LiIsYSl9LG1lcmdlTWVzaDpmdW5jdGlvbihhKXthJiZhLmlzTWVzaD8oYS5tYXRyaXhBdXRvVXBkYXRlJiZhLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWVyZ2UoYS5nZW9tZXRyeSxhLm1hdHJpeCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLiIsYSl9LG1lcmdlVmVydGljZXM6ZnVuY3Rpb24oKXt2YXIgYT17fSxjPVtdLGU9W10sZz1NYXRoLnBvdygxMCw0KSxyO3ZhciB2PTA7Zm9yKHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7djxyO3YrKyl7dmFyIHo9dGhpcy52ZXJ0aWNlc1t2XTt6PU1hdGgucm91bmQoei54KmcpKyJfIitNYXRoLnJvdW5kKHoueSpnKSsiXyIrTWF0aC5yb3VuZCh6LnoqCmcpO3ZvaWQgMD09PWFbel0/KGFbel09dixjLnB1c2godGhpcy52ZXJ0aWNlc1t2XSksZVt2XT1jLmxlbmd0aC0xKTplW3ZdPWVbYVt6XV19YT1bXTt2PTA7Zm9yKHI9dGhpcy5mYWNlcy5sZW5ndGg7djxyO3YrKylmb3IoZz10aGlzLmZhY2VzW3ZdLGcuYT1lW2cuYV0sZy5iPWVbZy5iXSxnLmM9ZVtnLmNdLGc9W2cuYSxnLmIsZy5jXSx6PTA7Mz56O3orKylpZihnW3pdPT09Z1soeisxKSUzXSl7YS5wdXNoKHYpO2JyZWFrfWZvcih2PWEubGVuZ3RoLTE7MDw9djt2LS0pZm9yKGc9YVt2XSx0aGlzLmZhY2VzLnNwbGljZShnLDEpLGU9MCxyPXRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7ZTxyO2UrKyl0aGlzLmZhY2VWZXJ0ZXhVdnNbZV0uc3BsaWNlKGcsMSk7dj10aGlzLnZlcnRpY2VzLmxlbmd0aC1jLmxlbmd0aDt0aGlzLnZlcnRpY2VzPWM7cmV0dXJuIHZ9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy52ZXJ0aWNlcz1bXTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspe3ZhciBnPQphW2NdO3RoaXMudmVydGljZXMucHVzaChuZXcgayhnLngsZy55LGcuenx8MCkpfXJldHVybiB0aGlzfSxzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mYWNlcyxjPWEubGVuZ3RoLGU9MDtlPGM7ZSsrKWFbZV0uX2lkPWU7YS5zb3J0KGZ1bmN0aW9uKEYsSil7cmV0dXJuIEYubWF0ZXJpYWxJbmRleC1KLm1hdGVyaWFsSW5kZXh9KTt2YXIgZz10aGlzLmZhY2VWZXJ0ZXhVdnNbMF0scj10aGlzLmZhY2VWZXJ0ZXhVdnNbMV0sdix6O2cmJmcubGVuZ3RoPT09YyYmKHY9W10pO3ImJnIubGVuZ3RoPT09YyYmKHo9W10pO2ZvcihlPTA7ZTxjO2UrKyl7dmFyIEU9YVtlXS5faWQ7diYmdi5wdXNoKGdbRV0pO3omJnoucHVzaChyW0VdKX12JiYodGhpcy5mYWNlVmVydGV4VXZzWzBdPXYpO3omJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09eil9LHRvSlNPTjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEob2EsdGEsQmEpe3JldHVybiBCYT9vYXwxPDx0YTpvYSYKfigxPDx0YSl9ZnVuY3Rpb24gYyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCkrb2Euei50b1N0cmluZygpO2lmKHZvaWQgMCE9PUpbdGFdKXJldHVybiBKW3RhXTtKW3RhXT1GLmxlbmd0aC8zO0YucHVzaChvYS54LG9hLnksb2Eueik7cmV0dXJuIEpbdGFdfWZ1bmN0aW9uIGUob2Epe3ZhciB0YT1vYS5yLnRvU3RyaW5nKCkrb2EuZy50b1N0cmluZygpK29hLmIudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1SW3RhXSlyZXR1cm4gUlt0YV07Ult0YV09UC5sZW5ndGg7UC5wdXNoKG9hLmdldEhleCgpKTtyZXR1cm4gUlt0YV19ZnVuY3Rpb24gZyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCk7aWYodm9pZCAwIT09Vlt0YV0pcmV0dXJuIFZbdGFdO1ZbdGFdPVMubGVuZ3RoLzI7Uy5wdXNoKG9hLngsb2EueSk7cmV0dXJuIFZbdGFdfXZhciByPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiR2VvbWV0cnkiLGdlbmVyYXRvcjoiR2VvbWV0cnkudG9KU09OIn19OwpyLnV1aWQ9dGhpcy51dWlkO3IudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihyLm5hbWU9dGhpcy5uYW1lKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciB2PXRoaXMucGFyYW1ldGVycyx6O2Zvcih6IGluIHYpdm9pZCAwIT09dlt6XSYmKHJbel09dlt6XSk7cmV0dXJuIHJ9dj1bXTtmb3Ioej0wO3o8dGhpcy52ZXJ0aWNlcy5sZW5ndGg7eisrKXt2YXIgRT10aGlzLnZlcnRpY2VzW3pdO3YucHVzaChFLngsRS55LEUueil9RT1bXTt2YXIgRj1bXSxKPXt9LFA9W10sUj17fSxTPVtdLFY9e307Zm9yKHo9MDt6PHRoaXMuZmFjZXMubGVuZ3RoO3orKyl7dmFyIFc9dGhpcy5mYWNlc1t6XSxoYT12b2lkIDAhPT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sZmE9MDxXLm5vcm1hbC5sZW5ndGgoKSxyYT0wPFcudmVydGV4Tm9ybWFscy5sZW5ndGgscGE9MSE9PVcuY29sb3Iucnx8MSE9PVcuY29sb3IuZ3x8MSE9PVcuY29sb3IuYixxYT0wPFcudmVydGV4Q29sb3JzLmxlbmd0aCwKdWE9MDt1YT1hKHVhLDAsMCk7dWE9YSh1YSwxLCEwKTt1YT1hKHVhLDIsITEpO3VhPWEodWEsMyxoYSk7dWE9YSh1YSw0LGZhKTt1YT1hKHVhLDUscmEpO3VhPWEodWEsNixwYSk7dWE9YSh1YSw3LHFhKTtFLnB1c2godWEpO0UucHVzaChXLmEsVy5iLFcuYyk7RS5wdXNoKFcubWF0ZXJpYWxJbmRleCk7aGEmJihoYT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sRS5wdXNoKGcoaGFbMF0pLGcoaGFbMV0pLGcoaGFbMl0pKSk7ZmEmJkUucHVzaChjKFcubm9ybWFsKSk7cmEmJihmYT1XLnZlcnRleE5vcm1hbHMsRS5wdXNoKGMoZmFbMF0pLGMoZmFbMV0pLGMoZmFbMl0pKSk7cGEmJkUucHVzaChlKFcuY29sb3IpKTtxYSYmKFc9Vy52ZXJ0ZXhDb2xvcnMsRS5wdXNoKGUoV1swXSksZShXWzFdKSxlKFdbMl0pKSl9ci5kYXRhPXt9O3IuZGF0YS52ZXJ0aWNlcz12O3IuZGF0YS5ub3JtYWxzPUY7MDxQLmxlbmd0aCYmKHIuZGF0YS5jb2xvcnM9UCk7MDxTLmxlbmd0aCYmKHIuZGF0YS51dnM9CltTXSk7ci5kYXRhLmZhY2VzPUU7cmV0dXJuIHJ9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB5YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYyxlLGc7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5uYW1lPWEubmFtZTt2YXIgcj1hLnZlcnRpY2VzO3ZhciB2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnZlcnRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuY29sb3JzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuY29sb3JzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuZmFjZXM7dj0wO2ZvcihjPQpyLmxlbmd0aDt2PGM7disrKXRoaXMuZmFjZXMucHVzaChyW3ZdLmNsb25lKCkpO3Y9MDtmb3IoYz1hLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO3Y8Yzt2Kyspe3ZhciB6PWEuZmFjZVZlcnRleFV2c1t2XTt2b2lkIDA9PT10aGlzLmZhY2VWZXJ0ZXhVdnNbdl0mJih0aGlzLmZhY2VWZXJ0ZXhVdnNbdl09W10pO3I9MDtmb3IoZT16Lmxlbmd0aDtyPGU7cisrKXt2YXIgRT16W3JdLEY9W107dmFyIEo9MDtmb3IoZz1FLmxlbmd0aDtKPGc7SisrKUYucHVzaChFW0pdLmNsb25lKCkpO3RoaXMuZmFjZVZlcnRleFV2c1t2XS5wdXNoKEYpfX1KPWEubW9ycGhUYXJnZXRzO3Y9MDtmb3IoYz1KLmxlbmd0aDt2PGM7disrKXtnPXt9O2cubmFtZT1KW3ZdLm5hbWU7aWYodm9pZCAwIT09Slt2XS52ZXJ0aWNlcylmb3IoZy52ZXJ0aWNlcz1bXSxyPTAsZT1KW3ZdLnZlcnRpY2VzLmxlbmd0aDtyPGU7cisrKWcudmVydGljZXMucHVzaChKW3ZdLnZlcnRpY2VzW3JdLmNsb25lKCkpO2lmKHZvaWQgMCE9PUpbdl0ubm9ybWFscylmb3IoZy5ub3JtYWxzPQpbXSxyPTAsZT1KW3ZdLm5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5ub3JtYWxzLnB1c2goSlt2XS5ub3JtYWxzW3JdLmNsb25lKCkpO3RoaXMubW9ycGhUYXJnZXRzLnB1c2goZyl9Sj1hLm1vcnBoTm9ybWFsczt2PTA7Zm9yKGM9Si5sZW5ndGg7djxjO3YrKyl7Zz17fTtpZih2b2lkIDAhPT1KW3ZdLnZlcnRleE5vcm1hbHMpZm9yKGcudmVydGV4Tm9ybWFscz1bXSxyPTAsZT1KW3ZdLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspej1KW3ZdLnZlcnRleE5vcm1hbHNbcl0sRT17fSxFLmE9ei5hLmNsb25lKCksRS5iPXouYi5jbG9uZSgpLEUuYz16LmMuY2xvbmUoKSxnLnZlcnRleE5vcm1hbHMucHVzaChFKTtpZih2b2lkIDAhPT1KW3ZdLmZhY2VOb3JtYWxzKWZvcihnLmZhY2VOb3JtYWxzPVtdLHI9MCxlPUpbdl0uZmFjZU5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5mYWNlTm9ybWFscy5wdXNoKEpbdl0uZmFjZU5vcm1hbHNbcl0uY2xvbmUoKSk7dGhpcy5tb3JwaE5vcm1hbHMucHVzaChnKX1yPQphLnNraW5XZWlnaHRzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuc2tpbldlaWdodHMucHVzaChyW3ZdLmNsb25lKCkpO3I9YS5za2luSW5kaWNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnNraW5JbmRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEubGluZURpc3RhbmNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLmxpbmVEaXN0YW5jZXMucHVzaChyW3ZdKTt2PWEuYm91bmRpbmdCb3g7bnVsbCE9PXYmJih0aGlzLmJvdW5kaW5nQm94PXYuY2xvbmUoKSk7dj1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT12JiYodGhpcy5ib3VuZGluZ1NwaGVyZT12LmNsb25lKCkpO3RoaXMuZWxlbWVudHNOZWVkVXBkYXRlPWEuZWxlbWVudHNOZWVkVXBkYXRlO3RoaXMudmVydGljZXNOZWVkVXBkYXRlPWEudmVydGljZXNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9YS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZTt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9YS5ncm91cHNOZWVkVXBkYXRlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO1NhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNhO1hhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7WGEucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhhO3ZhciBGbT17Y2xvbmU6dWIsbWVyZ2U6QmJ9O3FiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtxYi5wcm90b3R5cGUuY29uc3RydWN0b3I9cWI7cWIucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWw9ITA7cWIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuZnJhZ21lbnRTaGFkZXI9YS5mcmFnbWVudFNoYWRlcjt0aGlzLnZlcnRleFNoYWRlcj1hLnZlcnRleFNoYWRlcjt0aGlzLnVuaWZvcm1zPXViKGEudW5pZm9ybXMpO3RoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LGEuZGVmaW5lcyk7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5saWdodHM9YS5saWdodHM7dGhpcy5jbGlwcGluZz1hLmNsaXBwaW5nO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFsczt0aGlzLmV4dGVuc2lvbnM9YS5leHRlbnNpb25zO3JldHVybiB0aGlzfTtxYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGEpe3ZhciBjPU0ucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7Yy51bmlmb3Jtcz17fTtmb3IodmFyIGUgaW4gdGhpcy51bmlmb3Jtcyl7dmFyIGc9CnRoaXMudW5pZm9ybXNbZV0udmFsdWU7Yy51bmlmb3Jtc1tlXT1nJiZnLmlzVGV4dHVyZT97dHlwZToidCIsdmFsdWU6Zy50b0pTT04oYSkudXVpZH06ZyYmZy5pc0NvbG9yP3t0eXBlOiJjIix2YWx1ZTpnLmdldEhleCgpfTpnJiZnLmlzVmVjdG9yMj97dHlwZToidjIiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yMz97dHlwZToidjMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yND97dHlwZToidjQiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4Mz97dHlwZToibTMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4ND97dHlwZToibTQiLHZhbHVlOmcudG9BcnJheSgpfTp7dmFsdWU6Z319MDxPYmplY3Qua2V5cyh0aGlzLmRlZmluZXMpLmxlbmd0aCYmKGMuZGVmaW5lcz10aGlzLmRlZmluZXMpO2MudmVydGV4U2hhZGVyPXRoaXMudmVydGV4U2hhZGVyO2MuZnJhZ21lbnRTaGFkZXI9dGhpcy5mcmFnbWVudFNoYWRlcjthPXt9O2Zvcih2YXIgciBpbiB0aGlzLmV4dGVuc2lvbnMpITA9PT0KdGhpcy5leHRlbnNpb25zW3JdJiYoYVtyXT0hMCk7MDxPYmplY3Qua2V5cyhhKS5sZW5ndGgmJihjLmV4dGVuc2lvbnM9YSk7cmV0dXJuIGN9O3piLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6Yixpc0NhbWVyYTohMCxjb3B5OmZ1bmN0aW9uKGEsYyl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KGEubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLnByb2plY3Rpb25NYXRyaXguY29weShhLnByb2plY3Rpb25NYXRyaXgpO3RoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtyZXR1cm4gdGhpc30sZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KC1jWzhdLC1jWzldLC1jWzEwXSkubm9ybWFsaXplKCl9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTt2Yi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZiLGlzUGVyc3BlY3RpdmVDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMuZm92PWEuZm92O3RoaXMuem9vbT1hLnpvb207dGhpcy5uZWFyPWEubmVhcjt0aGlzLmZhcj0KYS5mYXI7dGhpcy5mb2N1cz1hLmZvY3VzO3RoaXMuYXNwZWN0PWEuYXNwZWN0O3RoaXMudmlldz1udWxsPT09YS52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpO3RoaXMuZmlsbUdhdWdlPWEuZmlsbUdhdWdlO3RoaXMuZmlsbU9mZnNldD1hLmZpbG1PZmZzZXQ7cmV0dXJuIHRoaXN9LHNldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKGEpe3RoaXMuZm92PTIqaGIuUkFEMkRFRypNYXRoLmF0YW4oLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvYSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGdldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdil9LGdldEVmZmVjdGl2ZUZPVjpmdW5jdGlvbigpe3JldHVybiAyKmhiLlJBRDJERUcqTWF0aC5hdGFuKE1hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSl9LGdldEZpbG1XaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbG1HYXVnZSoKTWF0aC5taW4odGhpcy5hc3BlY3QsMSl9LGdldEZpbG1IZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9LHNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3RoaXMuYXNwZWN0PWEvYztudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWE7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9Yzt0aGlzLnZpZXcub2Zmc2V0WD1lO3RoaXMudmlldy5vZmZzZXRZPWc7dGhpcy52aWV3LndpZHRoPXI7dGhpcy52aWV3LmhlaWdodD12O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSwKdXBkYXRlUHJvamVjdGlvbk1hdHJpeDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmVhcixjPWEqTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdikvdGhpcy56b29tLGU9MipjLGc9dGhpcy5hc3BlY3QqZSxyPS0uNSpnLHY9dGhpcy52aWV3O2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXt2YXIgej12LmZ1bGxXaWR0aCxFPXYuZnVsbEhlaWdodDtyKz12Lm9mZnNldFgqZy96O2MtPXYub2Zmc2V0WSplL0U7Zyo9di53aWR0aC96O2UqPXYuaGVpZ2h0L0V9dj10aGlzLmZpbG1PZmZzZXQ7MCE9PXYmJihyKz1hKnYvdGhpcy5nZXRGaWxtV2lkdGgoKSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLHIrZyxjLGMtZSxhLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sdG9KU09OOmZ1bmN0aW9uKGEpe2E9QS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcywKYSk7YS5vYmplY3QuZm92PXRoaXMuZm92O2Eub2JqZWN0Lnpvb209dGhpcy56b29tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjthLm9iamVjdC5mb2N1cz10aGlzLmZvY3VzO2Eub2JqZWN0LmFzcGVjdD10aGlzLmFzcGVjdDtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO2Eub2JqZWN0LmZpbG1HYXVnZT10aGlzLmZpbG1HYXVnZTthLm9iamVjdC5maWxtT2Zmc2V0PXRoaXMuZmlsbU9mZnNldDtyZXR1cm4gYX19KTtHYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7R2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdiO05iLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG0ucHJvdG90eXBlKTtOYi5wcm90b3R5cGUuY29uc3RydWN0b3I9TmI7TmIucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPSEwO05iLnByb3RvdHlwZS5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZT0KZnVuY3Rpb24oYSxjKXt0aGlzLnRleHR1cmUudHlwZT1jLnR5cGU7dGhpcy50ZXh0dXJlLmZvcm1hdD1jLmZvcm1hdDt0aGlzLnRleHR1cmUuZW5jb2Rpbmc9Yy5lbmNvZGluZzt2YXIgZT1uZXcgeSxnPW5ldyBxYih7dHlwZToiQ3ViZW1hcEZyb21FcXVpcmVjdCIsdW5pZm9ybXM6dWIoe3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19KSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVY7XG5cdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggZGlyZWN0aW9uLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0c2FtcGxlVVYueCBceDNkIGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xufSIsc2lkZToxLGJsZW5kaW5nOjB9KTtnLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT1jOwpjPW5ldyB4YShuZXcgWGEoNSw1LDUpLGcpO2UuYWRkKGMpO2c9bmV3IEdiKDEsMTAsMSk7Zy5yZW5kZXJUYXJnZXQ9dGhpcztnLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWU9IkN1YmVDYW1lcmFUZXh0dXJlIjtnLnVwZGF0ZShhLGUpO2MuZ2VvbWV0cnkuZGlzcG9zZSgpO2MubWF0ZXJpYWwuZGlzcG9zZSgpO3JldHVybiB0aGlzfTtBYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7QWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFiO0FiLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlPSEwO3ZhciBKaT1uZXcgayxHbT1uZXcgayxIbT1uZXcgdDtPYmplY3QuYXNzaWduKEhiLnByb3RvdHlwZSx7aXNQbGFuZTohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLm5vcm1hbC5jb3B5KGEpO3RoaXMuY29uc3RhbnQ9YztyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50czpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLm5vcm1hbC5zZXQoYSxjLGUpO3RoaXMuY29uc3RhbnQ9ZztyZXR1cm4gdGhpc30sCnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEsYyl7dGhpcy5ub3JtYWwuY29weShhKTt0aGlzLmNvbnN0YW50PS1jLmRvdCh0aGlzLm5vcm1hbCk7cmV0dXJuIHRoaXN9LHNldEZyb21Db3BsYW5hclBvaW50czpmdW5jdGlvbihhLGMsZSl7Yz1KaS5zdWJWZWN0b3JzKGUsYykuY3Jvc3MoR20uc3ViVmVjdG9ycyhhLGMpKS5ub3JtYWxpemUoKTt0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGMsYSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29uc3RhbnQ9YS5jb25zdGFudDtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTt0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhcihhKTt0aGlzLmNvbnN0YW50Kj1hO3JldHVybiB0aGlzfSwKbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdGFudCo9LTE7dGhpcy5ub3JtYWwubmVnYXRlKCk7cmV0dXJuIHRoaXN9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KGEpK3RoaXMuY29uc3RhbnR9LGRpc3RhbmNlVG9TcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KGEuY2VudGVyKS1hLnJhZGl1c30scHJvamVjdFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5wcm9qZWN0UG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7cmV0dXJuIGMuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuZGlzdGFuY2VUb1BvaW50KGEpKS5hZGQoYSl9LGludGVyc2VjdExpbmU6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmludGVyc2VjdExpbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmM9bmV3IGspO3ZhciBlPWEuZGVsdGEoSmkpLGc9dGhpcy5ub3JtYWwuZG90KGUpO2lmKDA9PT1nKXtpZigwPT09dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCkpcmV0dXJuIGMuY29weShhLnN0YXJ0KX1lbHNlIGlmKGc9LShhLnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvZywhKDA+Z3x8MTxnKSlyZXR1cm4gYy5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKGcpLmFkZChhLnN0YXJ0KX0saW50ZXJzZWN0c0xpbmU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCk7YT10aGlzLmRpc3RhbmNlVG9Qb2ludChhLmVuZCk7cmV0dXJuIDA+YyYmMDxhfHwwPmEmJjA8Y30saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnRlcnNlY3RzUGxhbmUodGhpcyl9LGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxjb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmNvcGxhbmFyUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuY29uc3RhbnQpfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSxjKXtjPWN8fEhtLmdldE5vcm1hbE1hdHJpeChhKTthPXRoaXMuY29wbGFuYXJQb2ludChKaSkuYXBwbHlNYXRyaXg0KGEpO2M9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpO3RoaXMuY29uc3RhbnQ9LWEuZG90KGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5jb25zdGFudC09YS5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkmJmEuY29uc3RhbnQ9PT10aGlzLmNvbnN0YW50fX0pO3ZhciBtZj1uZXcgRyxwaD1uZXcgaztPYmplY3QuYXNzaWduKGljLnByb3RvdHlwZSwKe3NldDpmdW5jdGlvbihhLGMsZSxnLHIsdil7dmFyIHo9dGhpcy5wbGFuZXM7elswXS5jb3B5KGEpO3pbMV0uY29weShjKTt6WzJdLmNvcHkoZSk7elszXS5jb3B5KGcpO3pbNF0uY29weShyKTt6WzVdLmNvcHkodik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyljW2VdLmNvcHkoYS5wbGFuZXNbZV0pO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5lbGVtZW50czthPWVbMF07dmFyIGc9ZVsxXSxyPWVbMl0sdj1lWzNdLHo9ZVs0XSxFPWVbNV0sRj1lWzZdLEo9ZVs3XSxQPWVbOF0sUj1lWzldLFM9ZVsxMF0sVj1lWzExXSxXPWVbMTJdLGhhPWVbMTNdLGZhPWVbMTRdO2U9ZVsxNV07Y1swXS5zZXRDb21wb25lbnRzKHYtYSxKLXosVi1QLGUtVykubm9ybWFsaXplKCk7CmNbMV0uc2V0Q29tcG9uZW50cyh2K2EsSit6LFYrUCxlK1cpLm5vcm1hbGl6ZSgpO2NbMl0uc2V0Q29tcG9uZW50cyh2K2csSitFLFYrUixlK2hhKS5ub3JtYWxpemUoKTtjWzNdLnNldENvbXBvbmVudHModi1nLEotRSxWLVIsZS1oYSkubm9ybWFsaXplKCk7Y1s0XS5zZXRDb21wb25lbnRzKHYtcixKLUYsVi1TLGUtZmEpLm5vcm1hbGl6ZSgpO2NbNV0uc2V0Q29tcG9uZW50cyh2K3IsSitGLFYrUyxlK2ZhKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc30saW50ZXJzZWN0c09iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O251bGw9PT1jLmJvdW5kaW5nU3BoZXJlJiZjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO21mLmNvcHkoYy5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3ByaXRlOmZ1bmN0aW9uKGEpe21mLmNlbnRlci5zZXQoMCwwLDApO21mLnJhZGl1cz0KLjcwNzEwNjc4MTE4NjU0NzY7bWYuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5jZW50ZXI7YT0tYS5yYWRpdXM7Zm9yKHZhciBnPTA7Nj5nO2crKylpZihjW2ddLmRpc3RhbmNlVG9Qb2ludChlKTxhKXJldHVybiExO3JldHVybiEwfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyl7dmFyIGc9Y1tlXTtwaC54PTA8Zy5ub3JtYWwueD9hLm1heC54OmEubWluLng7cGgueT0wPGcubm9ybWFsLnk/YS5tYXgueTphLm1pbi55O3BoLno9MDxnLm5vcm1hbC56P2EubWF4Lno6YS5taW4uejtpZigwPmcuZGlzdGFuY2VUb1BvaW50KHBoKSlyZXR1cm4hMX1yZXR1cm4hMH0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspaWYoMD4KY1tlXS5kaXN0YW5jZVRvUG9pbnQoYSkpcmV0dXJuITE7cmV0dXJuITB9fSk7dmFyIHJiPXthbHBoYW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqXHgzZCB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmIixhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSBceDNjIEFMUEhBVEVTVCApIGRpc2NhcmQ7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gXHgzZCAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKVxuXHRcdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICpceDNkIGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkIFx4M2QgdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgXHgzZCB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgXHgzZCB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgXHgzZCB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxIFx4M2QgdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByIFx4M2Qgcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCBceDNkIG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiBceDNkIDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqXHgzZCBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgXHgzZSAwLjAgXHgyNlx4MjYgZGVjYXlFeHBvbmVudCBceDNlIDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZnJlc25lbCBceDNkIGV4cDIoICggLTUuNTU0NzMgKiBkb3ROViAtIDYuOTgzMTYgKSAqIGRvdE5WICk7XG5cdHZlYzMgRnIgXHgzZCBtYXgoIHZlYzMoIDEuMCAtIHJvdWdobmVzcyApLCBGMCApIC0gRjA7XG5cdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsIFx4M2QgZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gXHgzZCBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhIFx4M2QgcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgXHgzZCBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICBceDNkIDY0LjA7XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSBceDNkICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgXHgzZCAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diBceDNkIHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsIFx4M2QgbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4IFx4M2QgZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSBceDNkIGFicyggeCApO1xuXHRmbG9hdCBhIFx4M2QgMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiIFx4M2QgMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2IFx4M2QgYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhIFx4M2QgKCB4IFx4M2UgMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgXHgzZCByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgXHgzZCByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgXHgzZCBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgXHgzYyAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSBceDNkIG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiBceDNkIC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0IFx4M2QgbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgXHgzZCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xuXHR2ZWMyIGJyZGYgXHgzZCBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgXHgzZCBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgXHgzZCBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyBceDNkIDEuMCAtIEVzcztcblx0dmVjMyBGYXZnIFx4M2Qgc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyBceDNkIEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArXHgzZCBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArXHgzZCBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyIFx4M2Qgbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19CbGlublBob25nX0ltcGxpY2l0KCApO1xuXHRmbG9hdCBEIFx4M2QgRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5cdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufVxuI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApXG5mbG9hdCBEX0NoYXJsaWUoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb0gpIHtcblx0ZmxvYXQgaW52QWxwaGEgIFx4M2QgMS4wIC8gcm91Z2huZXNzO1xuXHRmbG9hdCBjb3MyaCBceDNkIE5vSCAqIE5vSDtcblx0ZmxvYXQgc2luMmggXHgzZCBtYXgoMS4wIC0gY29zMmgsIDAuMDA3ODEyNSk7XHRyZXR1cm4gKDIuMCArIGludkFscGhhKSAqIHBvdyhzaW4yaCwgaW52QWxwaGEgKiAwLjUpIC8gKDIuMCAqIFBJKTtcbn1cbmZsb2F0IFZfTmV1YmVsdChmbG9hdCBOb1YsIGZsb2F0IE5vTCkge1xuXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfU2hlZW4oIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBMLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCB2ZWMzIHNwZWN1bGFyQ29sb3IgKSB7XG5cdHZlYzMgTiBceDNkIGdlb21ldHJ5Lm5vcm1hbDtcblx0dmVjMyBWIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0dmVjMyBIIFx4M2Qgbm9ybWFsaXplKCBWICsgTCApO1xuXHRmbG9hdCBkb3ROSCBceDNkIHNhdHVyYXRlKCBkb3QoIE4sIEggKSApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xufVxuI2VuZGlmIiwKYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0JVTVBNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XG5cdHZlYzIgZEhkeHlfZndkKCkge1xuXHRcdHZlYzIgZFNUZHggXHgzZCBkRmR4KCB2VXYgKTtcblx0XHR2ZWMyIGRTVGR5IFx4M2QgZEZkeSggdlV2ICk7XG5cdFx0ZmxvYXQgSGxsIFx4M2QgYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xuXHRcdGZsb2F0IGRCeCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xuXHRcdGZsb2F0IGRCeSBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xuXHRcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xuXHR9XG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHkgKSB7XG5cdFx0dmVjMyB2U2lnbWFYIFx4M2QgdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRGZHgoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdlNpZ21hWSBceDNkIHZlYzMoIGRGZHkoIHN1cmZfcG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZOIFx4M2Qgc3VyZl9ub3JtO1xuXHRcdHZlYzMgUjEgXHgzZCBjcm9zcyggdlNpZ21hWSwgdk4gKTtcblx0XHR2ZWMzIFIyIFx4M2QgY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG5cdFx0ZmxvYXQgZkRldCBceDNkIGRvdCggdlNpZ21hWCwgUjEgKTtcblx0XHRmRGV0ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHR2ZWMzIHZHcmFkIFx4M2Qgc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZiIsCmNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdHZlYzQgcGxhbmU7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wgY2xpcHBlZCBceDNkIHRydWU7XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRcdGNsaXBwZWQgXHgzZCAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgXHgyNlx4MjYgY2xpcHBlZDtcblx0XHR9XG5cdFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdCNpZiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0XHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWYiLApjb2xvcl9mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHRkaWZmdXNlQ29sb3IucmdiICpceDNkIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl92ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yLnh5eiBceDNkIGNvbG9yLnh5ejtcbiNlbmRpZiIsY29tbW9uOiIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTlcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbiNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxuI2RlZmluZSBFUFNJTE9OIDFlLTZcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNkZWZpbmUgd2hpdGVDb21wbGVtZW50KGEpICggMS4wIC0gc2F0dXJhdGUoIGEgKSApXG5mbG9hdCBwb3cyKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4OyB9XG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyIFx4M2QgeCp4OyByZXR1cm4geDIqeDI7IH1cbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7IHJldHVybiBkb3QoIGNvbG9yLCB2ZWMzKCAwLjMzMzMgKSApOyB9XG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xuXHRjb25zdCBoaWdocCBmbG9hdCBhIFx4M2QgMTIuOTg5OCwgYiBceDNkIDc4LjIzMywgYyBceDNkIDQzNzU4LjU0NTM7XG5cdGhpZ2hwIGZsb2F0IGR0IFx4M2QgZG90KCB1di54eSwgdmVjMiggYSxiICkgKSwgc24gXHgzZCBtb2QoIGR0LCBQSSApO1xuXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xufVxuI2lmZGVmIEhJR0hfUFJFQ0lTSU9OXG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9XG4jZWxzZVxuXHRmbG9hdCBtYXgzKCB2ZWMzIHYgKSB7IHJldHVybiBtYXgoIG1heCggdi54LCB2LnkgKSwgdi56ICk7IH1cblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xuXHRcdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heDMoIGFicyggdiApICk7XG5cdFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xuXHR9XG4jZW5kaWZcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtcblx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtcblx0dmVjMyB2aWV3RGlyO1xuI2lmZGVmIENMRUFSQ09BVFxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxufTtcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xufVxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xufVxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xuXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XG59XG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XG59XG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xufVxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XG5cdG1hdDMgdG1wO1xuXHR0bXBbIDAgXSBceDNkIHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcblx0dG1wWyAxIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7XG5cdHRtcFsgMiBdIFx4M2QgdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xuXHRyZXR1cm4gdG1wO1xufVxuZmxvYXQgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHtcblx0dmVjMyB3ZWlnaHRzIFx4M2QgdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xuXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcbn0iLApjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XG5cdHZlYzMgYWJzRGlyZWN0aW9uIFx4M2QgYWJzKGRpcmVjdGlvbik7XG5cdGludCBmYWNlIFx4M2QgLTE7XG5cdGlmKCBhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi56ICkge1xuXHRcdGlmKGFic0RpcmVjdGlvbi54IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi54IFx4M2UgMC4wID8gMCA6IDM7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0ZWxzZSB7XG5cdFx0aWYoYWJzRGlyZWN0aW9uLnogXHgzZSBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnogXHgzZSAwLjAgPyAyIDogNTtcblx0XHRlbHNlXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnkgXHgzZSAwLjAgPyAxIDogNDtcblx0fVxuXHRyZXR1cm4gZmFjZTtcbn1cbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4wKSlcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgc2NhbGUgXHgzZCBleHAyKGN1YmVVVl9tYXhMb2RzMSAtIHJvdWdobmVzc0xldmVsKTtcblx0ZmxvYXQgZHhSb3VnaG5lc3MgXHgzZCBkRmR4KHJvdWdobmVzcyk7XG5cdGZsb2F0IGR5Um91Z2huZXNzIFx4M2QgZEZkeShyb3VnaG5lc3MpO1xuXHR2ZWMzIGR4IFx4M2QgZEZkeCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xuXHR2ZWMzIGR5IFx4M2QgZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xuXHRmbG9hdCBkIFx4M2QgbWF4KCBkb3QoIGR4LCBkeCApLCBkb3QoIGR5LCBkeSApICk7XG5cdGQgXHgzZCBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtcblx0ZmxvYXQgbWlwTGV2ZWwgXHgzZCAwLjUgKiBsb2cyKGQpO1xuXHRyZXR1cm4gdmVjMihmbG9vcihtaXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXG4jZGVmaW5lIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xuXHRtaXBMZXZlbCBceDNkIHJvdWdobmVzc0xldmVsIFx4M2UgY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDogbWlwTGV2ZWw7XG5cdGZsb2F0IGEgXHgzZCAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIGV4cDJfcGFja2VkIFx4M2QgZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcblx0dmVjMiByY3BfZXhwMl9wYWNrZWQgXHgzZCB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xuXHRmbG9hdCBwb3dTY2FsZSBceDNkIGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xuXHRmbG9hdCBzY2FsZSBceDNkIHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xuXHRmbG9hdCBtaXBPZmZzZXQgXHgzZCAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3BfZXhwMl9wYWNrZWQueDtcblx0Ym9vbCBiUmVzIFx4M2QgbWlwTGV2ZWwgXHgzZFx4M2QgMC4wO1xuXHRzY2FsZSBceDNkICBiUmVzIFx4MjZceDI2IChzY2FsZSBceDNjIGEpID8gYSA6IHNjYWxlO1xuXHR2ZWMzIHI7XG5cdHZlYzIgb2Zmc2V0O1xuXHRpbnQgZmFjZSBceDNkIGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XG5cdGZsb2F0IHJjcFBvd1NjYWxlIFx4M2QgMS4wIC8gcG93U2NhbGU7XG5cdGlmKCBmYWNlIFx4M2RceDNkIDApIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDEpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMikge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMykge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgNCkge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdHIgXHgzZCBub3JtYWxpemUocik7XG5cdGZsb2F0IHRleGVsT2Zmc2V0IFx4M2QgMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIHMgXHgzZCAoIHIueXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcblx0dmVjMiBiYXNlIFx4M2Qgb2Zmc2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcblx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXG52ZWM0IHRleHR1cmVDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHJvdWdobmVzc1ZhbCBceDNkIHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xuXHRmbG9hdCByMSBceDNkIGZsb29yKHJvdWdobmVzc1ZhbCk7XG5cdGZsb2F0IHIyIFx4M2QgcjEgKyAxLjA7XG5cdGZsb2F0IHQgXHgzZCBmcmFjdChyb3VnaG5lc3NWYWwpO1xuXHR2ZWMyIG1pcEluZm8gXHgzZCBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcblx0ZmxvYXQgcyBceDNkIG1pcEluZm8ueTtcblx0ZmxvYXQgbGV2ZWwwIFx4M2QgbWlwSW5mby54O1xuXHRmbG9hdCBsZXZlbDEgXHgzZCBsZXZlbDAgKyAxLjA7XG5cdGxldmVsMSBceDNkIGxldmVsMSBceDNlIDUuMCA/IDUuMCA6IGxldmVsMTtcblx0bGV2ZWwwICtceDNkIG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XG5cdHZlYzIgdXZfMTAgXHgzZCBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjEwIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xuXHR2ZWMyIHV2XzIwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IyMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcblx0dmVjNCByZXN1bHQgXHgzZCBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XG5cdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XG59XG4jZW5kaWYiLApkZWZhdWx0bm9ybWFsX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsIFx4M2QgLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50IFx4M2Qgbm9ybWFsTWF0cml4ICogb2JqZWN0VGFuZ2VudDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgXHgzZCAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICtceDNkIG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcbiNlbmRpZiIsCmVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciBceDNkIHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2ZUNvbG9yLnJnYiBceDNkIGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICpceDNkIGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmIixlbmNvZGluZ3NfZnJhZ21lbnQ6ImdsX0ZyYWdDb2xvciBceDNkIGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50IFx4M2QgbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwIFx4M2QgY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiB2YWx1ZS5hICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gXHgzZCBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gXHgzZCBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiBceDNkIG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCBceDNkIG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREIFx4M2QgbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xufVxuY29uc3QgbWF0MyBjTG9nTHV2TSBceDNkIG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xuXHR2ZWMzIFhwX1lfWFlacCBceDNkIGNMb2dMdXZNICogdmFsdWUucmdiO1xuXHRYcF9ZX1hZWnAgXHgzZCBtYXgoIFhwX1lfWFlacCwgdmVjMyggMWUtNiwgMWUtNiwgMWUtNiApICk7XG5cdHZlYzQgdlJlc3VsdDtcblx0dlJlc3VsdC54eSBceDNkIFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRmbG9hdCBMZSBceDNkIDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyBceDNkIGZyYWN0KCBMZSApO1xuXHR2UmVzdWx0LnogXHgzZCAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNIFx4M2QgbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSBceDNkIHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSBceDNkIGV4cDIoICggTGUgLSAxMjcuMCApIC8gMi4wICk7XG5cdFhwX1lfWFlacC56IFx4M2QgWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9ZX1hZWnAueCBceDNkIHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCIFx4M2QgY0xvZ0x1dkludmVyc2VNICogWHBfWV9YWVpwLnJnYjtcblx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xufSIsCmVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggXHgzZCBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHZlYzMgcmVmbGVjdFZpZXcgXHgzZCBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xuXHQjZWxzZVxuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0I2VuZGlmXG5cdGVudkNvbG9yIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0b3V0Z29pbmdMaWdodCBceDNkIG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgK1x4M2QgZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdFxuI2VuZGlmIixlbnZtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZiIsCmVudm1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8ZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0XG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXG5cdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZSQUNUSU9OXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHF1ZXJ5VmVjLCAxLjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHZlYzQoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciBceDNkIGZsb2F0KCBtYXhNSVBMZXZlbCApO1xuXHRcdGZsb2F0IHNpZ21hIFx4M2QgUEkgKiByb3VnaG5lc3MgKiByb3VnaG5lc3MgLyAoIDEuMCArIHJvdWdobmVzcyApO1xuXHRcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCBceDNkIG1heE1JUExldmVsU2NhbGFyICsgbG9nMiggc2lnbWEgKTtcblx0XHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xuXHR9XG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCAtdmlld0Rpciwgbm9ybWFsICk7XG5cdFx0ICByZWZsZWN0VmVjIFx4M2Qgbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xuXHRcdCNlbHNlXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCAtdmlld0Rpciwgbm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0XHRyZWZsZWN0VmVjIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xuXHRcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgXHgzZCBnZXRTcGVjdWxhck1JUExldmVsKCByb3VnaG5lc3MsIG1heE1JUExldmVsICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0XHRzYW1wbGVVVi54IFx4M2QgYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiLAplbnZtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcblx0I2Vsc2Vcblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLGZvZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdGZvZ0RlcHRoIFx4M2QgLW12UG9zaXRpb24uejtcbiNlbmRpZiIsCmZvZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZiIsZm9nX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgXHgzZCAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2Qgc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmIixmb2dfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBUT09OXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xuXHR2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XG5cdFx0ZmxvYXQgZG90TkwgXHgzZCBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcblx0XHR2ZWMyIGNvb3JkIFx4M2QgdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xuXHRcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcblx0XHRcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuICggY29vcmQueCBceDNjIDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIixsaWdodG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLApsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodHNfbGFtYmVydF92ZXJ0ZXg6InZlYzMgZGlmZnVzZSBceDNkIHZlYzMoIDEuMCApO1xuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgbXZQb3NpdGlvbi54eXo7XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xuYmFja0dlb21ldHJ5LnBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5iYWNrR2VvbWV0cnkubm9ybWFsIFx4M2QgLWdlb21ldHJ5Lm5vcm1hbDtcbmJhY2tHZW9tZXRyeS52aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0RpcjtcbnZMaWdodEZyb250IFx4M2QgdmVjMyggMC4wICk7XG52SW5kaXJlY3RGcm9udCBceDNkIHZlYzMoIDAuMCApO1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2TGlnaHRCYWNrIFx4M2QgdmVjMyggMC4wICk7XG5cdHZJbmRpcmVjdEJhY2sgXHgzZCB2ZWMzKCAwLjAgKTtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbmZsb2F0IGRvdE5MO1xudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0dkluZGlyZWN0RnJvbnQgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZJbmRpcmVjdEJhY2sgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3BhcnNfYmVnaW46InVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcbnVuaWZvcm0gdmVjMyBsaWdodFByb2JlWyA5IF07XG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHRmbG9hdCB4IFx4M2Qgbm9ybWFsLngsIHkgXHgzZCBub3JtYWwueSwgeiBceDNkIG5vcm1hbC56O1xuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSBceDNkIGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkICggZGlyZWN0TGlnaHQuY29sb3IgIVx4M2QgdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xuXHRcdHZlYzMgbFZlY3RvciBceDNkIHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBhbmdsZUNvcyBceDNkIGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0aWYgKCBhbmdsZUNvcyBceDNlIHNwb3RMaWdodC5jb25lQ29zICkge1xuXHRcdFx0ZmxvYXQgc3BvdEVmZmVjdCBceDNkIHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHNwb3RMaWdodC5jb2xvcjtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1x0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7XG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBza3lDb2xvcjtcblx0XHR2ZWMzIGdyb3VuZENvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcblx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCBceDNkIDAuNSAqIGRvdE5MICsgMC41O1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBpcnJhZGlhbmNlO1xuXHR9XG4jZW5kaWYiLApsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2Qgc3BlY3VsYXI7XG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyBceDNkIHNoaW5pbmVzcztcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggXHgzZCBzcGVjdWxhclN0cmVuZ3RoOyIsbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdFx0c3BlY3VsYXJTdHJlbmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHQjaWZkZWYgVE9PTlxuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIiwKbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yIFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyBceDNkIGNsYW1wKCByb3VnaG5lc3NGYWN0b3IsIDAuMDQsIDEuMCApO1xuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdG1hdGVyaWFsLmNsZWFyY29hdCBceDNkIHNhdHVyYXRlKCBjbGVhcmNvYXQgKTtcdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyBceDNkIGNsYW1wKCBjbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDQsIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgXHgzZCBzaGVlbjtcbiNlbmRpZiIsCmxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRmbG9hdCBjbGVhcmNvYXQ7XG5cdGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR2ZWMzIHNoZWVuQ29sb3I7XG4jZW5kaWZcbn07XG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4xNlxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcbmZsb2F0IGNsZWFyY29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcblx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcbn1cbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdFx0dmVjMyBub3JtYWwgXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdFx0dmVjMyB2aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0XHR2ZWMzIHBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0dmVjMyBsaWdodFBvcyBceDNkIHJlY3RBcmVhTGlnaHQucG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGggXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XG5cdFx0dmVjMyBsaWdodENvbG9yIFx4M2QgcmVjdEFyZWFMaWdodC5jb2xvcjtcblx0XHRmbG9hdCByb3VnaG5lc3MgXHgzZCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcblx0XHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcblx0XHRyZWN0Q29vcmRzWyAwIF0gXHgzZCBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XHRcdHJlY3RDb29yZHNbIDEgXSBceDNkIGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAyIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMyBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHZlYzIgdXYgXHgzZCBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XG5cdFx0dmVjNCB0MSBceDNkIHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XG5cdFx0dmVjNCB0MiBceDNkIHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XG5cdFx0bWF0MyBtSW52IFx4M2QgbWF0Myhcblx0XHRcdHZlYzMoIHQxLngsIDAsIHQxLnkgKSxcblx0XHRcdHZlYzMoICAgIDAsIDEsICAgIDAgKSxcblx0XHRcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxuXHRcdCk7XG5cdFx0dmVjMyBmcmVzbmVsIFx4M2QgKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkIGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XG5cdH1cbiNlbmRpZlxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgY2NJcnJhZGlhbmNlIFx4M2QgY2NEb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0Y2NJcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgMC4wO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcblx0XHRcdG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLFxuXHRcdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uLFxuXHRcdFx0Z2VvbWV0cnksXG5cdFx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yXG5cdFx0KTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2QgY2NEb3ROVjtcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdGZsb2F0IGNsZWFyY29hdEludiBceDNkIDEuMCAtIGNsZWFyY29hdERIUjtcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlIFx4M2QgaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XG5cdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHR2ZWMzIGRpZmZ1c2UgXHgzZCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtICggc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZyApICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcdFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufSIsCmxpZ2h0c19mcmFnbWVudF9iZWdpbjoiXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gXHgzZCAtIHZWaWV3UG9zaXRpb247XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWw7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCBceDNkIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHBvaW50TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1NQT1RfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX0RJUl9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgXHgzZCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlibElycmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0aXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcblx0I2lmICggTlVNX0hFTUlfTElHSFRTIFx4M2UgMCApXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0dmVjMyByYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNsZWFyY29hdFJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWYiLApsaWdodHNfZnJhZ21lbnRfbWFwczoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSBceDNkIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRpcnJhZGlhbmNlICtceDNkIGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKSBceDI2XHgyNiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpYmxJcnJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0cmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRSYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X2VuZDoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCBjbGVhcmNvYXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHRnbF9GcmFnRGVwdGhFWFQgXHgzZCBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgXHgyNlx4MjYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuI2VuZGlmIiwKbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xuXHQjZW5kaWZcbiNlbmRpZiIsbG9nZGVwdGhidWZfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dkZyYWdEZXB0aCBceDNkIDEuMCArIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbHNlXG5cdFx0Z2xfUG9zaXRpb24ueiBceDNkIGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xuXHRcdGdsX1Bvc2l0aW9uLnogKlx4M2QgZ2xfUG9zaXRpb24udztcblx0I2VuZGlmXG4jZW5kaWYiLG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCB0ZXhlbENvbG9yIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHR0ZXhlbENvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xuXHRkaWZmdXNlQ29sb3IgKlx4M2QgdGV4ZWxDb2xvcjtcbiNlbmRpZiIsCm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjMiB1diBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7XG5cdHZlYzQgbWFwVGV4ZWwgXHgzZCB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZiIsbWV0YWxuZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgXHgzZCBtZXRhbG5lc3M7XG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR2ZWM0IHRleGVsTWV0YWxuZXNzIFx4M2QgdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xuXHRtZXRhbG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxNZXRhbG5lc3MuYjtcbiNlbmRpZiIsCm1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiLG1vcnBobm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZiIsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxzZVxuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCm1vcnBodGFyZ2V0X3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDAgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQxIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDMgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDUgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ2IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcblx0I2VuZGlmXG4jZW5kaWYiLApub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBGTEFUX1NIQURFRFxuXHR2ZWMzIGZkeCBceDNkIHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBmZHkgXHgzZCB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgXHgzZCBub3JtYWxpemUoIHZOb3JtYWwgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZlYzMgdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdlRhbmdlbnQgKTtcblx0XHR2ZWMzIGJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHRhbmdlbnQgXHgzZCB0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdFx0Yml0YW5nZW50IFx4M2QgYml0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZlxudmVjMyBnZW9tZXRyeU5vcm1hbCBceDNkIG5vcm1hbDsiLApub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCBceDNkIC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBub3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0bm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdG5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBub3JtYWxTY2FsZSwgbm9ybWFsTWFwICk7XG5cdCNlbmRpZlxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xuI2VuZGlmIiwKbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xuI2VuZGlmXG4jaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG4jZW5kaWZcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApIFx4MjZceDI2ICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgbm9ybWFsU2NhbGUsIGluIHNhbXBsZXIyRCBub3JtYWxNYXAgKSB7XG5cdFx0dmVjMyBxMCBceDNkIHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkgKSwgZEZkeCggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHExIFx4M2QgdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzIgc3QwIFx4M2QgZEZkeCggdlV2LnN0ICk7XG5cdFx0dmVjMiBzdDEgXHgzZCBkRmR5KCB2VXYuc3QgKTtcblx0XHRmbG9hdCBzY2FsZSBceDNkIHNpZ24oIHN0MS50ICogc3QwLnMgLSBzdDAudCAqIHN0MS5zICk7XG5cdFx0dmVjMyBTIFx4M2Qgbm9ybWFsaXplKCAoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgVCBceDNkIG5vcm1hbGl6ZSggKCAtIHEwICogc3QxLnMgKyBxMSAqIHN0MC5zICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgTiBceDNkIG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5ICpceDNkIG5vcm1hbFNjYWxlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZlYzMgTmZyb21TVCBceDNkIGNyb3NzKCBTLCBUICk7XG5cdFx0XHRpZiggZG90KCBOZnJvbVNULCBOICkgXHgzZSAwLjAgKSB7XG5cdFx0XHRcdFMgKlx4M2QgLTEuMDtcblx0XHRcdFx0VCAqXHgzZCAtMS4wO1xuXHRcdFx0fVxuXHRcdCNlbHNlXG5cdFx0XHRtYXBOLnh5ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0XHRtYXQzIHRzbiBceDNkIG1hdDMoIFMsIFQsIE4gKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XG5cdH1cbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWwgXHgzZCBnZW9tZXRyeU5vcm1hbDtcbiNlbmRpZiIsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiIjaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBjbGVhcmNvYXROb3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBjbGVhcmNvYXROb3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0Y2xlYXJjb2F0Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtIHZWaWV3UG9zaXRpb24sIGNsZWFyY29hdE5vcm1hbCwgY2xlYXJjb2F0Tm9ybWFsU2NhbGUsIGNsZWFyY29hdE5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuI2VuZGlmIixwYWNraW5nOiJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgXHgzZCAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgXHgzZCAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgXHgzZCB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzIFx4M2QgVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCBceDNkIDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgXHgzZCB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLVx4M2Qgci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG52ZWM0IGVuY29kZUhhbGZSR0JBICggdmVjMiB2ICkge1xuXHR2ZWM0IGVuY29kZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAxLjAgLyAyNTUuMCwgMC4wICk7XG5cdGVuY29kZWQueHkgXHgzZCB2ZWMyKCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApICk7XG5cdGVuY29kZWQueHkgXHgzZCBlbmNvZGVkLnh5IC0gKCBlbmNvZGVkLnl5ICogb2Zmc2V0ICk7XG5cdGVuY29kZWQuencgXHgzZCB2ZWMyKCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7XG5cdGVuY29kZWQuencgXHgzZCBlbmNvZGVkLnp3IC0gKCBlbmNvZGVkLnd3ICogb2Zmc2V0ICk7XG5cdHJldHVybiBlbmNvZGVkO1xufVxudmVjMiBkZWNvZGVIYWxmUkdCQSggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iLApwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICpceDNkIGdsX0ZyYWdDb2xvci5hO1xuI2VuZGlmIixwcm9qZWN0X3ZlcnRleDoidmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuZ2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsiLGRpdGhlcmluZ19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gXHgzZCByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgXHgzZCB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlmdF9SR0IgXHgzZCBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcblx0fVxuI2VuZGlmIiwKcm91Z2huZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCByb3VnaG5lc3NGYWN0b3IgXHgzZCByb3VnaG5lc3M7XG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR2ZWM0IHRleGVsUm91Z2huZXNzIFx4M2QgdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xuXHRyb3VnaG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxSb3VnaG5lc3MuZztcbiNlbmRpZiIscm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcbiNlbmRpZiIsc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xuXHRcdHJldHVybiBkZWNvZGVIYWxmUkdCQSggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcblx0fVxuXHRmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXtcblx0XHRmbG9hdCBvY2NsdXNpb24gXHgzZCAxLjA7XG5cdFx0dmVjMiBkaXN0cmlidXRpb24gXHgzZCB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTtcblx0XHRmbG9hdCBoYXJkX3NoYWRvdyBceDNkIHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApO1xuXHRcdGlmIChoYXJkX3NoYWRvdyAhXHgzZCAxLjAgKSB7XG5cdFx0XHRmbG9hdCBkaXN0YW5jZSBceDNkIGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7XG5cdFx0XHRmbG9hdCB2YXJpYW5jZSBceDNkIG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xuXHRcdFx0ZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTtcdFx0XHRzb2Z0bmVzc19wcm9iYWJpbGl0eSBceDNkIGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTtcdFx0XHRvY2NsdXNpb24gXHgzZCBjbGFtcCggbWF4KCBoYXJkX3NoYWRvdywgc29mdG5lc3NfcHJvYmFiaWxpdHkgKSwgMC4wLCAxLjAgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9jY2x1c2lvbjtcblx0fVxuXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAwLjAsIDEuMCApO1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyBzaXplO1xuXHRcdHZlYzIgY2VudHJvaWRVViBceDNkICggZmxvb3IoIHV2ICogc2l6ZSAtIDAuNSApICsgMC41ICkgKiB0ZXhlbFNpemU7XG5cdFx0ZmxvYXQgbGIgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBhcmUgKTtcblx0XHRmbG9hdCBsdCBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgcnQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcblx0XHR2ZWMyIGYgXHgzZCBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XG5cdFx0ZmxvYXQgYSBceDNkIG1peCggbGIsIGx0LCBmLnkgKTtcblx0XHRmbG9hdCBiIFx4M2QgbWl4KCByYiwgcnQsIGYueSApO1xuXHRcdGZsb2F0IGMgXHgzZCBtaXgoIGEsIGIsIGYueCApO1xuXHRcdHJldHVybiBjO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93IFx4M2QgMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvXHgzZCBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogK1x4M2Qgc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgXHgzZCBidmVjNCAoIHNoYWRvd0Nvb3JkLnggXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC54IFx4M2NceDNkIDEuMCwgc2hhZG93Q29vcmQueSBceDNlXHgzZCAwLjAsIHNoYWRvd0Nvb3JkLnkgXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0gXHgzZCBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjIFx4M2QgYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiBceDNjXHgzZCAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0IFx4M2QgYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDIgXHgzZCBkeDAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTIgXHgzZCBkeTAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeDMgXHgzZCBkeDEgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTMgXHgzZCBkeTEgLyAyLjA7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDE3LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0c2hhZG93IFx4M2QgVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHNoYWRvdyBceDNkIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZW5kaWZcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRvdztcblx0fVxuXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XG5cdFx0dmVjMyBhYnNWIFx4M2QgYWJzKCB2ICk7XG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgXHgzZCAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XG5cdFx0YWJzViAqXHgzZCBzY2FsZVRvQ3ViZTtcblx0XHR2ICpceDNkIHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XG5cdFx0dmVjMiBwbGFuYXIgXHgzZCB2Lnh5O1xuXHRcdGZsb2F0IGFsbW9zdEFUZXhlbCBceDNkIDEuNSAqIHRleGVsU2l6ZVk7XG5cdFx0ZmxvYXQgYWxtb3N0T25lIFx4M2QgMS4wIC0gYWxtb3N0QVRleGVsO1xuXHRcdGlmICggYWJzVi56IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGlmICggdi56IFx4M2UgMC4wIClcblx0XHRcdFx0cGxhbmFyLnggXHgzZCA0LjAgLSB2Lng7XG5cdFx0fSBlbHNlIGlmICggYWJzVi54IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25YIFx4M2Qgc2lnbiggdi54ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XG5cdFx0fSBlbHNlIGlmICggYWJzVi55IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25ZIFx4M2Qgc2lnbiggdi55ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xuXHRcdFx0cGxhbmFyLnkgXHgzZCB2LnogKiBzaWduWSAtIDIuMDtcblx0XHR9XG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xuXHR9XG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkge1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XG5cdFx0dmVjMyBsaWdodFRvUG9zaXRpb24gXHgzZCBzaGFkb3dDb29yZC54eXo7XG5cdFx0ZmxvYXQgZHAgXHgzZCAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTtcdFx0ZHAgK1x4M2Qgc2hhZG93Qmlhcztcblx0XHR2ZWMzIGJkM0QgXHgzZCBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHR2ZWMyIG9mZnNldCBceDNkIHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiLApzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSBceDNkIGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZTcG90U2hhZG93Q29vcmRbIGkgXSBceDNkIHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdIFx4M2QgcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG4jZW5kaWYiLApzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6ImZsb2F0IGdldFNoYWRvd01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0IFx4M2Qgc3BvdExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIHBvaW50TGlnaHQuc2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hhZG93O1xufSIsCnNraW5iYXNlX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IGJvbmVNYXRYIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0bWF0NCBib25lTWF0WSBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9uZU1hdFogXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiIsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9hdCBqIFx4M2QgaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggXHgzZCBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSBceDNkIGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdGZsb2F0IGR5IFx4M2QgMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0eSBceDNkIGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYzIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0IFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSBceDNkIGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2tpbm5pbmdfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHZlYzQgc2tpblZlcnRleCBceDNkIGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5cdHZlYzQgc2tpbm5lZCBceDNkIHZlYzQoIDAuMCApO1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcblx0dHJhbnNmb3JtZWQgXHgzZCAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcbiNlbmRpZiIsc2tpbm5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBza2luTWF0cml4IFx4M2QgbWF0NCggMC4wICk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC54ICogYm9uZU1hdFg7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC55ICogYm9uZU1hdFk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC56ICogYm9uZU1hdFo7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC53ICogYm9uZU1hdFc7XG5cdHNraW5NYXRyaXggIFx4M2QgYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcblx0b2JqZWN0Tm9ybWFsIFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG9iamVjdFRhbmdlbnQgXHgzZCB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNlbmRpZlxuI2VuZGlmIiwKc3BlY3VsYXJtYXBfZnJhZ21lbnQ6ImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHZlYzQgdGV4ZWxTcGVjdWxhciBceDNkIHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xuXHRzcGVjdWxhclN0cmVuZ3RoIFx4M2QgdGV4ZWxTcGVjdWxhci5yO1xuI2Vsc2Vcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIDEuMDtcbiNlbmRpZiIsc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiI2lmbmRlZiBzYXR1cmF0ZVxuXHQjZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZW5kaWZcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcbn1cbnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7XG59XG4jZGVmaW5lIFVuY2hhcnRlZDJIZWxwZXIoIHggKSBtYXgoICggKCB4ICogKCAwLjE1ICogeCArIDAuMTAgKiAwLjUwICkgKyAwLjIwICogMC4wMiApIC8gKCB4ICogKCAwLjE1ICogeCArIDAuNTAgKSArIDAuMjAgKiAwLjMwICkgKSAtIDAuMDIgLyAwLjMwLCB2ZWMzKCAwLjAgKSApXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xufVxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0Y29sb3IgXHgzZCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XG5cdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XG59XG52ZWMzIEFDRVNGaWxtaWNUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCAoIGNvbG9yICogKCAyLjUxICogY29sb3IgKyAwLjAzICkgKSAvICggY29sb3IgKiAoIDIuNDMgKiBjb2xvciArIDAuNTkgKSArIDAuMTQgKSApO1xufSIsCnV2X3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiIsdXZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmIix1dl92ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcbiNlbmRpZiIsdXYyX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZVdjIgXHgzZCB1djI7XG4jZW5kaWYiLAp3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiBceDNkIG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2VuZGlmIixiYWNrZ3JvdW5kX2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcbnZhcnlpbmcgdmVjMiB2VXY7XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGJhY2tncm91bmRfdmVydDoidmFyeWluZyB2ZWMyIHZVdjtcbnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbnZvaWQgbWFpbigpIHtcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcblx0Z2xfUG9zaXRpb24gXHgzZCB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTtcbn0iLApjdWJlX2ZyYWc6InVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XG51bmlmb3JtIGZsb2F0IHRGbGlwO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0Z2xfRnJhZ0NvbG9yLmEgKlx4M2Qgb3BhY2l0eTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxufSIsY3ViZV92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb3NpdGlvbi56IFx4M2QgZ2xfUG9zaXRpb24udztcbn0iLApkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgXHgzZCBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDBcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCB2ZWMzKCAxLjAgLSBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciBceDNkIHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcblx0I2VuZGlmXG59IiwKZGVwdGhfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcbn0iLApkaXN0YW5jZVJHQkFfZnJhZzoiI2RlZmluZSBESVNUQU5DRVxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xudW5pZm9ybSBmbG9hdCBuZWFyRGlzdGFuY2U7XG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbiAoKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0ZmxvYXQgZGlzdCBceDNkIGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApO1xuXHRkaXN0IFx4M2QgKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XG5cdGRpc3QgXHgzZCBzYXR1cmF0ZSggZGlzdCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTtcbn0iLApkaXN0YW5jZVJHQkFfdmVydDoiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iLAplcXVpcmVjdF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLAplcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgXHgzZSBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCmxpbmVkYXNoZWRfdmVydDoidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdHZMaW5lRGlzdGFuY2UgXHgzZCBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaGJhc2ljX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hiYXNpY192ZXJ0OiIjaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3V2Ml92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hsYW1iZXJ0X2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgXHgzZCBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZJbmRpcmVjdEZyb250IDogdkluZGlyZWN0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdkluZGlyZWN0RnJvbnQ7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbGlnaHRtYXBfZnJhZ21lbnRceDNlXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlIFx4M2QgdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICpceDNkIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobGFtYmVydF92ZXJ0OiIjZGVmaW5lIExBTUJFUlRcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfbGFtYmVydF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobWF0Y2FwX2ZyYWc6IiNkZWZpbmUgTUFUQ0FQXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHR2ZWMzIHZpZXdEaXIgXHgzZCBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcblx0dmVjMyB4IFx4M2Qgbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xuXHR2ZWMzIHkgXHgzZCBjcm9zcyggdmlld0RpciwgeCApO1xuXHR2ZWMyIHV2IFx4M2QgdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7XG5cdCNpZmRlZiBVU0VfTUFUQ0FQXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xuXHRcdG1hdGNhcENvbG9yIFx4M2QgbWF0Y2FwVGV4ZWxUb0xpbmVhciggbWF0Y2FwQ29sb3IgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IG1hdGNhcENvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNlbmRpZlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2htYXRjYXBfdmVydDoiI2RlZmluZSBNQVRDQVBcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpZm5kZWYgRkxBVF9TSEFERURcblx0XHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbn0iLAptZXNocGhvbmdfZnJhZzoiI2RlZmluZSBQSE9OR1xudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NidW1wbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waG9uZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZGl0aGVyaW5nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hwaG9uZ192ZXJ0OiIjZGVmaW5lIFBIT05HXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaHBoeXNpY2FsX2ZyYWc6IiNkZWZpbmUgU1RBTkRBUkRcbiNpZmRlZiBQSFlTSUNBTFxuXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxuXHQjZGVmaW5lIENMRUFSQ09BVFxuXHQjZGVmaW5lIFRSQU5TUEFSRU5DWVxuI2VuZGlmXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZkZWYgVFJBTlNQQVJFTkNZXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNwYXJlbmN5O1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElWSVRZXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW47XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FvbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2N1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3JvdWdobmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21ldGFsbmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfZW5kXHgzZVxuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpZmRlZiBUUkFOU1BBUkVOQ1lcblx0XHRkaWZmdXNlQ29sb3IuYSAqXHgzZCBzYXR1cmF0ZSggMS4gLSB0cmFuc3BhcmVuY3kgKyBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKSApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGh5c2ljYWxfdmVydDoiI2RlZmluZSBTVEFOREFSRFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm5vcm1hbF9mcmFnOiIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XG59IiwKbm9ybWFsX3ZlcnQ6IiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSIsCnBvaW50c19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9wYXJ0aWNsZV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApwb2ludHNfdmVydDoidW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBzY2FsZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb2ludFNpemUgXHgzZCBzaXplO1xuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSBceDNkICggcHJvamVjdGlvbk1hdHJpeFsgMiBdWyAzIF0gXHgzZFx4M2QgLSAxLjAgKTtcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKlx4M2QgKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc2hhZG93X2ZyYWc6InVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsc2hhZG93X3ZlcnQ6IiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApzcHJpdGVfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKc3ByaXRlX3ZlcnQ6InVuaWZvcm0gZmxvYXQgcm90YXRpb247XG51bmlmb3JtIHZlYzIgY2VudGVyO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHR2ZWM0IG12UG9zaXRpb24gXHgzZCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0dmVjMiBzY2FsZTtcblx0c2NhbGUueCBceDNkIGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54LCBtb2RlbE1hdHJpeFsgMCBdLnksIG1vZGVsTWF0cml4WyAwIF0ueiApICk7XG5cdHNjYWxlLnkgXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKlx4M2QgLSBtdlBvc2l0aW9uLno7XG5cdCNlbmRpZlxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiBceDNkICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcblx0cm90YXRlZFBvc2l0aW9uLnggXHgzZCBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRyb3RhdGVkUG9zaXRpb24ueSBceDNkIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG5cdG12UG9zaXRpb24ueHkgK1x4M2Qgcm90YXRlZFBvc2l0aW9uO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59In0sCldhPXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyBJKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LGFscGhhTWFwOnt2YWx1ZTpudWxsfX0sc3BlY3VsYXJtYXA6e3NwZWN1bGFyTWFwOnt2YWx1ZTpudWxsfX0sZW52bWFwOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfSxyZWZsZWN0aXZpdHk6e3ZhbHVlOjF9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fSxtYXhNaXBMZXZlbDp7dmFsdWU6MH19LGFvbWFwOnthb01hcDp7dmFsdWU6bnVsbH0sYW9NYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fSxsaWdodG1hcDp7bGlnaHRNYXA6e3ZhbHVlOm51bGx9LGxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LApub3JtYWxTY2FsZTp7dmFsdWU6bmV3IGYoMSwxKX19LGRpc3BsYWNlbWVudG1hcDp7ZGlzcGxhY2VtZW50TWFwOnt2YWx1ZTpudWxsfSxkaXNwbGFjZW1lbnRTY2FsZTp7dmFsdWU6MX0sZGlzcGxhY2VtZW50Qmlhczp7dmFsdWU6MH19LHJvdWdobmVzc21hcDp7cm91Z2huZXNzTWFwOnt2YWx1ZTpudWxsfX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxncmFkaWVudG1hcDp7Z3JhZGllbnRNYXA6e3ZhbHVlOm51bGx9fSxmb2c6e2ZvZ0RlbnNpdHk6e3ZhbHVlOjIuNUUtNH0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyRTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgSSgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sCnNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSwKcG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fX0scG9pbnRzOntkaWZmdXNlOnt2YWx1ZTpuZXcgSSgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3IEkoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxjZW50ZXI6e3ZhbHVlOm5ldyBmKC41LC41KX0scm90YXRpb246e3ZhbHVlOjB9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyB0fX19LE1jPQp7YmFzaWM6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmZvZ10pLHZlcnRleFNoYWRlcjpyYi5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNoYmFzaWNfZnJhZ30sbGFtYmVydDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaGxhbWJlcnRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNobGFtYmVydF9mcmFnfSxwaG9uZzp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLmdyYWRpZW50bWFwLApXYS5mb2csV2EubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IEkoMCl9LHNwZWN1bGFyOnt2YWx1ZTpuZXcgSSgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOnJiLm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm1lc2hwaG9uZ19mcmFnfSxzdGFuZGFyZDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLnJvdWdobmVzc21hcCxXYS5tZXRhbG5lc3NtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfSxyb3VnaG5lc3M6e3ZhbHVlOi41fSxtZXRhbG5lc3M6e3ZhbHVlOi41fSxlbnZNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ30sCm1hdGNhcDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5idW1wbWFwLFdhLm5vcm1hbG1hcCxXYS5kaXNwbGFjZW1lbnRtYXAsV2EuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOkJiKFtXYS5wb2ludHMsV2EuZm9nXSksdmVydGV4U2hhZGVyOnJiLnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOnJiLmxpbmVkYXNoZWRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpyYi5kZXB0aF92ZXJ0LApmcmFnbWVudFNoYWRlcjpyYi5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubm9ybWFsX2ZyYWd9LHNwcml0ZTp7dW5pZm9ybXM6QmIoW1dhLnNwcml0ZSxXYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6cmIuc3ByaXRlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuc3ByaXRlX2ZyYWd9LGJhY2tncm91bmQ6e3VuaWZvcm1zOnt1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LHQyRDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpyYi5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuYmFja2dyb3VuZF9mcmFnfSxjdWJlOnt1bmlmb3Jtczp7dEN1YmU6e3ZhbHVlOm51bGx9LHRGbGlwOnt2YWx1ZTotMX0sb3BhY2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjpyYi5jdWJlX3ZlcnQsCmZyYWdtZW50U2hhZGVyOnJiLmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cmIuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IGt9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFFM319XSksdmVydGV4U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOkJiKFtXYS5saWdodHMsV2EuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IEkoMCl9LG9wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5zaGFkb3dfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5zaGFkb3dfZnJhZ319O01jLnBoeXNpY2FsPQp7dW5pZm9ybXM6QmIoW01jLnN0YW5kYXJkLnVuaWZvcm1zLHt0cmFuc3BhcmVuY3k6e3ZhbHVlOjB9LGNsZWFyY29hdDp7dmFsdWU6MH0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxzaGVlbjp7dmFsdWU6bmV3IEkoMCl9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgZigxLDEpfSxjbGVhcmNvYXROb3JtYWxNYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ307cmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtyZC5wcm90b3R5cGUuY29uc3RydWN0b3I9cmQ7TGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtMYy5wcm90b3R5cGUuY29uc3RydWN0b3I9TGM7Y2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO2NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZDtjZC5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZT0KITA7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSwiaW1hZ2VzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2V9LHNldDpmdW5jdGlvbihhKXt0aGlzLmltYWdlPWF9fSk7cmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yZTtyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTJEQXJyYXk9ITA7c2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3NlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1zZTtzZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTNEPSEwO3ZhciBpaj1uZXcgbCxlbD1uZXcgcmUsZ2w9bmV3IHNlLGpqPW5ldyBjZCxjaj1bXSxlaj1bXSxoaj1uZXcgRmxvYXQzMkFycmF5KDE2KSxnaj1uZXcgRmxvYXQzMkFycmF5KDkpLGZqPW5ldyBGbG9hdDMyQXJyYXkoNCk7a2oucHJvdG90eXBlLnVwZGF0ZUNhY2hlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2FjaGU7YSBpbnN0YW5jZW9mCkZsb2F0MzJBcnJheSYmYy5sZW5ndGghPT1hLmxlbmd0aCYmKHRoaXMuY2FjaGU9bmV3IEZsb2F0MzJBcnJheShhLmxlbmd0aCkpO21jKGMsYSl9O2xqLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXRoaXMuc2VxLHI9MCx2PWcubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Z1tyXTt6LnNldFZhbHVlKGEsY1t6LmlkXSxlKX19O3ZhciBMaD0vKFtcd1xkX10rKShcXSk/KFxbfFwuKT8vZzt1ZC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYSxjLGUsZyl7Yz10aGlzLm1hcFtjXTt2b2lkIDAhPT1jJiZjLnNldFZhbHVlKGEsZSxnKX07dWQucHJvdG90eXBlLnNldE9wdGlvbmFsPWZ1bmN0aW9uKGEsYyxlKXtjPWNbZV07dm9pZCAwIT09YyYmdGhpcy5zZXRWYWx1ZShhLGUsYyl9O3VkLnVwbG9hZD1mdW5jdGlvbihhLGMsZSxnKXtmb3IodmFyIHI9MCx2PWMubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Y1tyXSxFPWVbei5pZF07ITEhPT1FLm5lZWRzVXBkYXRlJiYKei5zZXRWYWx1ZShhLEUudmFsdWUsZyl9fTt1ZC5zZXFXaXRoVmFsdWU9ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9W10sZz0wLHI9YS5sZW5ndGg7ZyE9PXI7KytnKXt2YXIgdj1hW2ddO3YuaWQgaW4gYyYmZS5wdXNoKHYpfXJldHVybiBlfTt2YXIgS2w9MCxUbD0wO3ZkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt2ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9dmQ7dmQucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWw9ITA7dmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZXB0aFBhY2tpbmc9YS5kZXB0aFBhY2tpbmc7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubWFwPWEubWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPQphLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7cmV0dXJuIHRoaXN9O3dkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt3ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9d2Q7d2QucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITA7d2QucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KGEucmVmZXJlbmNlUG9zaXRpb24pO3RoaXMubmVhckRpc3RhbmNlPWEubmVhckRpc3RhbmNlO3RoaXMuZmFyRGlzdGFuY2U9YS5mYXJEaXN0YW5jZTt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tYXA9YS5tYXA7dGhpcy5hbHBoYU1hcD0KYS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWEuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50QmlhcztyZXR1cm4gdGhpc307dWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVlLGlzR3JvdXA6ITB9KTt2Zi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZmLGlzQXJyYXlDYW1lcmE6ITB9KTt2YXIgeWo9bmV3IGssemo9bmV3IGs7T2JqZWN0LmFzc2lnbihOaC5wcm90b3R5cGUsZC5wcm90b3R5cGUpO09iamVjdC5hc3NpZ24oQWoucHJvdG90eXBlLGQucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHpnLnByb3RvdHlwZSx7aXNGb2dFeHAyOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6Zyh0aGlzLmNvbG9yLAp0aGlzLmRlbnNpdHkpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fSk7T2JqZWN0LmFzc2lnbihBZy5wcm90b3R5cGUse2lzRm9nOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBZyh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJGb2ciLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoUWQucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUWQucHJvdG90eXBlLHtpc0ludGVybGVhdmVkQnVmZmVyOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuc3RyaWRlOjA7dGhpcy5hcnJheT1hO3JldHVybiB0aGlzfSxzZXREeW5hbWljOmZ1bmN0aW9uKGEpe3RoaXMuZHluYW1pYz1hO3JldHVybiB0aGlzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYXJyYXk9bmV3IGEuYXJyYXkuY29uc3RydWN0b3IoYS5hcnJheSk7dGhpcy5jb3VudD1hLmNvdW50O3RoaXMuc3RyaWRlPWEuc3RyaWRlO3RoaXMuZHluYW1pYz1hLmR5bmFtaWM7cmV0dXJuIHRoaXN9LGNvcHlBdDpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5zdHJpZGU7ZSo9Yy5zdHJpZGU7Zm9yKHZhciBnPTAscj10aGlzLnN0cmlkZTtnPHI7ZysrKXRoaXMuYXJyYXlbYStnXT1jLmFycmF5W2UrZ107cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuYXJyYXkuc2V0KGEsYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSwKb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGYucHJvdG90eXBlLHtjb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH19LGFycmF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fX19KTtPYmplY3QuYXNzaWduKHhmLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxzZXRYOmZ1bmN0aW9uKGEsYyl7dGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09YztyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09YztyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09YztyZXR1cm4gdGhpc30sCnNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWM7cmV0dXJuIHRoaXN9LGdldFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfSxnZXRaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdfSxnZXRXOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYSwKYyxlLGcpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTt0aGlzLmRhdGEuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3RoaXMuZGF0YS5hcnJheVthKzJdPWc7dGhpcy5kYXRhLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc319KTtBZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7QWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFkO0FkLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsPSEwO0FkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLnJvdGF0aW9uPQphLnJvdGF0aW9uO3RoaXMuc2l6ZUF0dGVudWF0aW9uPWEuc2l6ZUF0dGVudWF0aW9uO3JldHVybiB0aGlzfTt2YXIgQWUsbWc9bmV3IGssbmY9bmV3IGssb2Y9bmV3IGssQmU9bmV3IGYsemY9bmV3IGYsRmo9bmV3IHEscWg9bmV3IGssbmc9bmV3IGsscmg9bmV3IGssa2s9bmV3IGYsS2k9bmV3IGYsbGs9bmV3IGY7eWYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnlmLGlzU3ByaXRlOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXtudWxsPT09YS5jYW1lcmEmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLlNwcml0ZTogIlJheWNhc3Rlci5jYW1lcmEiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nKTtuZi5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCk7RmouY29weShhLmNhbWVyYS5tYXRyaXhXb3JsZCk7dGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhhLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsCnRoaXMubWF0cml4V29ybGQpO29mLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1vZGVsVmlld01hdHJpeCk7YS5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSYmITE9PT10aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiYmbmYubXVsdGlwbHlTY2FsYXIoLW9mLnopO3ZhciBlPXRoaXMubWF0ZXJpYWwucm90YXRpb247aWYoMCE9PWUpe3ZhciBnPU1hdGguY29zKGUpO3ZhciByPU1hdGguc2luKGUpfWU9dGhpcy5jZW50ZXI7QmcocWguc2V0KC0uNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKG5nLnNldCguNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKHJoLnNldCguNSwuNSwwKSxvZixlLG5mLHIsZyk7a2suc2V0KDAsMCk7S2kuc2V0KDEsMCk7bGsuc2V0KDEsMSk7dmFyIHY9YS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUocWgsbmcscmgsITEsbWcpO2lmKG51bGw9PT12JiYoQmcobmcuc2V0KC0uNSwuNSwwKSxvZixlLG5mLHIsZyksS2kuc2V0KDAsMSksdj1hLnJheS5pbnRlcnNlY3RUcmlhbmdsZShxaCwKcmgsbmcsITEsbWcpLG51bGw9PT12KSlyZXR1cm47cj1hLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhtZyk7cjxhLm5lYXJ8fHI+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6cixwb2ludDptZy5jbG9uZSgpLHV2OkIuZ2V0VVYobWcscWgsbmcscmgsa2ssS2ksbGssbmV3IGYpLGZhY2U6bnVsbCxvYmplY3Q6dGhpc30pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt2b2lkIDAhPT1hLmNlbnRlciYmdGhpcy5jZW50ZXIuY29weShhLmNlbnRlcik7cmV0dXJuIHRoaXN9fSk7dmFyIHNoPW5ldyBrLG1rPW5ldyBrO0FmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBZixpc0xPRDohMCxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphLCExKTthPWEubGV2ZWxzO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YVtjXTt0aGlzLmFkZExldmVsKGcub2JqZWN0LmNsb25lKCksZy5kaXN0YW5jZSl9cmV0dXJuIHRoaXN9LGFkZExldmVsOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Yz1NYXRoLmFicyhjKTtmb3IodmFyIGU9dGhpcy5sZXZlbHMsZz0wO2c8ZS5sZW5ndGgmJiEoYzxlW2ddLmRpc3RhbmNlKTtnKyspO2Uuc3BsaWNlKGcsMCx7ZGlzdGFuY2U6YyxvYmplY3Q6YX0pO3RoaXMuYWRkKGEpO3JldHVybiB0aGlzfSxnZXRPYmplY3RGb3JEaXN0YW5jZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0xLGc9Yy5sZW5ndGg7ZTxnJiYhKGE8Y1tlXS5kaXN0YW5jZSk7ZSsrKTtyZXR1cm4gY1tlLTFdLm9iamVjdH0scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTt0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKGEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKHNoKSkucmF5Y2FzdChhLApjKX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMubGV2ZWxzO2lmKDE8Yy5sZW5ndGgpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTttay5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7YT1zaC5kaXN0YW5jZVRvKG1rKTtjWzBdLm9iamVjdC52aXNpYmxlPSEwO2Zvcih2YXIgZT0xLGc9Yy5sZW5ndGg7ZTxnO2UrKylpZihhPj1jW2VdLmRpc3RhbmNlKWNbZS0xXS5vYmplY3QudmlzaWJsZT0hMSxjW2VdLm9iamVjdC52aXNpYmxlPSEwO2Vsc2UgYnJlYWs7Zm9yKDtlPGc7ZSsrKWNbZV0ub2JqZWN0LnZpc2libGU9ITF9fSx0b0pTT046ZnVuY3Rpb24oYSl7YT1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmxldmVscz1bXTtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9Y1tlXTthLm9iamVjdC5sZXZlbHMucHVzaCh7b2JqZWN0OnIub2JqZWN0LnV1aWQsCmRpc3RhbmNlOnIuZGlzdGFuY2V9KX1yZXR1cm4gYX19KTtCZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkJmLGlzU2tpbm5lZE1lc2g6ITAsYmluZDpmdW5jdGlvbihhLGMpe3RoaXMuc2tlbGV0b249YTt2b2lkIDA9PT1jJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGM9dGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5iaW5kTWF0cml4LmNvcHkoYyk7dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKGMpfSxwb3NlOmZ1bmN0aW9uKCl7dGhpcy5za2VsZXRvbi5wb3NlKCl9LG5vcm1hbGl6ZVNraW5XZWlnaHRzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBwLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXthLng9Yy5nZXRYKGUpO2EueT1jLmdldFkoZSk7YS56PWMuZ2V0WihlKTsKYS53PWMuZ2V0VyhlKTt2YXIgcj0xL2EubWFuaGF0dGFuTGVuZ3RoKCk7SW5maW5pdHkhPT1yP2EubXVsdGlwbHlTY2FsYXIocik6YS5zZXQoMSwwLDAsMCk7Yy5zZXRYWVpXKGUsYS54LGEueSxhLnosYS53KX19LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe3hhLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7ImF0dGFjaGVkIj09PXRoaXMuYmluZE1vZGU/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpOiJkZXRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLmJpbmRNYXRyaXgpOmNvbnNvbGUud2FybigiVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogIit0aGlzLmJpbmRNb2RlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTsKdmFyIG5rPW5ldyBxLEltPW5ldyBxO09iamVjdC5hc3NpZ24oQ2cucHJvdG90eXBlLHtjYWxjdWxhdGVJbnZlcnNlczpmdW5jdGlvbigpe3RoaXMuYm9uZUludmVyc2VzPVtdO2Zvcih2YXIgYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl7dmFyIGU9bmV3IHE7dGhpcy5ib25lc1thXSYmZS5nZXRJbnZlcnNlKHRoaXMuYm9uZXNbYV0ubWF0cml4V29ybGQpO3RoaXMuYm9uZUludmVyc2VzLnB1c2goZSl9fSxwb3NlOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspKGE9dGhpcy5ib25lc1tlXSkmJmEubWF0cml4V29ybGQuZ2V0SW52ZXJzZSh0aGlzLmJvbmVJbnZlcnNlc1tlXSk7ZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspaWYoYT10aGlzLmJvbmVzW2VdKWEucGFyZW50JiZhLnBhcmVudC5pc0JvbmU/KGEubWF0cml4LmdldEludmVyc2UoYS5wYXJlbnQubWF0cml4V29ybGQpLGEubWF0cml4Lm11bHRpcGx5KGEubWF0cml4V29ybGQpKToKYS5tYXRyaXguY29weShhLm1hdHJpeFdvcmxkKSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSl9LHVwZGF0ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmJvbmVzLGM9dGhpcy5ib25lSW52ZXJzZXMsZT10aGlzLmJvbmVNYXRyaWNlcyxnPXRoaXMuYm9uZVRleHR1cmUscj0wLHY9YS5sZW5ndGg7cjx2O3IrKyluay5tdWx0aXBseU1hdHJpY2VzKGFbcl0/YVtyXS5tYXRyaXhXb3JsZDpJbSxjW3JdKSxuay50b0FycmF5KGUsMTYqcik7dm9pZCAwIT09ZyYmKGcubmVlZHNVcGRhdGU9ITApfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQ2codGhpcy5ib25lcyx0aGlzLmJvbmVJbnZlcnNlcyl9LGdldEJvbmVCeU5hbWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZT10aGlzLmJvbmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz10aGlzLmJvbmVzW2NdO2lmKGcubmFtZT09PWEpcmV0dXJuIGd9fX0pO1VoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VWgsaXNCb25lOiEwfSk7RmIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0ZiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYjtGYi5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtGYi5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5saW5ld2lkdGg9YS5saW5ld2lkdGg7dGhpcy5saW5lY2FwPWEubGluZWNhcDt0aGlzLmxpbmVqb2luPWEubGluZWpvaW47cmV0dXJuIHRoaXN9O3ZhciBvaz1uZXcgayxwaz1uZXcgayxxaz1uZXcgcSx0aD1uZXcgRCxvZz1uZXcgRztWYi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmIsaXNMaW5lOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PQphLmluZGV4KXtmb3IodmFyIGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9WzBdLGc9MSxyPWMuY291bnQ7ZzxyO2crKylvay5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZy0xKSxway5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZyksZVtnXT1lW2ctMV0sZVtnXSs9b2suZGlzdGFuY2VUbyhwayk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGEuaXNHZW9tZXRyeSlmb3IoYz1hLnZlcnRpY2VzLGU9YS5saW5lRGlzdGFuY2VzLGVbMF09MCxnPTEscj1jLmxlbmd0aDtnPHI7ZysrKWVbZ109ZVtnLTFdLGVbZ10rPWNbZy0xXS5kaXN0YW5jZVRvKGNbZ10pO3JldHVybiB0aGlzfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5saW5lUHJlY2lzaW9uLApnPXRoaXMuZ2VvbWV0cnkscj10aGlzLm1hdHJpeFdvcmxkO251bGw9PT1nLmJvdW5kaW5nU3BoZXJlJiZnLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO29nLmNvcHkoZy5ib3VuZGluZ1NwaGVyZSk7b2cuYXBwbHlNYXRyaXg0KHIpO29nLnJhZGl1cys9ZTtpZighMSE9PWEucmF5LmludGVyc2VjdHNTcGhlcmUob2cpKXtxay5nZXRJbnZlcnNlKHIpO3RoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChxayk7ZS89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zO2UqPWU7dmFyIHY9bmV3IGssej1uZXcgaztyPW5ldyBrO3ZhciBFPW5ldyBrLEY9dGhpcyYmdGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYoZy5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgSj1nLmluZGV4LFA9Zy5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O2lmKG51bGwhPT1KKXtKPUouYXJyYXk7Zz0wO2Zvcih2YXIgUj1KLmxlbmd0aC0xO2c8UjtnKz1GKXt2YXIgUz1KW2crMV07di5mcm9tQXJyYXkoUCwKMypKW2ddKTt6LmZyb21BcnJheShQLDMqUyk7Uz10aC5kaXN0YW5jZVNxVG9TZWdtZW50KHYseixFLHIpO1M+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX1lbHNlIGZvcihnPTAsUj1QLmxlbmd0aC8zLTE7ZzxSO2crPUYpdi5mcm9tQXJyYXkoUCwzKmcpLHouZnJvbUFycmF5KFAsMypnKzMpLFM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2LHosRSxyKSxTPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxTPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFM8YS5uZWFyfHxTPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlMscG9pbnQ6ci5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSwKaW5kZXg6ZyxmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KSl9ZWxzZSBpZihnLmlzR2VvbWV0cnkpZm9yKHY9Zy52ZXJ0aWNlcyx6PXYubGVuZ3RoLGc9MDtnPHotMTtnKz1GKVM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2W2ddLHZbZysxXSxFLHIpLFM+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgdWg9bmV3IGssdmg9bmV3IGs7SWIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6SWIsaXNMaW5lU2VnbWVudHM6ITAsY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdlb21ldHJ5O2lmKGEuaXNCdWZmZXJHZW9tZXRyeSlpZihudWxsPT09YS5pbmRleCl7Zm9yKHZhciBjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixlPVtdLGc9MCxyPWMuY291bnQ7ZzxyO2crPTIpdWguZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGcpLHZoLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxnKzEpLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LiIpO2Vsc2UgaWYoYS5pc0dlb21ldHJ5KWZvcihjPWEudmVydGljZXMsZT0KYS5saW5lRGlzdGFuY2VzLGc9MCxyPWMubGVuZ3RoO2c8cjtnKz0yKXVoLmNvcHkoY1tnXSksdmguY29weShjW2crMV0pLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7cmV0dXJuIHRoaXN9fSk7RGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpEZyxpc0xpbmVMb29wOiEwfSk7QWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0FjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BYztBYy5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbD0hMDtBYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5zaXplPWEuc2l6ZTt0aGlzLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbjt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czsKcmV0dXJuIHRoaXN9O3ZhciByaz1uZXcgcSxXaD1uZXcgRCxwZz1uZXcgRyx3aD1uZXcgaztDZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Q2UsaXNQb2ludHM6ITAscmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2VvbWV0cnksZz10aGlzLm1hdHJpeFdvcmxkLHI9YS5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtudWxsPT09ZS5ib3VuZGluZ1NwaGVyZSYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwZy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpO3BnLmFwcGx5TWF0cml4NChnKTtwZy5yYWRpdXMrPXI7aWYoITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKHBnKSlpZihyay5nZXRJbnZlcnNlKGcpLFdoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChyayksci89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zLHIqPXIsZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4OwplPWUuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09dil7dmFyIHo9di5hcnJheTt2PTA7Zm9yKHZhciBFPXoubGVuZ3RoO3Y8RTt2Kyspe3ZhciBGPXpbdl07d2guZnJvbUFycmF5KGUsMypGKTtWaCh3aCxGLHIsZyxhLGMsdGhpcyl9fWVsc2UgZm9yKHY9MCx6PWUubGVuZ3RoLzM7djx6O3YrKyl3aC5mcm9tQXJyYXkoZSwzKnYpLFZoKHdoLHYscixnLGEsYyx0aGlzKX1lbHNlIGZvcihlPWUudmVydGljZXMsdj0wLHo9ZS5sZW5ndGg7djx6O3YrKylWaChlW3ZdLHYscixnLGEsYyx0aGlzKX0sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT0Ke30sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErKyl7dmFyIGc9ZVthXS5uYW1lfHxTdHJpbmcoYSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtnXT1hfX19ZWxzZSBhPWEubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWEmJjA8YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTtYaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WGgsaXNWaWRlb1RleHR1cmU6ITAsdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pbWFnZTthLnJlYWR5U3RhdGU+PQphLkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fSk7RGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZTtEZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZT0hMDtDZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7Q2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUNmO0NmLnByb3RvdHlwZS5pc0NhbnZhc1RleHR1cmU9ITA7RGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZjtEZi5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmU9ITA7RWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtFZS5wcm90b3R5cGUuY29uc3RydWN0b3I9RWU7RWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtFZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RWY7RmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTsKRmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZlO0ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7RmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZmO2pjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7amMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWpjO0dmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7R2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdmO0dlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7R2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdlO0hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUhmO1JkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7UmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJkO0lmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpJZjtIZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZTtKZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0pmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1KZjtJZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZTtLZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0tmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1LZjtTZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZDtTZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9dmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucGF0aD10aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKTtyZXR1cm4gYX07TGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKTGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxmO0plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7SmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUplO01mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7TWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1mO0tlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7S2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUtlO3ZhciBKbT17dHJpYW5ndWxhdGU6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8Mjt2YXIgZz1jJiZjLmxlbmd0aCxyPWc/Y1swXSplOmEubGVuZ3RoLHY9R2ooYSwwLHIsZSwhMCksej1bXTtpZighdnx8di5uZXh0PT09di5wcmV2KXJldHVybiB6O2cmJih2PWRtKGEsYyx2LGUpKTtpZihhLmxlbmd0aD44MCplKXt2YXIgRT1jPWFbMF07dmFyIEY9Zz1hWzFdO2Zvcih2YXIgSj1lO0o8cjtKKz1lKXt2YXIgUD1hW0pdO3ZhciBSPWFbSisxXTtQPEUmJihFPVApO1I8RiYmKEY9Uik7ClA+YyYmKGM9UCk7Uj5nJiYoZz1SKX1QPU1hdGgubWF4KGMtRSxnLUYpO1A9MCE9PVA/MS9QOjB9UGYodix6LGUsRSxGLFApO3JldHVybiB6fX0sZWQ9e2FyZWE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWEubGVuZ3RoLGU9MCxnPWMtMSxyPTA7cjxjO2c9cisrKWUrPWFbZ10ueCphW3JdLnktYVtyXS54KmFbZ10ueTtyZXR1cm4uNSplfSxpc0Nsb2NrV2lzZTpmdW5jdGlvbihhKXtyZXR1cm4gMD5lZC5hcmVhKGEpfSx0cmlhbmd1bGF0ZVNoYXBlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9W10sZz1bXSxyPVtdO0tqKGEpO0xqKGUsYSk7dmFyIHY9YS5sZW5ndGg7Yy5mb3JFYWNoKEtqKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKWcucHVzaCh2KSx2Kz1jW2FdLmxlbmd0aCxMaihlLGNbYV0pO2M9Sm0udHJpYW5ndWxhdGUoZSxnKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9MylyLnB1c2goYy5zbGljZShhLGErMykpO3JldHVybiByfX07VWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKVWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVVkO1VkLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT15YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O1JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJjO1JjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O3ZhciBsbT17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihhLGMsZSxnLHIpe2E9Y1szKmddO2c9Y1szKmcrMV07dmFyIHY9Y1szKnJdO3I9Y1szKnIrMV07cmV0dXJuW25ldyBmKGNbMyplXSxjWzMqZSsxXSksbmV3IGYoYSxnKSxuZXcgZih2LHIpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7YT1jWzMqZV07dmFyIHo9Y1szKmUrMV07ZT1jWzMqZSsyXTt2YXIgRT1jWzMqZ10sRj1jWzMqZysxXTtnPWNbMypnKzJdO3ZhciBKPWNbMypyXSxQPWNbMypyKzFdO3I9Y1szKnIrMl07dmFyIFI9Y1szKnZdLFM9Y1szKnYrMV07Yz1jWzMqdisyXTtyZXR1cm4uMDE+TWF0aC5hYnMoei1GKT9bbmV3IGYoYSwxLWUpLG5ldyBmKEUsMS1nKSxuZXcgZihKLDEtciksbmV3IGYoUiwxLWMpXTpbbmV3IGYoeiwxLWUpLG5ldyBmKEYsMS1nKSxuZXcgZihQLDEtciksbmV3IGYoUywxLWMpXX19O1JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7UmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJmO01lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFJjLnByb3RvdHlwZSk7TWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1lO1NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNmO0JkLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0JkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1CZDtUZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZjtOZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO05lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OZTtVZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZjtPZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO09lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1PZTtWZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1ZkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZDtWZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9eWEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBOaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLAphKX07V2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtXZC5wcm90b3R5cGUuY29uc3RydWN0b3I9V2Q7V2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gTmoodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxhKX07UGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtQZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UGU7WGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtYZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WGQ7ZmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtmZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZmQ7VmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWGQucHJvdG90eXBlKTtWZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VmY7V2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZmQucHJvdG90eXBlKTtXZi5wcm90b3R5cGUuY29uc3RydWN0b3I9CldmO1hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7WGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhmO1FlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVFlO3ZhciBnYz1PYmplY3QuZnJlZXplKHtXaXJlZnJhbWVHZW9tZXRyeTpFZSxQYXJhbWV0cmljR2VvbWV0cnk6RWYsUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OkZlLFRldHJhaGVkcm9uR2VvbWV0cnk6R2YsVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTpHZSxPY3RhaGVkcm9uR2VvbWV0cnk6SGYsT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OlJkLEljb3NhaGVkcm9uR2VvbWV0cnk6SWYsSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTpIZSxEb2RlY2FoZWRyb25HZW9tZXRyeTpKZixEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTpJZSxQb2x5aGVkcm9uR2VvbWV0cnk6RmYsUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmpjLFR1YmVHZW9tZXRyeTpLZiwKVHViZUJ1ZmZlckdlb21ldHJ5OlNkLFRvcnVzS25vdEdlb21ldHJ5OkxmLFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OkplLFRvcnVzR2VvbWV0cnk6TWYsVG9ydXNCdWZmZXJHZW9tZXRyeTpLZSxUZXh0R2VvbWV0cnk6UmYsVGV4dEJ1ZmZlckdlb21ldHJ5Ok1lLFNwaGVyZUdlb21ldHJ5OlNmLFNwaGVyZUJ1ZmZlckdlb21ldHJ5OkJkLFJpbmdHZW9tZXRyeTpUZixSaW5nQnVmZmVyR2VvbWV0cnk6TmUsUGxhbmVHZW9tZXRyeTpyZCxQbGFuZUJ1ZmZlckdlb21ldHJ5OkxjLExhdGhlR2VvbWV0cnk6VWYsTGF0aGVCdWZmZXJHZW9tZXRyeTpPZSxTaGFwZUdlb21ldHJ5OlZkLFNoYXBlQnVmZmVyR2VvbWV0cnk6V2QsRXh0cnVkZUdlb21ldHJ5OlVkLEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTpSYyxFZGdlc0dlb21ldHJ5OlBlLENvbmVHZW9tZXRyeTpWZixDb25lQnVmZmVyR2VvbWV0cnk6V2YsQ3lsaW5kZXJHZW9tZXRyeTpYZCxDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OmZkLENpcmNsZUdlb21ldHJ5OlhmLApDaXJjbGVCdWZmZXJHZW9tZXRyeTpRZSxCb3hHZW9tZXRyeTpTYSxCb3hCdWZmZXJHZW9tZXRyeTpYYX0pO1lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtZZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WWQ7WWQucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWw9ITA7WWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3JldHVybiB0aGlzfTtSZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShxYi5wcm90b3R5cGUpO1JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZTtSZS5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMDtTYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7U2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNjO1NjLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPSEwO1NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5yb3VnaG5lc3M9YS5yb3VnaG5lc3M7dGhpcy5tZXRhbG5lc3M9YS5tZXRhbG5lc3M7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1hLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7CnRoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMucm91Z2huZXNzTWFwPWEucm91Z2huZXNzTWFwO3RoaXMubWV0YWxuZXNzTWFwPWEubWV0YWxuZXNzTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9CmEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtaZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYy5wcm90b3R5cGUpO1pkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aZDtaZC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMDtaZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHk7dGhpcy5jbGVhcmNvYXQ9YS5jbGVhcmNvYXQ7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9YS5jbGVhcmNvYXRSb3VnaG5lc3M7dGhpcy5zaGVlbj1hLnNoZWVuPyh0aGlzLnNoZWVufHxuZXcgSSkuY29weShhLnNoZWVuKTpudWxsO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPWEuY2xlYXJjb2F0Tm9ybWFsTWFwO3RoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weShhLmNsZWFyY29hdE5vcm1hbFNjYWxlKTsKdGhpcy50cmFuc3BhcmVuY3k9YS50cmFuc3BhcmVuY3k7cmV0dXJuIHRoaXN9O0JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtCYy5wcm90b3R5cGUuY29uc3RydWN0b3I9QmM7QmMucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJpYWw9ITA7QmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMuc3BlY3VsYXIuY29weShhLnNwZWN1bGFyKTt0aGlzLnNoaW5pbmVzcz1hLnNoaW5pbmVzczt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PQphLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPQphLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9OyRkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEJjLnByb3RvdHlwZSk7JGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRkOyRkLnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWw9ITA7JGQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QmMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JhZGllbnRNYXA9YS5ncmFkaWVudE1hcDtyZXR1cm4gdGhpc307YWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2FlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZTthZS5wcm90b3R5cGUuaXNNZXNoTm9ybWFsTWF0ZXJpYWw9CiEwO2FlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTsKYmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZTtiZS5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsPSEwO2JlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWEuZW1pc3NpdmVJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD0KYS5lbnZNYXA7dGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtjZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2U7Y2UucHJvdG90eXBlLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwO2NlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e01BVENBUDoiIn07dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWF0Y2FwPWEubWF0Y2FwO3RoaXMubWFwPWEubWFwO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307ZGUucHJvdG90eXBlPQpPYmplY3QuY3JlYXRlKEZiLnByb3RvdHlwZSk7ZGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRlO2RlLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbD0hMDtkZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zY2FsZT1hLnNjYWxlO3RoaXMuZGFzaFNpemU9YS5kYXNoU2l6ZTt0aGlzLmdhcFNpemU9YS5nYXBTaXplO3JldHVybiB0aGlzfTt2YXIgS209T2JqZWN0LmZyZWV6ZSh7U2hhZG93TWF0ZXJpYWw6WWQsU3ByaXRlTWF0ZXJpYWw6QWQsUmF3U2hhZGVyTWF0ZXJpYWw6UmUsU2hhZGVyTWF0ZXJpYWw6cWIsUG9pbnRzTWF0ZXJpYWw6QWMsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6WmQsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6U2MsTWVzaFBob25nTWF0ZXJpYWw6QmMsTWVzaFRvb25NYXRlcmlhbDokZCxNZXNoTm9ybWFsTWF0ZXJpYWw6YWUsTWVzaExhbWJlcnRNYXRlcmlhbDpiZSxNZXNoRGVwdGhNYXRlcmlhbDp2ZCwKTWVzaERpc3RhbmNlTWF0ZXJpYWw6d2QsTWVzaEJhc2ljTWF0ZXJpYWw6TCxNZXNoTWF0Y2FwTWF0ZXJpYWw6Y2UsTGluZURhc2hlZE1hdGVyaWFsOmRlLExpbmVCYXNpY01hdGVyaWFsOkZiLE1hdGVyaWFsOk19KSxUYj17YXJyYXlTbGljZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIFRiLmlzVHlwZWRBcnJheShhKT9uZXcgYS5jb25zdHJ1Y3RvcihhLnN1YmFycmF5KGMsdm9pZCAwIT09ZT9lOmEubGVuZ3RoKSk6YS5zbGljZShjLGUpfSxjb252ZXJ0QXJyYXk6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiFhfHwhZSYmYS5jb25zdHJ1Y3Rvcj09PWM/YToibnVtYmVyIj09PXR5cGVvZiBjLkJZVEVTX1BFUl9FTEVNRU5UP25ldyBjKGEpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpfSxpc1R5cGVkQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhKSYmIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpfSxnZXRLZXlmcmFtZU9yZGVyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0KYS5sZW5ndGgsZT1BcnJheShjKSxnPTA7ZyE9PWM7KytnKWVbZ109ZztlLnNvcnQoZnVuY3Rpb24ocix2KXtyZXR1cm4gYVtyXS1hW3ZdfSk7cmV0dXJuIGV9LHNvcnRlZEFycmF5OmZ1bmN0aW9uKGEsYyxlKXtmb3IodmFyIGc9YS5sZW5ndGgscj1uZXcgYS5jb25zdHJ1Y3RvcihnKSx2PTAsej0wO3ohPT1nOysrdilmb3IodmFyIEU9ZVt2XSpjLEY9MDtGIT09YzsrK0Ypclt6KytdPWFbRStGXTtyZXR1cm4gcn0sZmxhdHRlbkpTT046ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPTEsdj1hWzBdO3ZvaWQgMCE9PXYmJnZvaWQgMD09PXZbZ107KXY9YVtyKytdO2lmKHZvaWQgMCE9PXYpe3ZhciB6PXZbZ107aWYodm9pZCAwIT09eilpZihBcnJheS5pc0FycmF5KHopKXtkbyB6PXZbZ10sdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLGUucHVzaC5hcHBseShlLHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNlIGlmKHZvaWQgMCE9PXoudG9BcnJheSl7ZG8gej12W2ddLAp2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksei50b0FycmF5KGUsZS5sZW5ndGgpKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNle2RvIHo9dltnXSx2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksZS5wdXNoKHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX19fX07T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2V2YWx1YXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zLGU9dGhpcy5fY2FjaGVkSW5kZXgsZz1jW2VdLHI9Y1tlLTFdO2E6e2I6e2M6e2Q6aWYoIShhPGcpKXtmb3IodmFyIHY9ZSsyOzspe2lmKHZvaWQgMD09PWcpe2lmKGE8cilicmVhayBkO3RoaXMuX2NhY2hlZEluZGV4PWU9Yy5sZW5ndGg7cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKGUtMSxhLHIpfWlmKGU9PT12KWJyZWFrO3I9ZztnPWNbKytlXTtpZihhPGcpYnJlYWsgYn1nPWMubGVuZ3RoO2JyZWFrIGN9aWYoYT49cilicmVhayBhO2Vsc2V7dj1jWzFdO2E8diYmCihlPTIscj12KTtmb3Iodj1lLTI7Oyl7aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYoZT09PXYpYnJlYWs7Zz1yO3I9Y1stLWUtMV07aWYoYT49cilicmVhayBifWc9ZTtlPTB9fWZvcig7ZTxnOylyPWUrZz4+PjEsYTxjW3JdP2c9cjplPXIrMTtnPWNbZV07cj1jW2UtMV07aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYodm9pZCAwPT09ZylyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9ZT1jLmxlbmd0aCx0aGlzLmFmdGVyRW5kXyhlLTEscixhKX10aGlzLl9jYWNoZWRJbmRleD1lO3RoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhlLHIsZyl9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKGUscixhLGcpfSxzZXR0aW5nczpudWxsLERlZmF1bHRTZXR0aW5nc186e30sZ2V0U2V0dGluZ3NfOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fAp0aGlzLkRlZmF1bHRTZXR0aW5nc199LGNvcHlTYW1wbGVWYWx1ZV86ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yZXN1bHRCdWZmZXIsZT10aGlzLnNhbXBsZVZhbHVlcyxnPXRoaXMudmFsdWVTaXplO2EqPWc7Zm9yKHZhciByPTA7ciE9PWc7KytyKWNbcl09ZVthK3JdO3JldHVybiBjfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiY2FsbCB0byBhYnN0cmFjdCBtZXRob2QiKTt9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oKXt9fSk7T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2JlZm9yZVN0YXJ0XzpvYy5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxhZnRlckVuZF86b2MucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV99KTtFZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkVnLERlZmF1bHRTZXR0aW5nc186e2VuZGluZ1N0YXJ0OjI0MDAsZW5kaW5nRW5kOjI0MDB9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oYSwKYyxlKXt2YXIgZz10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxyPWEtMix2PWErMSx6PWdbcl0sRT1nW3ZdO2lmKHZvaWQgMD09PXopc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgMjQwMTpyPWE7ej0yKmMtZTticmVhaztjYXNlIDI0MDI6cj1nLmxlbmd0aC0yO3o9YytnW3JdLWdbcisxXTticmVhaztkZWZhdWx0OnI9YSx6PWV9aWYodm9pZCAwPT09RSlzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2UgMjQwMTp2PWE7RT0yKmUtYzticmVhaztjYXNlIDI0MDI6dj0xO0U9ZStnWzFdLWdbMF07YnJlYWs7ZGVmYXVsdDp2PWEtMSxFPWN9YT0uNSooZS1jKTtnPXRoaXMudmFsdWVTaXplO3RoaXMuX3dlaWdodFByZXY9YS8oYy16KTt0aGlzLl93ZWlnaHROZXh0PWEvKEUtZSk7dGhpcy5fb2Zmc2V0UHJldj1yKmc7dGhpcy5fb2Zmc2V0TmV4dD12Kmd9LGludGVycG9sYXRlXzpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLnJlc3VsdEJ1ZmZlciwKdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7dmFyIEU9YS16LEY9dGhpcy5fb2Zmc2V0UHJldixKPXRoaXMuX29mZnNldE5leHQsUD10aGlzLl93ZWlnaHRQcmV2LFI9dGhpcy5fd2VpZ2h0TmV4dCxTPShlLWMpLyhnLWMpO2U9UypTO2c9ZSpTO2M9LVAqZysyKlAqZS1QKlM7UD0oMStQKSpnKygtMS41LTIqUCkqZSsoLS41K1ApKlMrMTtTPSgtMS1SKSpnKygxLjUrUikqZSsuNSpTO1I9UipnLVIqZTtmb3IoZT0wO2UhPT16OysrZSlyW2VdPWMqdltGK2VdK1AqdltFK2VdK1MqdlthK2VdK1IqdltKK2VdO3JldHVybiByfX0pO1lmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WWYsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMucmVzdWx0QnVmZmVyLHY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O3ZhciBFPWEtejtjPShlLWMpLyhnLQpjKTtlPTEtYztmb3IoZz0wO2chPT16OysrZylyW2ddPXZbRStnXSplK3ZbYStnXSpjO3JldHVybiByfX0pO0ZnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RmcsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oYS0xKX19KTtPYmplY3QuYXNzaWduKFhiLHt0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9YS5jb25zdHJ1Y3RvcjtpZih2b2lkIDAhPT1jLnRvSlNPTiljPWMudG9KU09OKGEpO2Vsc2V7Yz17bmFtZTphLm5hbWUsdGltZXM6VGIuY29udmVydEFycmF5KGEudGltZXMsQXJyYXkpLHZhbHVlczpUYi5jb252ZXJ0QXJyYXkoYS52YWx1ZXMsQXJyYXkpfTt2YXIgZT1hLmdldEludGVycG9sYXRpb24oKTtlIT09YS5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKGMuaW50ZXJwb2xhdGlvbj1lKX1jLnR5cGU9YS5WYWx1ZVR5cGVOYW1lO3JldHVybiBjfX0pO09iamVjdC5hc3NpZ24oWGIucHJvdG90eXBlLAp7Y29uc3RydWN0b3I6WGIsVGltZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LFZhbHVlQnVmZmVyVHlwZTpGbG9hdDMyQXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEZnKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxhKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgWWYodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBFZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LHNldEludGVycG9sYXRpb246ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMjMwMDp2YXIgYz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOwpicmVhaztjYXNlIDIzMDE6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjticmVhaztjYXNlIDIzMDI6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aH1pZih2b2lkIDA9PT1jKXtjPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHZvaWQgMD09PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpaWYoYSE9PXRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pO2Vsc2UgdGhyb3cgRXJyb3IoYyk7Y29uc29sZS53YXJuKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiIsYyk7cmV0dXJuIHRoaXN9dGhpcy5jcmVhdGVJbnRlcnBvbGFudD1jO3JldHVybiB0aGlzfSxnZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gMjMwMDsKY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpyZXR1cm4gMjMwMTtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiAyMzAyfX0sZ2V0VmFsdWVTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aC90aGlzLnRpbWVzLmxlbmd0aH0sc2hpZnQ6ZnVuY3Rpb24oYSl7aWYoMCE9PWEpZm9yKHZhciBjPXRoaXMudGltZXMsZT0wLGc9Yy5sZW5ndGg7ZSE9PWc7KytlKWNbZV0rPWE7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe2lmKDEhPT1hKWZvcih2YXIgYz10aGlzLnRpbWVzLGU9MCxnPWMubGVuZ3RoO2UhPT1nOysrZSljW2VdKj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMudGltZXMsZz1lLmxlbmd0aCxyPTAsdj1nLTE7ciE9PWcmJmVbcl08YTspKytyO2Zvcig7LTEhPT12JiZlW3ZdPmM7KS0tdjsrK3Y7aWYoMCE9PXJ8fHYhPT1nKXI+PXYmJih2PU1hdGgubWF4KHYsCjEpLHI9di0xKSxhPXRoaXMuZ2V0VmFsdWVTaXplKCksdGhpcy50aW1lcz1UYi5hcnJheVNsaWNlKGUscix2KSx0aGlzLnZhbHVlcz1UYi5hcnJheVNsaWNlKHRoaXMudmFsdWVzLHIqYSx2KmEpO3JldHVybiB0aGlzfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBhPSEwLGM9dGhpcy5nZXRWYWx1ZVNpemUoKTswIT09Yy1NYXRoLmZsb29yKGMpJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLiIsdGhpcyksYT0hMSk7dmFyIGU9dGhpcy50aW1lcztjPXRoaXMudmFsdWVzO3ZhciBnPWUubGVuZ3RoOzA9PT1nJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuIix0aGlzKSxhPSExKTtmb3IodmFyIHI9bnVsbCx2PTA7diE9PWc7disrKXt2YXIgej1lW3ZdO2lmKCJudW1iZXIiPT09dHlwZW9mIHomJmlzTmFOKHopKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLAp0aGlzLHYseik7YT0hMTticmVha31pZihudWxsIT09ciYmcj56KXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsdix6LHIpO2E9ITE7YnJlYWt9cj16fWlmKHZvaWQgMCE9PWMmJlRiLmlzVHlwZWRBcnJheShjKSlmb3Iodj0wLGU9Yy5sZW5ndGg7diE9PWU7Kyt2KWlmKGc9Y1t2XSxpc05hTihnKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyx2LGcpO2E9ITE7YnJlYWt9cmV0dXJuIGF9LG9wdGltaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudGltZXMsYz10aGlzLnZhbHVlcyxlPXRoaXMuZ2V0VmFsdWVTaXplKCksZz0yMzAyPT09dGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkscj0xLHY9YS5sZW5ndGgtMSx6PTE7ejx2Oysreil7dmFyIEU9ITEsRj1hW3pdO2lmKEYhPT1hW3orMV0mJigxIT09enx8RiE9PUZbMF0pKWlmKGcpRT0hMDsKZWxzZXt2YXIgSj16KmUsUD1KLWUsUj1KK2U7Zm9yKEY9MDtGIT09ZTsrK0Ype3ZhciBTPWNbSitGXTtpZihTIT09Y1tQK0ZdfHxTIT09Y1tSK0ZdKXtFPSEwO2JyZWFrfX19aWYoRSl7aWYoeiE9PXIpZm9yKGFbcl09YVt6XSxFPXoqZSxKPXIqZSxGPTA7RiE9PWU7KytGKWNbSitGXT1jW0UrRl07KytyfX1pZigwPHYpe2Fbcl09YVt2XTtFPXYqZTtKPXIqZTtmb3IoRj0wO0YhPT1lOysrRiljW0orRl09Y1tFK0ZdOysrcn1yIT09YS5sZW5ndGgmJih0aGlzLnRpbWVzPVRiLmFycmF5U2xpY2UoYSwwLHIpLHRoaXMudmFsdWVzPVRiLmFycmF5U2xpY2UoYywwLHIqZSkpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPVRiLmFycmF5U2xpY2UodGhpcy50aW1lcywwKSxjPVRiLmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCk7YT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm5hbWUsYSxjKTthLmNyZWF0ZUludGVycG9sYW50PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ7cmV0dXJuIGF9fSk7CkdnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6R2csVmFsdWVUeXBlTmFtZToiYm9vbCIsVmFsdWVCdWZmZXJUeXBlOkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOnZvaWQgMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7SGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpIZyxWYWx1ZVR5cGVOYW1lOiJjb2xvciJ9KTtTZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlNlLFZhbHVlVHlwZU5hbWU6Im51bWJlciJ9KTtJZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOklnLGludGVycG9sYXRlXzpmdW5jdGlvbihhLApjLGUsZyl7dmFyIHI9dGhpcy5yZXN1bHRCdWZmZXIsdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7Yz0oZS1jKS8oZy1jKTtmb3IoZT1hK3o7YSE9PWU7YSs9NCloLnNsZXJwRmxhdChyLDAsdixhLXosdixhLGMpO3JldHVybiByfX0pO1pmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WmYsVmFsdWVUeXBlTmFtZToicXVhdGVybmlvbiIsRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtKZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpnLFZhbHVlVHlwZU5hbWU6InN0cmluZyIsClZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO1RlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGUsVmFsdWVUeXBlTmFtZToidmVjdG9yIn0pO09iamVjdC5hc3NpZ24odGMse3BhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPWEudHJhY2tzLGc9MS8oYS5mcHN8fDEpLHI9MCx2PWUubGVuZ3RoO3IhPT12OysrciljLnB1c2gobm0oZVtyXSkuc2NhbGUoZykpO3JldHVybiBuZXcgdGMoYS5uYW1lLGEuZHVyYXRpb24sYyl9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz1bXSxlPWEudHJhY2tzO2E9e25hbWU6YS5uYW1lLGR1cmF0aW9uOmEuZHVyYXRpb24sdHJhY2tzOmMsdXVpZDphLnV1aWR9O2Zvcih2YXIgZz0wLHI9ZS5sZW5ndGg7ZyE9PQpyOysrZyljLnB1c2goWGIudG9KU09OKGVbZ10pKTtyZXR1cm4gYX0sQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2U6ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPWMubGVuZ3RoLHY9W10sej0wO3o8cjt6Kyspe3ZhciBFPVtdLEY9W107RS5wdXNoKCh6K3ItMSklcix6LCh6KzEpJXIpO0YucHVzaCgwLDEsMCk7dmFyIEo9VGIuZ2V0S2V5ZnJhbWVPcmRlcihFKTtFPVRiLnNvcnRlZEFycmF5KEUsMSxKKTtGPVRiLnNvcnRlZEFycmF5KEYsMSxKKTtnfHwwIT09RVswXXx8KEUucHVzaChyKSxGLnB1c2goRlswXSkpO3YucHVzaCgobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyIrY1t6XS5uYW1lKyJdIixFLEYpKS5zY2FsZSgxL2UpKX1yZXR1cm4gbmV3IHRjKGEsLTEsdil9LGZpbmRCeU5hbWU6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hO0FycmF5LmlzQXJyYXkoYSl8fChlPWEuZ2VvbWV0cnkmJmEuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8YS5hbmltYXRpb25zKTtmb3IoYT0KMDthPGUubGVuZ3RoO2ErKylpZihlW2FdLm5hbWU9PT1jKXJldHVybiBlW2FdO3JldHVybiBudWxsfSxDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczpmdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXt9LHI9L14oW1x3LV0qPykoW1xkXSspJC8sdj0wLHo9YS5sZW5ndGg7djx6O3YrKyl7dmFyIEU9YVt2XSxGPUUubmFtZS5tYXRjaChyKTtpZihGJiYxPEYubGVuZ3RoKXt2YXIgSj1GWzFdOyhGPWdbSl0pfHwoZ1tKXT1GPVtdKTtGLnB1c2goRSl9fWE9W107Zm9yKEogaW4gZylhLnB1c2godGMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoSixnW0pdLGMsZSkpO3JldHVybiBhfSxwYXJzZUFuaW1hdGlvbjpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoaGEsZmEscmEscGEscWEpe2lmKDAhPT1yYS5sZW5ndGgpe3ZhciB1YT1bXSxvYT1bXTtUYi5mbGF0dGVuSlNPTihyYSx1YSxvYSxwYSk7MCE9PXVhLmxlbmd0aCYmcWEucHVzaChuZXcgaGEoZmEsdWEsb2EpKX19CmlmKCFhKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7dmFyIGc9W10scj1hLm5hbWV8fCJkZWZhdWx0Iix2PWEubGVuZ3RofHwtMSx6PWEuZnBzfHwzMDthPWEuaGllcmFyY2h5fHxbXTtmb3IodmFyIEU9MDtFPGEubGVuZ3RoO0UrKyl7dmFyIEY9YVtFXS5rZXlzO2lmKEYmJjAhPT1GLmxlbmd0aClpZihGWzBdLm1vcnBoVGFyZ2V0cyl7dj17fTtmb3IodmFyIEo9MDtKPEYubGVuZ3RoO0orKylpZihGW0pdLm1vcnBoVGFyZ2V0cylmb3IodmFyIFA9MDtQPEZbSl0ubW9ycGhUYXJnZXRzLmxlbmd0aDtQKyspdltGW0pdLm1vcnBoVGFyZ2V0c1tQXV09LTE7Zm9yKHZhciBSIGluIHYpe3ZhciBTPVtdLFY9W107Zm9yKFA9MDtQIT09RltKXS5tb3JwaFRhcmdldHMubGVuZ3RoOysrUCl7dmFyIFc9RltKXTtTLnB1c2goVy50aW1lKTtWLnB1c2goVy5tb3JwaFRhcmdldD09PVI/MTowKX1nLnB1c2gobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VbIisKUisiXSIsUyxWKSl9dj12Lmxlbmd0aCooenx8MSl9ZWxzZSBKPSIuYm9uZXNbIitjW0VdLm5hbWUrIl0iLGUoVGUsSisiLnBvc2l0aW9uIixGLCJwb3MiLGcpLGUoWmYsSisiLnF1YXRlcm5pb24iLEYsInJvdCIsZyksZShUZSxKKyIuc2NhbGUiLEYsInNjbCIsZyl9cmV0dXJuIDA9PT1nLmxlbmd0aD9udWxsOm5ldyB0YyhyLHYsZyl9fSk7T2JqZWN0LmFzc2lnbih0Yy5wcm90b3R5cGUse3Jlc2V0RHVyYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPTAsZT10aGlzLnRyYWNrcy5sZW5ndGg7YyE9PWU7KytjKXt2YXIgZz10aGlzLnRyYWNrc1tjXTthPU1hdGgubWF4KGEsZy50aW1lc1tnLnRpbWVzLmxlbmd0aC0xXSl9dGhpcy5kdXJhdGlvbj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnRyYWNrcy5sZW5ndGg7YSsrKXRoaXMudHJhY2tzW2FdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiEwLGM9MDtjPHRoaXMudHJhY2tzLmxlbmd0aDtjKyspYT1hJiZ0aGlzLnRyYWNrc1tjXS52YWxpZGF0ZSgpO3JldHVybiBhfSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy50cmFja3MubGVuZ3RoO2ErKyl0aGlzLnRyYWNrc1thXS5vcHRpbWl6ZSgpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7Yzx0aGlzLnRyYWNrcy5sZW5ndGg7YysrKWEucHVzaCh0aGlzLnRyYWNrc1tjXS5jbG9uZSgpKTtyZXR1cm4gbmV3IHRjKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLGEpfX0pO3ZhciBpZT17ZW5hYmxlZDohMSxmaWxlczp7fSxhZGQ6ZnVuY3Rpb24oYSxjKXshMSE9PXRoaXMuZW5hYmxlZCYmKHRoaXMuZmlsZXNbYV09Yyl9LGdldDpmdW5jdGlvbihhKXtpZighMSE9PXRoaXMuZW5hYmxlZClyZXR1cm4gdGhpcy5maWxlc1thXX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2RlbGV0ZSB0aGlzLmZpbGVzW2FdfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuZmlsZXM9Cnt9fX0sT2o9bmV3ICRoO09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtsb2FkOmZ1bmN0aW9uKCl7fSxwYXJzZTpmdW5jdGlvbigpe30sc2V0Q3Jvc3NPcmlnaW46ZnVuY3Rpb24oYSl7dGhpcy5jcm9zc09yaWdpbj1hO3JldHVybiB0aGlzfSxzZXRQYXRoOmZ1bmN0aW9uKGEpe3RoaXMucGF0aD1hO3JldHVybiB0aGlzfSxzZXRSZXNvdXJjZVBhdGg6ZnVuY3Rpb24oYSl7dGhpcy5yZXNvdXJjZVBhdGg9YTtyZXR1cm4gdGhpc319KTtEYi5IYW5kbGVycz17aGFuZGxlcnM6W10sYWRkOmZ1bmN0aW9uKGEsYyl7dGhpcy5oYW5kbGVycy5wdXNoKGEsYyl9LGdldDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5oYW5kbGVycyxlPTAsZz1jLmxlbmd0aDtlPGc7ZSs9Mil7dmFyIHI9Y1tlKzFdO2lmKGNbZV0udGVzdChhKSlyZXR1cm4gcn1yZXR1cm4gbnVsbH19O3ZhciBLYz17fTt1Yy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVjLApsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtpZih2b2lkIDAhPT1LY1thXSlLY1thXS5wdXNoKHtvbkxvYWQ6YyxvblByb2dyZXNzOmUsb25FcnJvcjpnfSk7ZWxzZXt2YXIgej1hLm1hdGNoKC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvKTtpZih6KXtlPXpbMV07dmFyIEU9ISF6WzJdO3o9elszXTt6PWRlY29kZVVSSUNvbXBvbmVudCh6KTtFJiYoej1hdG9iKHopKTt0cnl7dmFyIEY9KHRoaXMucmVzcG9uc2VUeXBlfHwiIikudG9Mb3dlckNhc2UoKTtzd2l0Y2goRil7Y2FzZSAiYXJyYXlidWZmZXIiOmNhc2UgImJsb2IiOnZhciBKPQpuZXcgVWludDhBcnJheSh6Lmxlbmd0aCk7Zm9yKEU9MDtFPHoubGVuZ3RoO0UrKylKW0VdPXouY2hhckNvZGVBdChFKTt2YXIgUD0iYmxvYiI9PT1GP25ldyBCbG9iKFtKLmJ1ZmZlcl0se3R5cGU6ZX0pOkouYnVmZmVyO2JyZWFrO2Nhc2UgImRvY3VtZW50IjpQPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoeixlKTticmVhaztjYXNlICJqc29uIjpQPUpTT04ucGFyc2Uoeik7YnJlYWs7ZGVmYXVsdDpQPXp9c2V0VGltZW91dChmdW5jdGlvbigpe2MmJmMoUCk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfWNhdGNoKFMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnJiZnKFMpO3IubWFuYWdlci5pdGVtRXJyb3IoYSk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfX1lbHNle0tjW2FdPVtdO0tjW2FdLnB1c2goe29uTG9hZDpjLG9uUHJvZ3Jlc3M6ZSxvbkVycm9yOmd9KTt2YXIgUj1uZXcgWE1MSHR0cFJlcXVlc3Q7Ui5vcGVuKCJHRVQiLGEsITApO1IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsCmZ1bmN0aW9uKFMpe3ZhciBWPXRoaXMucmVzcG9uc2U7aWUuYWRkKGEsVik7dmFyIFc9S2NbYV07ZGVsZXRlIEtjW2FdO2lmKDIwMD09PXRoaXMuc3RhdHVzfHwwPT09dGhpcy5zdGF0dXMpezA9PT10aGlzLnN0YXR1cyYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpO2Zvcih2YXIgaGE9MCxmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKXt2YXIgcmE9V1toYV07aWYocmEub25Mb2FkKXJhLm9uTG9hZChWKX19ZWxzZXtoYT0wO2ZvcihmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKWlmKHJhPVdbaGFdLHJhLm9uRXJyb3IpcmEub25FcnJvcihTKTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpfXIubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZnVuY3Rpb24oUyl7Zm9yKHZhciBWPUtjW2FdLFc9MCxoYT1WLmxlbmd0aDtXPGhhO1crKyl7dmFyIGZhPVZbV107aWYoZmEub25Qcm9ncmVzcylmYS5vblByb2dyZXNzKFMpfX0sCiExKTtSLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihTKXt2YXIgVj1LY1thXTtkZWxldGUgS2NbYV07Zm9yKHZhciBXPTAsaGE9Vi5sZW5ndGg7VzxoYTtXKyspe3ZhciBmYT1WW1ddO2lmKGZhLm9uRXJyb3IpZmEub25FcnJvcihTKX1yLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsZnVuY3Rpb24oUyl7dmFyIFY9S2NbYV07ZGVsZXRlIEtjW2FdO2Zvcih2YXIgVz0wLGhhPVYubGVuZ3RoO1c8aGE7VysrKXt2YXIgZmE9VltXXTtpZihmYS5vbkVycm9yKWZhLm9uRXJyb3IoUyl9ci5tYW5hZ2VyLml0ZW1FcnJvcihhKTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO3ZvaWQgMCE9PXRoaXMucmVzcG9uc2VUeXBlJiYoUi5yZXNwb25zZVR5cGU9dGhpcy5yZXNwb25zZVR5cGUpO3ZvaWQgMCE9PXRoaXMud2l0aENyZWRlbnRpYWxzJiYoUi53aXRoQ3JlZGVudGlhbHM9dGhpcy53aXRoQ3JlZGVudGlhbHMpOwpSLm92ZXJyaWRlTWltZVR5cGUmJlIub3ZlcnJpZGVNaW1lVHlwZSh2b2lkIDAhPT10aGlzLm1pbWVUeXBlP3RoaXMubWltZVR5cGU6InRleHQvcGxhaW4iKTtmb3IoRSBpbiB0aGlzLnJlcXVlc3RIZWFkZXIpUi5zZXRSZXF1ZXN0SGVhZGVyKEUsdGhpcy5yZXF1ZXN0SGVhZGVyW0VdKTtSLnNlbmQobnVsbCl9ci5tYW5hZ2VyLml0ZW1TdGFydChhKTtyZXR1cm4gUn19LHNldFJlc3BvbnNlVHlwZTpmdW5jdGlvbihhKXt0aGlzLnJlc3BvbnNlVHlwZT1hO3JldHVybiB0aGlzfSxzZXRXaXRoQ3JlZGVudGlhbHM6ZnVuY3Rpb24oYSl7dGhpcy53aXRoQ3JlZGVudGlhbHM9YTtyZXR1cm4gdGhpc30sc2V0TWltZVR5cGU6ZnVuY3Rpb24oYSl7dGhpcy5taW1lVHlwZT1hO3JldHVybiB0aGlzfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEpe3RoaXMucmVxdWVzdEhlYWRlcj1hO3JldHVybiB0aGlzfX0pO2FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmFpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBnPXRjLnBhcnNlKGFbZV0pO2MucHVzaChnKX1yZXR1cm4gY319KTtiaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmJpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7ZnVuY3Rpb24gcihTKXtGLmxvYWQoYVtTXSxmdW5jdGlvbihWKXtWPXYuX3BhcnNlcihWLCEwKTt6W1NdPXt3aWR0aDpWLndpZHRoLGhlaWdodDpWLmhlaWdodCxmb3JtYXQ6Vi5mb3JtYXQsbWlwbWFwczpWLm1pcG1hcHN9O0orPTE7Nj09PUomJigxPT09Vi5taXBtYXBDb3VudCYmKEUubWluRmlsdGVyPQoxMDA2KSxFLmZvcm1hdD1WLmZvcm1hdCxFLm5lZWRzVXBkYXRlPSEwLGMmJmMoRSkpfSxlLGcpfXZhciB2PXRoaXMsej1bXSxFPW5ldyBEZTtFLmltYWdlPXo7dmFyIEY9bmV3IHVjKHRoaXMubWFuYWdlcik7Ri5zZXRQYXRoKHRoaXMucGF0aCk7Ri5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIEo9MCxQPTAsUj1hLmxlbmd0aDtQPFI7KytQKXIoUCk7ZWxzZSBGLmxvYWQoYSxmdW5jdGlvbihTKXtTPXYuX3BhcnNlcihTLCEwKTtpZihTLmlzQ3ViZW1hcClmb3IodmFyIFY9Uy5taXBtYXBzLmxlbmd0aC9TLm1pcG1hcENvdW50LFc9MDtXPFY7VysrKXt6W1ddPXttaXBtYXBzOltdfTtmb3IodmFyIGhhPTA7aGE8Uy5taXBtYXBDb3VudDtoYSsrKXpbV10ubWlwbWFwcy5wdXNoKFMubWlwbWFwc1tXKlMubWlwbWFwQ291bnQraGFdKSx6W1ddLmZvcm1hdD1TLmZvcm1hdCx6W1ddLndpZHRoPVMud2lkdGgseltXXS5oZWlnaHQ9Uy5oZWlnaHR9ZWxzZSBFLmltYWdlLndpZHRoPQpTLndpZHRoLEUuaW1hZ2UuaGVpZ2h0PVMuaGVpZ2h0LEUubWlwbWFwcz1TLm1pcG1hcHM7MT09PVMubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0xMDA2KTtFLmZvcm1hdD1TLmZvcm1hdDtFLm5lZWRzVXBkYXRlPSEwO2MmJmMoRSl9LGUsZyk7cmV0dXJuIEV9fSk7S2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpLZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgQWIsej1uZXcgdWModGhpcy5tYW5hZ2VyKTt6LnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKTt6LnNldFBhdGgodGhpcy5wYXRoKTt6LmxvYWQoYSxmdW5jdGlvbihFKXtpZihFPXIuX3BhcnNlcihFKSl2b2lkIDAhPT1FLmltYWdlP3YuaW1hZ2U9RS5pbWFnZTp2b2lkIDAhPT1FLmRhdGEmJih2LmltYWdlLndpZHRoPUUud2lkdGgsdi5pbWFnZS5oZWlnaHQ9RS5oZWlnaHQsdi5pbWFnZS5kYXRhPUUuZGF0YSksdi53cmFwUz0Kdm9pZCAwIT09RS53cmFwUz9FLndyYXBTOjEwMDEsdi53cmFwVD12b2lkIDAhPT1FLndyYXBUP0Uud3JhcFQ6MTAwMSx2Lm1hZ0ZpbHRlcj12b2lkIDAhPT1FLm1hZ0ZpbHRlcj9FLm1hZ0ZpbHRlcjoxMDA2LHYubWluRmlsdGVyPXZvaWQgMCE9PUUubWluRmlsdGVyP0UubWluRmlsdGVyOjEwMDgsdi5hbmlzb3Ryb3B5PXZvaWQgMCE9PUUuYW5pc290cm9weT9FLmFuaXNvdHJvcHk6MSx2b2lkIDAhPT1FLmZvcm1hdCYmKHYuZm9ybWF0PUUuZm9ybWF0KSx2b2lkIDAhPT1FLnR5cGUmJih2LnR5cGU9RS50eXBlKSx2b2lkIDAhPT1FLm1pcG1hcHMmJih2Lm1pcG1hcHM9RS5taXBtYXBzKSwxPT09RS5taXBtYXBDb3VudCYmKHYubWluRmlsdGVyPTEwMDYpLHYubmVlZHNVcGRhdGU9ITAsYyYmYyh2LEUpfSxlLGcpO3JldHVybiB2fX0pO1VlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VWUsbG9hZDpmdW5jdGlvbihhLApjLGUsZyl7ZnVuY3Rpb24gcigpe0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7aWUuYWRkKGEsdGhpcyk7YyYmYyh0aGlzKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX1mdW5jdGlvbiB2KEope0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7ZyYmZyhKKTt6Lm1hbmFnZXIuaXRlbUVycm9yKGEpO3oubWFuYWdlci5pdGVtRW5kKGEpfXZvaWQgMCE9PXRoaXMucGF0aCYmKGE9dGhpcy5wYXRoK2EpO2E9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoYSk7dmFyIHo9dGhpcyxFPWllLmdldChhKTtpZih2b2lkIDAhPT1FKXJldHVybiB6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjJiZjKEUpO3oubWFuYWdlci5pdGVtRW5kKGEpfSwwKSxFO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJpbWciKTtGLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHIsITEpO0YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpOyJkYXRhOiIhPT1hLnN1YnN0cigwLDUpJiZ2b2lkIDAhPT10aGlzLmNyb3NzT3JpZ2luJiYoRi5jcm9zc09yaWdpbj10aGlzLmNyb3NzT3JpZ2luKTt6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpO0Yuc3JjPWE7cmV0dXJuIEZ9fSk7TGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe2Z1bmN0aW9uIHIoRil7ei5sb2FkKGFbRl0sZnVuY3Rpb24oSil7di5pbWFnZXNbRl09SjtFKys7Nj09PUUmJih2Lm5lZWRzVXBkYXRlPSEwLGMmJmModikpfSx2b2lkIDAsZyl9dmFyIHY9bmV3IGNkLHo9bmV3IFVlKHRoaXMubWFuYWdlcik7ei5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt6LnNldFBhdGgodGhpcy5wYXRoKTt2YXIgRT0wO2ZvcihlPQowO2U8YS5sZW5ndGg7KytlKXIoZSk7cmV0dXJuIHZ9fSk7TWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpNZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPW5ldyBsLHY9bmV3IFVlKHRoaXMubWFuYWdlcik7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt2LnNldFBhdGgodGhpcy5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtyLmltYWdlPXo7ej0wPGEuc2VhcmNoKC9cLmpwZT9nKCR8XD8pL2kpfHwwPT09YS5zZWFyY2goL15kYXRhOmltYWdlXC9qcGVnLyk7ci5mb3JtYXQ9ej8xMDIyOjEwMjM7ci5uZWVkc1VwZGF0ZT0hMDt2b2lkIDAhPT1jJiZjKHIpfSxlLGcpO3JldHVybiByfX0pO09iamVjdC5hc3NpZ24oWmEucHJvdG90eXBlLHtnZXRQb2ludDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKTtyZXR1cm4gbnVsbH0sCmdldFBvaW50QXQ6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX0sZ2V0UG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTUpO2Zvcih2YXIgYz1bXSxlPTA7ZTw9YTtlKyspYy5wdXNoKHRoaXMuZ2V0UG9pbnQoZS9hKSk7cmV0dXJuIGN9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT01KTtmb3IodmFyIGM9W10sZT0wO2U8PWE7ZSsrKWMucHVzaCh0aGlzLmdldFBvaW50QXQoZS9hKSk7cmV0dXJuIGN9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiBhW2EubGVuZ3RoLTFdfSxnZXRMZW5ndGhzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKTtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09YSsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7CnRoaXMubmVlZHNVcGRhdGU9ITE7dmFyIGM9W10sZT10aGlzLmdldFBvaW50KDApLGcscj0wO2MucHVzaCgwKTtmb3IoZz0xO2c8PWE7ZysrKXt2YXIgdj10aGlzLmdldFBvaW50KGcvYSk7cis9di5kaXN0YW5jZVRvKGUpO2MucHVzaChyKTtlPXZ9cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzPWN9LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuZ2V0TGVuZ3RocygpfSxnZXRVdG9UbWFwcGluZzpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2V0TGVuZ3RocygpLGc9ZS5sZW5ndGg7Yz1jP2M6YSplW2ctMV07Zm9yKHZhciByPTAsdj1nLTEsejtyPD12OylpZihhPU1hdGguZmxvb3Iocisodi1yKS8yKSx6PWVbYV0tYywwPnopcj1hKzE7ZWxzZSBpZigwPHopdj1hLTE7ZWxzZXt2PWE7YnJlYWt9YT12O2lmKGVbYV09PT1jKXJldHVybiBhLyhnLTEpO3I9ZVthXTtyZXR1cm4oYSsoYy1yKS8oZVthKzFdLXIpKS8oZy0xKX0sZ2V0VGFuZ2VudDpmdW5jdGlvbihhKXt2YXIgYz0KYS0xRS00O2ErPTFFLTQ7MD5jJiYoYz0wKTsxPGEmJihhPTEpO2M9dGhpcy5nZXRQb2ludChjKTtyZXR1cm4gdGhpcy5nZXRQb2ludChhKS5jbG9uZSgpLnN1YihjKS5ub3JtYWxpemUoKX0sZ2V0VGFuZ2VudEF0OmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRVdG9UbWFwcGluZyhhKTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KGEpfSxjb21wdXRlRnJlbmV0RnJhbWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGssZz1bXSxyPVtdLHY9W10sej1uZXcgayxFPW5ldyBxLEY7Zm9yKEY9MDtGPD1hO0YrKyl7dmFyIEo9Ri9hO2dbRl09dGhpcy5nZXRUYW5nZW50QXQoSik7Z1tGXS5ub3JtYWxpemUoKX1yWzBdPW5ldyBrO3ZbMF09bmV3IGs7Rj1OdW1iZXIuTUFYX1ZBTFVFO0o9TWF0aC5hYnMoZ1swXS54KTt2YXIgUD1NYXRoLmFicyhnWzBdLnkpLFI9TWF0aC5hYnMoZ1swXS56KTtKPD1GJiYoRj1KLGUuc2V0KDEsMCwwKSk7UDw9RiYmKEY9UCxlLnNldCgwLDEsMCkpO1I8PUYmJmUuc2V0KDAsCjAsMSk7ei5jcm9zc1ZlY3RvcnMoZ1swXSxlKS5ub3JtYWxpemUoKTtyWzBdLmNyb3NzVmVjdG9ycyhnWzBdLHopO3ZbMF0uY3Jvc3NWZWN0b3JzKGdbMF0sclswXSk7Zm9yKEY9MTtGPD1hO0YrKylyW0ZdPXJbRi0xXS5jbG9uZSgpLHZbRl09dltGLTFdLmNsb25lKCksei5jcm9zc1ZlY3RvcnMoZ1tGLTFdLGdbRl0pLHoubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04mJih6Lm5vcm1hbGl6ZSgpLGU9TWF0aC5hY29zKGhiLmNsYW1wKGdbRi0xXS5kb3QoZ1tGXSksLTEsMSkpLHJbRl0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyh6LGUpKSksdltGXS5jcm9zc1ZlY3RvcnMoZ1tGXSxyW0ZdKTtpZighMD09PWMpZm9yKGU9TWF0aC5hY29zKGhiLmNsYW1wKHJbMF0uZG90KHJbYV0pLC0xLDEpKSxlLz1hLDA8Z1swXS5kb3Qoei5jcm9zc1ZlY3RvcnMoclswXSxyW2FdKSkmJihlPS1lKSxGPTE7Rjw9YTtGKyspcltGXS5hcHBseU1hdHJpeDQoRS5tYWtlUm90YXRpb25BeGlzKGdbRl0sCmUqRikpLHZbRl0uY3Jvc3NWZWN0b3JzKGdbRl0scltGXSk7cmV0dXJue3RhbmdlbnRzOmcsbm9ybWFsczpyLGJpbm9ybWFsczp2fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YS5hcmNMZW5ndGhEaXZpc2lvbnM7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O2EuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO2EudHlwZT10aGlzLnR5cGU7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWEuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfX0pO3BjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7cGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpwYztwYy5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmU9ITA7cGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgZjtmb3IodmFyIGU9MipNYXRoLlBJLGc9dGhpcy5hRW5kQW5nbGUtdGhpcy5hU3RhcnRBbmdsZSxyPU1hdGguYWJzKGcpPE51bWJlci5FUFNJTE9OOzA+ZzspZys9ZTtmb3IoO2c+ZTspZy09ZTtnPE51bWJlci5FUFNJTE9OJiYoZz1yPzA6ZSk7ITAhPT10aGlzLmFDbG9ja3dpc2V8fHJ8fChnPWc9PT1lPy1lOmctZSk7ZT10aGlzLmFTdGFydEFuZ2xlK2EqZzthPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGUpO3ZhciB2PXRoaXMuYVkrdGhpcy55UmFkaXVzKk1hdGguc2luKGUpOzAhPT10aGlzLmFSb3RhdGlvbiYmKGU9TWF0aC5jb3ModGhpcy5hUm90YXRpb24pLGc9TWF0aC5zaW4odGhpcy5hUm90YXRpb24pLHI9YS10aGlzLmFYLHYtPXRoaXMuYVksYT1yKmUtdipnK3RoaXMuYVgsdj1yKmcrdiplK3RoaXMuYVkpO3JldHVybiBjLnNldChhLAp2KX07cGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYVg9YS5hWDt0aGlzLmFZPWEuYVk7dGhpcy54UmFkaXVzPWEueFJhZGl1czt0aGlzLnlSYWRpdXM9YS55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9YS5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1hLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9YS5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWEuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtwYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuYVg9dGhpcy5hWDthLmFZPXRoaXMuYVk7YS54UmFkaXVzPXRoaXMueFJhZGl1czthLnlSYWRpdXM9dGhpcy55UmFkaXVzO2EuYVN0YXJ0QW5nbGU9dGhpcy5hU3RhcnRBbmdsZTthLmFFbmRBbmdsZT10aGlzLmFFbmRBbmdsZTthLmFDbG9ja3dpc2U9dGhpcy5hQ2xvY2t3aXNlO2EuYVJvdGF0aW9uPQp0aGlzLmFSb3RhdGlvbjtyZXR1cm4gYX07cGMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5hWD1hLmFYO3RoaXMuYVk9YS5hWTt0aGlzLnhSYWRpdXM9YS54UmFkaXVzO3RoaXMueVJhZGl1cz1hLnlSYWRpdXM7dGhpcy5hU3RhcnRBbmdsZT1hLmFTdGFydEFuZ2xlO3RoaXMuYUVuZEFuZ2xlPWEuYUVuZEFuZ2xlO3RoaXMuYUNsb2Nrd2lzZT1hLmFDbG9ja3dpc2U7dGhpcy5hUm90YXRpb249YS5hUm90YXRpb247cmV0dXJuIHRoaXN9O1ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHBjLnByb3RvdHlwZSk7VmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVZlO1ZlLnByb3RvdHlwZS5pc0FyY0N1cnZlPSEwO3ZhciB4aD1uZXcgayxMaT1uZXcgY2ksTWk9bmV3IGNpLE5pPW5ldyBjaTtaYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1piLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aYjsKWmIucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtaYi5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMucG9pbnRzLGc9ZS5sZW5ndGg7YSo9Zy0odGhpcy5jbG9zZWQ/MDoxKTt2YXIgcj1NYXRoLmZsb29yKGEpO2EtPXI7dGhpcy5jbG9zZWQ/cis9MDxyPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMocikvZykrMSkqZzowPT09YSYmcj09PWctMSYmKHI9Zy0yLGE9MSk7aWYodGhpcy5jbG9zZWR8fDA8cil2YXIgdj1lWyhyLTEpJWddO2Vsc2UgeGguc3ViVmVjdG9ycyhlWzBdLGVbMV0pLmFkZChlWzBdKSx2PXhoO3ZhciB6PWVbciVnXTt2YXIgRT1lWyhyKzEpJWddO3RoaXMuY2xvc2VkfHxyKzI8Zz9lPWVbKHIrMiklZ106KHhoLnN1YlZlY3RvcnMoZVtnLTFdLGVbZy0yXSkuYWRkKGVbZy0xXSksZT14aCk7aWYoImNlbnRyaXBldGFsIj09PXRoaXMuY3VydmVUeXBlfHwiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZSl7dmFyIEY9CiJjaG9yZGFsIj09PXRoaXMuY3VydmVUeXBlPy41Oi4yNTtnPU1hdGgucG93KHYuZGlzdGFuY2VUb1NxdWFyZWQoeiksRik7cj1NYXRoLnBvdyh6LmRpc3RhbmNlVG9TcXVhcmVkKEUpLEYpO0Y9TWF0aC5wb3coRS5kaXN0YW5jZVRvU3F1YXJlZChlKSxGKTsxRS00PnImJihyPTEpOzFFLTQ+ZyYmKGc9cik7MUUtND5GJiYoRj1yKTtMaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi54LHoueCxFLngsZS54LGcscixGKTtNaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi55LHoueSxFLnksZS55LGcscixGKTtOaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi56LHoueixFLnosZS56LGcscixGKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihMaS5pbml0Q2F0bXVsbFJvbSh2Lngsei54LEUueCxlLngsdGhpcy50ZW5zaW9uKSxNaS5pbml0Q2F0bXVsbFJvbSh2Lnksei55LEUueSxlLnksdGhpcy50ZW5zaW9uKSxOaS5pbml0Q2F0bXVsbFJvbSh2Lnosei56LEUueiwKZS56LHRoaXMudGVuc2lvbikpO2Muc2V0KExpLmNhbGMoYSksTWkuY2FsYyhhKSxOaS5jYWxjKGEpKTtyZXR1cm4gY307WmIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9YS5wb2ludHMubGVuZ3RoO2M8ZTtjKyspdGhpcy5wb2ludHMucHVzaChhLnBvaW50c1tjXS5jbG9uZSgpKTt0aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtaYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO2EuY2xvc2VkPXRoaXMuY2xvc2VkO2EuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlOwphLnRlbnNpb249dGhpcy50ZW5zaW9uO3JldHVybiBhfTtaYi5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgaykuZnJvbUFycmF5KGcpKX10aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtDYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0NjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1DYztDYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO0NjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyLHY9dGhpcy52MztjLnNldChhZyhhLAplLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSk7cmV0dXJuIGN9O0NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTt0aGlzLnYzLmNvcHkoYS52Myk7cmV0dXJuIHRoaXN9O0NjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7YS52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYX07Q2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7CnRoaXMudjMuZnJvbUFycmF5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1RjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UYztUYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlMz0hMDtUYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52Mix2PXRoaXMudjM7Yy5zZXQoYWcoYSxlLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSxhZyhhLGUueixnLnosci56LHYueikpO3JldHVybiBjfTtUYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7dGhpcy52My5jb3B5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9ClphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnYwPXRoaXMudjAudG9BcnJheSgpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTthLnYzPXRoaXMudjMudG9BcnJheSgpO3JldHVybiBhfTtUYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTt0aGlzLnYzLmZyb21BcnJheShhLnYzKTtyZXR1cm4gdGhpc307a2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtrYy5wcm90b3R5cGUuY29uc3RydWN0b3I9a2M7a2MucHJvdG90eXBlLmlzTGluZUN1cnZlPSEwO2tjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7MT09PWE/Yy5jb3B5KHRoaXMudjIpOihjLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLApjLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnYxKSk7cmV0dXJuIGN9O2tjLnByb3RvdHlwZS5nZXRQb2ludEF0PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX07a2MucHJvdG90eXBlLmdldFRhbmdlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52Mi5jbG9uZSgpLnN1Yih0aGlzLnYxKS5ub3JtYWxpemUoKX07a2MucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O2tjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtrYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0RjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPURjO0RjLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTM9ITA7RGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazsxPT09YT9jLmNvcHkodGhpcy52Mik6KGMuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksYy5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy52MSkpO3JldHVybiBjfTtEYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9O0RjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtEYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpOwphLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0RjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FYztFYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtFYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52MjtjLnNldCgkZihhLGUueCxnLngsci54KSwkZihhLGUueSxnLnksci55KSk7cmV0dXJuIGN9O0VjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7CnRoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O0VjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0VjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjAuZnJvbUFycmF5KGEudjApO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYztVYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITA7VWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHwKbmV3IGs7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyO2Muc2V0KCRmKGEsZS54LGcueCxyLngpLCRmKGEsZS55LGcueSxyLnkpLCRmKGEsZS56LGcueixyLnopKTtyZXR1cm4gY307VWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjAuY29weShhLnYwKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtVYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0ZjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZjO0ZjLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO0ZjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy5wb2ludHMsZz0oZS5sZW5ndGgtMSkqYTthPU1hdGguZmxvb3IoZyk7Zy09YTt2YXIgcj1lWzA9PT1hP2E6YS0xXSx2PWVbYV0sej1lW2E+ZS5sZW5ndGgtMj9lLmxlbmd0aC0xOmErMV07ZT1lW2E+ZS5sZW5ndGgtMz9lLmxlbmd0aC0xOmErMl07Yy5zZXQoUGooZyxyLngsdi54LHoueCxlLngpLFBqKGcsci55LHYueSx6LnksZS55KSk7cmV0dXJuIGN9O0ZjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPAplO2MrKyl0aGlzLnBvaW50cy5wdXNoKGEucG9pbnRzW2NdLmNsb25lKCkpO3JldHVybiB0aGlzfTtGYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO3JldHVybiBhfTtGYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgZikuZnJvbUFycmF5KGcpKX1yZXR1cm4gdGhpc307dmFyIE9pPU9iamVjdC5mcmVlemUoe0FyY0N1cnZlOlZlLENhdG11bGxSb21DdXJ2ZTM6WmIsQ3ViaWNCZXppZXJDdXJ2ZTpDYyxDdWJpY0JlemllckN1cnZlMzpUYywKRWxsaXBzZUN1cnZlOnBjLExpbmVDdXJ2ZTprYyxMaW5lQ3VydmUzOkRjLFF1YWRyYXRpY0JlemllckN1cnZlOkVjLFF1YWRyYXRpY0JlemllckN1cnZlMzpVYyxTcGxpbmVDdXJ2ZTpGY30pO2dkLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Z2QsYWRkOmZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzLnB1c2goYSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGM9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO2EuZXF1YWxzKGMpfHx0aGlzLmN1cnZlcy5wdXNoKG5ldyBrYyhjLGEpKX0sZ2V0UG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9YSp0aGlzLmdldExlbmd0aCgpLGU9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtmb3IoYT0wO2E8ZS5sZW5ndGg7KXtpZihlW2FdPj1jKXJldHVybiBjPWVbYV0tYyxhPXRoaXMuY3VydmVzW2FdLGU9CmEuZ2V0TGVuZ3RoKCksYS5nZXRQb2ludEF0KDA9PT1lPzA6MS1jL2UpO2ErK31yZXR1cm4gbnVsbH0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sdXBkYXRlQXJjTGVuZ3RoczpmdW5jdGlvbigpe3RoaXMubmVlZHNVcGRhdGU9ITA7dGhpcy5jYWNoZUxlbmd0aHM9bnVsbDt0aGlzLmdldEN1cnZlTGVuZ3RocygpfSxnZXRDdXJ2ZUxlbmd0aHM6ZnVuY3Rpb24oKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztmb3IodmFyIGE9W10sYz0wLGU9MCxnPXRoaXMuY3VydmVzLmxlbmd0aDtlPGc7ZSsrKWMrPXRoaXMuY3VydmVzW2VdLmdldExlbmd0aCgpLGEucHVzaChjKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9YX0sZ2V0U3BhY2VkUG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoYT00MCk7Zm9yKHZhciBjPVtdLGU9MDtlPD1hO2UrKyljLnB1c2godGhpcy5nZXRQb2ludChlL2EpKTt0aGlzLmF1dG9DbG9zZSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxnZXRQb2ludHM6ZnVuY3Rpb24oYSl7YT1hfHwxMjtmb3IodmFyIGM9W10sZSxnPTAscj10aGlzLmN1cnZlcztnPHIubGVuZ3RoO2crKyl7dmFyIHY9cltnXTt2PXYuZ2V0UG9pbnRzKHYmJnYuaXNFbGxpcHNlQ3VydmU/MiphOnYmJih2LmlzTGluZUN1cnZlfHx2LmlzTGluZUN1cnZlMyk/MTp2JiZ2LmlzU3BsaW5lQ3VydmU/YSp2LnBvaW50cy5sZW5ndGg6YSk7Zm9yKHZhciB6PTA7ejx2Lmxlbmd0aDt6Kyspe3ZhciBFPXZbel07ZSYmZS5lcXVhbHMoRSl8fChjLnB1c2goRSksZT1FKX19dGhpcy5hdXRvQ2xvc2UmJjE8Yy5sZW5ndGgmJiFjW2MubGVuZ3RoLTFdLmVxdWFscyhjWzBdKSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxjb3B5OmZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT1hLmN1cnZlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmN1cnZlcy5wdXNoKGEuY3VydmVzW2NdLmNsb25lKCkpO3RoaXMuYXV0b0Nsb3NlPWEuYXV0b0Nsb3NlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2U7YS5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmN1cnZlcy5sZW5ndGg7YzxlO2MrKylhLmN1cnZlcy5wdXNoKHRoaXMuY3VydmVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmF1dG9DbG9zZT1hLmF1dG9DbG9zZTt0aGlzLmN1cnZlcz1bXTtmb3IodmFyIGM9MCxlPWEuY3VydmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmN1cnZlc1tjXTt0aGlzLmN1cnZlcy5wdXNoKChuZXcgT2lbZy50eXBlXSkuZnJvbUpTT04oZykpfXJldHVybiB0aGlzfX0pOwpHYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGdkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkdjLHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlVG8oYVswXS54LGFbMF0ueSk7Zm9yKHZhciBjPTEsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMubGluZVRvKGFbY10ueCxhW2NdLnkpfSxtb3ZlVG86ZnVuY3Rpb24oYSxjKXt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0sbGluZVRvOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGtjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSk7dGhpcy5jdXJ2ZXMucHVzaChlKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbihhLGMsZSxnKXthPW5ldyBFYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYyksbmV3IGYoZSxnKSk7dGhpcy5jdXJ2ZXMucHVzaChhKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoZSxnKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihhLApjLGUsZyxyLHYpe2E9bmV3IENjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSxuZXcgZihlLGcpLG5ldyBmKHIsdikpO3RoaXMuY3VydmVzLnB1c2goYSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsdil9LHNwbGluZVRocnU6ZnVuY3Rpb24oYSl7dmFyIGM9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChhKTtjPW5ldyBGYyhjKTt0aGlzLmN1cnZlcy5wdXNoKGMpO3RoaXMuY3VycmVudFBvaW50LmNvcHkoYVthLmxlbmd0aC0xXSl9LGFyYzpmdW5jdGlvbihhLGMsZSxnLHIsdil7dGhpcy5hYnNhcmMoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSxlLGcscix2KX0sYWJzYXJjOmZ1bmN0aW9uKGEsYyxlLGcscix2KXt0aGlzLmFic2VsbGlwc2UoYSxjLGUsZSxnLHIsdil9LGVsbGlwc2U6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmFic2VsbGlwc2UoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSwKZSxnLHIsdix6LEUpfSxhYnNlbGxpcHNlOmZ1bmN0aW9uKGEsYyxlLGcscix2LHosRSl7YT1uZXcgcGMoYSxjLGUsZyxyLHYseixFKTswPHRoaXMuY3VydmVzLmxlbmd0aCYmKGM9YS5nZXRQb2ludCgwKSxjLmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKGMueCxjLnkpKTt0aGlzLmN1cnZlcy5wdXNoKGEpO2E9YS5nZXRQb2ludCgxKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEpfSxjb3B5OmZ1bmN0aW9uKGEpe2dkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEuY3VycmVudFBvaW50KTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9Z2QucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7Z2QucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoYS5jdXJyZW50UG9pbnQpOwpyZXR1cm4gdGhpc319KTtDZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEdjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNkLGdldFBvaW50c0hvbGVzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz10aGlzLmhvbGVzLmxlbmd0aDtlPGc7ZSsrKWNbZV09dGhpcy5ob2xlc1tlXS5nZXRQb2ludHMoYSk7cmV0dXJuIGN9LGV4dHJhY3RQb2ludHM6ZnVuY3Rpb24oYSl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKGEpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXMoYSl9fSxjb3B5OmZ1bmN0aW9uKGEpe0djLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9YS5ob2xlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmhvbGVzLnB1c2goYS5ob2xlc1tjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9R2MucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudXVpZD10aGlzLnV1aWQ7CmEuaG9sZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmhvbGVzLmxlbmd0aDtjPGU7YysrKWEuaG9sZXMucHVzaCh0aGlzLmhvbGVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7R2MucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9YS51dWlkO3RoaXMuaG9sZXM9W107Zm9yKHZhciBjPTAsZT1hLmhvbGVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmhvbGVzW2NdO3RoaXMuaG9sZXMucHVzaCgobmV3IEdjKS5mcm9tSlNPTihnKSl9cmV0dXJuIHRoaXN9fSk7SmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpiLGlzTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5pbnRlbnNpdHk9YS5pbnRlbnNpdHk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPQpBLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCk7YS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5O3ZvaWQgMCE9PXRoaXMuZ3JvdW5kQ29sb3ImJihhLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKTt2b2lkIDAhPT10aGlzLmRpc3RhbmNlJiYoYS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSk7dm9pZCAwIT09dGhpcy5hbmdsZSYmKGEub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpO3ZvaWQgMCE9PXRoaXMuZGVjYXkmJihhLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KTt2b2lkIDAhPT10aGlzLnBlbnVtYnJhJiYoYS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSk7dm9pZCAwIT09dGhpcy5zaGFkb3cmJihhLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpO3JldHVybiBhfX0pO05nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOk5nLGlzSGVtaXNwaGVyZUxpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JvdW5kQ29sb3IuY29weShhLmdyb3VuZENvbG9yKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFZjLnByb3RvdHlwZSx7X3Byb2pTY3JlZW5NYXRyaXg6bmV3IHEsX2xpZ2h0UG9zaXRpb25Xb3JsZDpuZXcgayxfbG9va1RhcmdldDpuZXcgayxnZXRWaWV3cG9ydENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnR9LGdldEZydXN0dW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX0sdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jYW1lcmEsZT10aGlzLm1hdHJpeCxnPXRoaXMuX3Byb2pTY3JlZW5NYXRyaXgscj10aGlzLl9sb29rVGFyZ2V0LHY9dGhpcy5fbGlnaHRQb3NpdGlvbldvcmxkO3Yuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpOwpjLnBvc2l0aW9uLmNvcHkodik7ci5zZXRGcm9tTWF0cml4UG9zaXRpb24oYS50YXJnZXQubWF0cml4V29ybGQpO2MubG9va0F0KHIpO2MudXBkYXRlTWF0cml4V29ybGQoKTtnLm11bHRpcGx5TWF0cmljZXMoYy5wcm9qZWN0aW9uTWF0cml4LGMubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoZyk7ZS5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSk7ZS5tdWx0aXBseShjLnByb2plY3Rpb25NYXRyaXgpO2UubXVsdGlwbHkoYy5tYXRyaXhXb3JsZEludmVyc2UpfSxnZXRWaWV3cG9ydDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW2FdfSxnZXRGcmFtZUV4dGVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuY2FtZXJhPWEuY2FtZXJhLmNsb25lKCk7dGhpcy5iaWFzPWEuYmlhczt0aGlzLnJhZGl1cz1hLnJhZGl1czt0aGlzLm1hcFNpemUuY29weShhLm1hcFNpemUpOwpyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXt9OzAhPT10aGlzLmJpYXMmJihhLmJpYXM9dGhpcy5iaWFzKTsxIT09dGhpcy5yYWRpdXMmJihhLnJhZGl1cz10aGlzLnJhZGl1cyk7aWYoNTEyIT09dGhpcy5tYXBTaXplLnh8fDUxMiE9PXRoaXMubWFwU2l6ZS55KWEubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpO2EuY2FtZXJhPXRoaXMuY2FtZXJhLnRvSlNPTighMSkub2JqZWN0O2RlbGV0ZSBhLmNhbWVyYS5tYXRyaXg7cmV0dXJuIGF9fSk7T2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpPZyxpc1Nwb3RMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5jYW1lcmEscj0yKmhiLlJBRDJERUcqYS5hbmdsZSx2PXRoaXMubWFwU2l6ZS53aWR0aC8KdGhpcy5tYXBTaXplLmhlaWdodCx6PWEuZGlzdGFuY2V8fGcuZmFyO2lmKHIhPT1nLmZvdnx8diE9PWcuYXNwZWN0fHx6IT09Zy5mYXIpZy5mb3Y9cixnLmFzcGVjdD12LGcuZmFyPXosZy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7VmMucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxhLGMsZSl9fSk7UGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpQZyxpc1Nwb3RMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmRpc3RhbmNlPWEuZGlzdGFuY2U7dGhpcy5hbmdsZT1hLmFuZ2xlO3RoaXMucGVudW1icmE9YS5wZW51bWJyYTt0aGlzLmRlY2F5PWEuZGVjYXk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2RpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmRpLGlzUG9pbnRMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7Yz10aGlzLmNhbWVyYTt2YXIgZz10aGlzLm1hdHJpeCxyPXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZCx2PXRoaXMuX2xvb2tUYXJnZXQsej10aGlzLl9wcm9qU2NyZWVuTWF0cml4O3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpO2MucG9zaXRpb24uY29weShyKTt2LmNvcHkoYy5wb3NpdGlvbik7di5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbZV0pO2MudXAuY29weSh0aGlzLl9jdWJlVXBzW2VdKTtjLmxvb2tBdCh2KTtjLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Zy5tYWtlVHJhbnNsYXRpb24oLXIueCwtci55LC1yLnopO3oubXVsdGlwbHlNYXRyaWNlcyhjLnByb2plY3Rpb25NYXRyaXgsYy5tYXRyaXhXb3JsZEludmVyc2UpO3RoaXMuX2ZydXN0dW0uc2V0RnJvbU1hdHJpeCh6KX19KTtRZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpRZyxpc1BvaW50TGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kaXN0YW5jZT1hLmRpc3RhbmNlO3RoaXMuZGVjYXk9YS5kZWNheTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoemIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YmcsaXNPcnRob2dyYXBoaWNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMubGVmdD1hLmxlZnQ7dGhpcy5yaWdodD1hLnJpZ2h0O3RoaXMudG9wPWEudG9wO3RoaXMuYm90dG9tPWEuYm90dG9tO3RoaXMubmVhcj1hLm5lYXI7dGhpcy5mYXI9YS5mYXI7dGhpcy56b29tPWEuem9vbTt0aGlzLnZpZXc9bnVsbD09PWEudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYS52aWV3KTtyZXR1cm4gdGhpc30sCnNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe251bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pO3RoaXMudmlldy5lbmFibGVkPSEwO3RoaXMudmlldy5mdWxsV2lkdGg9YTt0aGlzLnZpZXcuZnVsbEhlaWdodD1jO3RoaXMudmlldy5vZmZzZXRYPWU7dGhpcy52aWV3Lm9mZnNldFk9Zzt0aGlzLnZpZXcud2lkdGg9cjt0aGlzLnZpZXcuaGVpZ2h0PXY7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGNsZWFyVmlld09mZnNldDpmdW5jdGlvbigpe251bGwhPT10aGlzLnZpZXcmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYT0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksYz0odGhpcy50b3AtCnRoaXMuYm90dG9tKS8oMip0aGlzLnpvb20pLGU9KHRoaXMucmlnaHQrdGhpcy5sZWZ0KS8yLGc9KHRoaXMudG9wK3RoaXMuYm90dG9tKS8yLHI9ZS1hO2UrPWE7YT1nK2M7Yz1nLWM7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2U9dGhpcy56b29tLyh0aGlzLnZpZXcud2lkdGgvdGhpcy52aWV3LmZ1bGxXaWR0aCk7Yz10aGlzLnpvb20vKHRoaXMudmlldy5oZWlnaHQvdGhpcy52aWV3LmZ1bGxIZWlnaHQpO3ZhciB2PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LndpZHRoO2c9KHRoaXMudG9wLXRoaXMuYm90dG9tKS90aGlzLnZpZXcuaGVpZ2h0O3IrPXRoaXMudmlldy5vZmZzZXRYL2UqdjtlPXIrdGhpcy52aWV3LndpZHRoL2UqdjthLT10aGlzLnZpZXcub2Zmc2V0WS9jKmc7Yz1hLXRoaXMudmlldy5oZWlnaHQvYypnfXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKHIsZSxhLGMsdGhpcy5uZWFyLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sCnRvSlNPTjpmdW5jdGlvbihhKXthPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7YS5vYmplY3Quem9vbT10aGlzLnpvb207YS5vYmplY3QubGVmdD10aGlzLmxlZnQ7YS5vYmplY3QucmlnaHQ9dGhpcy5yaWdodDthLm9iamVjdC50b3A9dGhpcy50b3A7YS5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO3JldHVybiBhfX0pO1JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UmcsaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93OiEwLHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyxlKXtWYy5wcm90b3R5cGUudXBkYXRlTWF0cmljZXMuY2FsbCh0aGlzLGEsYyxlKX19KTtTZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpTZyxpc0RpcmVjdGlvbmFsTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO1RnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGcsaXNBbWJpZW50TGlnaHQ6ITB9KTtVZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVnLGlzUmVjdEFyZWFMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLndpZHRoPWEud2lkdGg7dGhpcy5oZWlnaHQ9YS5oZWlnaHQ7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPUpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LndpZHRoPQp0aGlzLndpZHRoO2Eub2JqZWN0LmhlaWdodD10aGlzLmhlaWdodDtyZXR1cm4gYX19KTtWZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlZnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoRSl7dm9pZCAwPT09ZVtFXSYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLEUpO3JldHVybiBlW0VdfXZhciBlPXRoaXMudGV4dHVyZXMsZz1uZXcgS21bYS50eXBlXTt2b2lkIDAhPT1hLnV1aWQmJihnLnV1aWQ9YS51dWlkKTt2b2lkIDAhPT1hLm5hbWUmJihnLm5hbWU9YS5uYW1lKTt2b2lkIDAhPT1hLmNvbG9yJiZnLmNvbG9yLnNldEhleChhLmNvbG9yKTsKdm9pZCAwIT09YS5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz1hLnJvdWdobmVzcyk7dm9pZCAwIT09YS5tZXRhbG5lc3MmJihnLm1ldGFsbmVzcz1hLm1ldGFsbmVzcyk7dm9pZCAwIT09YS5lbWlzc2l2ZSYmZy5lbWlzc2l2ZS5zZXRIZXgoYS5lbWlzc2l2ZSk7dm9pZCAwIT09YS5zcGVjdWxhciYmZy5zcGVjdWxhci5zZXRIZXgoYS5zcGVjdWxhcik7dm9pZCAwIT09YS5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz1hLnNoaW5pbmVzcyk7dm9pZCAwIT09YS5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD1hLmNsZWFyY29hdCk7dm9pZCAwIT09YS5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz1hLmNsZWFyY29hdFJvdWdobmVzcyk7dm9pZCAwIT09YS52ZXJ0ZXhDb2xvcnMmJihnLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9ycyk7dm9pZCAwIT09YS5mb2cmJihnLmZvZz1hLmZvZyk7dm9pZCAwIT09YS5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZyk7CnZvaWQgMCE9PWEuYmxlbmRpbmcmJihnLmJsZW5kaW5nPWEuYmxlbmRpbmcpO3ZvaWQgMCE9PWEuY29tYmluZSYmKGcuY29tYmluZT1hLmNvbWJpbmUpO3ZvaWQgMCE9PWEuc2lkZSYmKGcuc2lkZT1hLnNpZGUpO3ZvaWQgMCE9PWEub3BhY2l0eSYmKGcub3BhY2l0eT1hLm9wYWNpdHkpO3ZvaWQgMCE9PWEudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PWEudHJhbnNwYXJlbnQpO3ZvaWQgMCE9PWEuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9YS5hbHBoYVRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhUZXN0JiYoZy5kZXB0aFRlc3Q9YS5kZXB0aFRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhXcml0ZSYmKGcuZGVwdGhXcml0ZT1hLmRlcHRoV3JpdGUpO3ZvaWQgMCE9PWEuY29sb3JXcml0ZSYmKGcuY29sb3JXcml0ZT1hLmNvbG9yV3JpdGUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lJiYoZy53aXJlZnJhbWU9YS53aXJlZnJhbWUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lTGluZXdpZHRoJiYoZy53aXJlZnJhbWVMaW5ld2lkdGg9CmEud2lyZWZyYW1lTGluZXdpZHRoKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVjYXAmJihnLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVqb2luJiYoZy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luKTt2b2lkIDAhPT1hLnJvdGF0aW9uJiYoZy5yb3RhdGlvbj1hLnJvdGF0aW9uKTsxIT09YS5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD1hLmxpbmV3aWR0aCk7dm9pZCAwIT09YS5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9YS5kYXNoU2l6ZSk7dm9pZCAwIT09YS5nYXBTaXplJiYoZy5nYXBTaXplPWEuZ2FwU2l6ZSk7dm9pZCAwIT09YS5zY2FsZSYmKGcuc2NhbGU9YS5zY2FsZSk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0JiYoZy5wb2x5Z29uT2Zmc2V0PWEucG9seWdvbk9mZnNldCk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPWEucG9seWdvbk9mZnNldEZhY3Rvcik7CnZvaWQgMCE9PWEucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9YS5wb2x5Z29uT2Zmc2V0VW5pdHMpO3ZvaWQgMCE9PWEuc2tpbm5pbmcmJihnLnNraW5uaW5nPWEuc2tpbm5pbmcpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXRzJiYoZy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHMpO3ZvaWQgMCE9PWEubW9ycGhOb3JtYWxzJiYoZy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHMpO3ZvaWQgMCE9PWEuZGl0aGVyaW5nJiYoZy5kaXRoZXJpbmc9YS5kaXRoZXJpbmcpO3ZvaWQgMCE9PWEudmlzaWJsZSYmKGcudmlzaWJsZT1hLnZpc2libGUpO3ZvaWQgMCE9PWEudG9uZU1hcHBlZCYmKGcudG9uZU1hcHBlZD1hLnRvbmVNYXBwZWQpO3ZvaWQgMCE9PWEudXNlckRhdGEmJihnLnVzZXJEYXRhPWEudXNlckRhdGEpO2lmKHZvaWQgMCE9PWEudW5pZm9ybXMpZm9yKHZhciByIGluIGEudW5pZm9ybXMpe3ZhciB2PWEudW5pZm9ybXNbcl07Zy51bmlmb3Jtc1tyXT0Ke307c3dpdGNoKHYudHlwZSl7Y2FzZSAidCI6Zy51bmlmb3Jtc1tyXS52YWx1ZT1jKHYudmFsdWUpO2JyZWFrO2Nhc2UgImMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBJKS5zZXRIZXgodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjIiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBmKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBrKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBwKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAibTMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyB0KS5mcm9tQXJyYXkodi52YWx1ZSk7Y2FzZSAibTQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBxKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpnLnVuaWZvcm1zW3JdLnZhbHVlPXYudmFsdWV9fXZvaWQgMCE9PWEuZGVmaW5lcyYmKGcuZGVmaW5lcz1hLmRlZmluZXMpOwp2b2lkIDAhPT1hLnZlcnRleFNoYWRlciYmKGcudmVydGV4U2hhZGVyPWEudmVydGV4U2hhZGVyKTt2b2lkIDAhPT1hLmZyYWdtZW50U2hhZGVyJiYoZy5mcmFnbWVudFNoYWRlcj1hLmZyYWdtZW50U2hhZGVyKTtpZih2b2lkIDAhPT1hLmV4dGVuc2lvbnMpZm9yKHZhciB6IGluIGEuZXh0ZW5zaW9ucylnLmV4dGVuc2lvbnNbel09YS5leHRlbnNpb25zW3pdO3ZvaWQgMCE9PWEuc2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9MT09PWEuc2hhZGluZyk7dm9pZCAwIT09YS5zaXplJiYoZy5zaXplPWEuc2l6ZSk7dm9pZCAwIT09YS5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbik7dm9pZCAwIT09YS5tYXAmJihnLm1hcD1jKGEubWFwKSk7dm9pZCAwIT09YS5tYXRjYXAmJihnLm1hdGNhcD1jKGEubWF0Y2FwKSk7dm9pZCAwIT09YS5hbHBoYU1hcCYmKGcuYWxwaGFNYXA9YyhhLmFscGhhTWFwKSxnLnRyYW5zcGFyZW50PSEwKTt2b2lkIDAhPT0KYS5idW1wTWFwJiYoZy5idW1wTWFwPWMoYS5idW1wTWFwKSk7dm9pZCAwIT09YS5idW1wU2NhbGUmJihnLmJ1bXBTY2FsZT1hLmJ1bXBTY2FsZSk7dm9pZCAwIT09YS5ub3JtYWxNYXAmJihnLm5vcm1hbE1hcD1jKGEubm9ybWFsTWFwKSk7dm9pZCAwIT09YS5ub3JtYWxNYXBUeXBlJiYoZy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZSk7dm9pZCAwIT09YS5ub3JtYWxTY2FsZSYmKHI9YS5ub3JtYWxTY2FsZSwhMT09PUFycmF5LmlzQXJyYXkocikmJihyPVtyLHJdKSxnLm5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KHIpKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudE1hcCYmKGcuZGlzcGxhY2VtZW50TWFwPWMoYS5kaXNwbGFjZW1lbnRNYXApKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudFNjYWxlJiYoZy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudEJpYXMmJihnLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzKTsKdm9pZCAwIT09YS5yb3VnaG5lc3NNYXAmJihnLnJvdWdobmVzc01hcD1jKGEucm91Z2huZXNzTWFwKSk7dm9pZCAwIT09YS5tZXRhbG5lc3NNYXAmJihnLm1ldGFsbmVzc01hcD1jKGEubWV0YWxuZXNzTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZU1hcCYmKGcuZW1pc3NpdmVNYXA9YyhhLmVtaXNzaXZlTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZUludGVuc2l0eSYmKGcuZW1pc3NpdmVJbnRlbnNpdHk9YS5lbWlzc2l2ZUludGVuc2l0eSk7dm9pZCAwIT09YS5zcGVjdWxhck1hcCYmKGcuc3BlY3VsYXJNYXA9YyhhLnNwZWN1bGFyTWFwKSk7dm9pZCAwIT09YS5lbnZNYXAmJihnLmVudk1hcD1jKGEuZW52TWFwKSk7dm9pZCAwIT09YS5lbnZNYXBJbnRlbnNpdHkmJihnLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eSk7dm9pZCAwIT09YS5yZWZsZWN0aXZpdHkmJihnLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eSk7dm9pZCAwIT09YS5yZWZyYWN0aW9uUmF0aW8mJihnLnJlZnJhY3Rpb25SYXRpbz0KYS5yZWZyYWN0aW9uUmF0aW8pO3ZvaWQgMCE9PWEubGlnaHRNYXAmJihnLmxpZ2h0TWFwPWMoYS5saWdodE1hcCkpO3ZvaWQgMCE9PWEubGlnaHRNYXBJbnRlbnNpdHkmJihnLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuYW9NYXAmJihnLmFvTWFwPWMoYS5hb01hcCkpO3ZvaWQgMCE9PWEuYW9NYXBJbnRlbnNpdHkmJihnLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuZ3JhZGllbnRNYXAmJihnLmdyYWRpZW50TWFwPWMoYS5ncmFkaWVudE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoZy5jbGVhcmNvYXROb3JtYWxNYXA9YyhhLmNsZWFyY29hdE5vcm1hbE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUmJihnLmNsZWFyY29hdE5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpKTtyZXR1cm4gZ30sc2V0VGV4dHVyZXM6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0dXJlcz0KYTtyZXR1cm4gdGhpc319KTt2YXIgUGk9e2RlY29kZVRleHQ6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgVGV4dERlY29kZXIpcmV0dXJuKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGEpO2Zvcih2YXIgYz0iIixlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMrPVN0cmluZy5mcm9tQ2hhckNvZGUoYVtlXSk7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGMpKX1jYXRjaChyKXtyZXR1cm4gY319LGV4dHJhY3RVcmxCYXNlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4tMT09PWM/Ii4vIjphLnN1YnN0cigwLGMrMSl9fTtXZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldnLGlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6ITAsY29weTpmdW5jdGlvbihhKXt2YS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5tYXhJbnN0YW5jZWRDb3VudD0KYS5tYXhJbnN0YW5jZWRDb3VudDtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLm1heEluc3RhbmNlZENvdW50PXRoaXMubWF4SW5zdGFuY2VkQ291bnQ7YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PSEwO3JldHVybiBhfX0pO1hnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYZyxpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTohMCxjb3B5OmZ1bmN0aW9uKGEpe1EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPVEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EubWVzaFBlckF0dHJpYnV0ZT0KdGhpcy5tZXNoUGVyQXR0cmlidXRlO2EuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITA7cmV0dXJuIGF9fSk7WWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpZZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgdWMoci5tYW5hZ2VyKTt2LnNldFBhdGgoci5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHIucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXt2YXIgYz1hLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IFdnOm5ldyB2YSxlPWEuZGF0YS5pbmRleDtpZih2b2lkIDAhPT1lKXt2YXIgZz1uZXcgUWlbZS50eXBlXShlLmFycmF5KTtjLnNldEluZGV4KG5ldyBRKGcsMSkpfWU9YS5kYXRhLmF0dHJpYnV0ZXM7Zm9yKHZhciByIGluIGUpe3ZhciB2PWVbcl07Zz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KTtnPW5ldyAodi5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8KWGc6USkoZyx2Lml0ZW1TaXplLHYubm9ybWFsaXplZCk7dm9pZCAwIT09di5uYW1lJiYoZy5uYW1lPXYubmFtZSk7Yy5hZGRBdHRyaWJ1dGUocixnKX12YXIgej1hLmRhdGEubW9ycGhBdHRyaWJ1dGVzO2lmKHopZm9yKHIgaW4geil7dmFyIEU9eltyXSxGPVtdO2U9MDtmb3IodmFyIEo9RS5sZW5ndGg7ZTxKO2UrKyl2PUVbZV0sZz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KSxnPW5ldyBRKGcsdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpLHZvaWQgMCE9PXYubmFtZSYmKGcubmFtZT12Lm5hbWUpLEYucHVzaChnKTtjLm1vcnBoQXR0cmlidXRlc1tyXT1GfXI9YS5kYXRhLmdyb3Vwc3x8YS5kYXRhLmRyYXdjYWxsc3x8YS5kYXRhLm9mZnNldHM7aWYodm9pZCAwIT09cilmb3IoZT0wLHY9ci5sZW5ndGg7ZSE9PXY7KytlKWc9cltlXSxjLmFkZEdyb3VwKGcuc3RhcnQsZy5jb3VudCxnLm1hdGVyaWFsSW5kZXgpO2U9YS5kYXRhLmJvdW5kaW5nU3BoZXJlO3ZvaWQgMCE9PWUmJihyPW5ldyBrLAp2b2lkIDAhPT1lLmNlbnRlciYmci5mcm9tQXJyYXkoZS5jZW50ZXIpLGMuYm91bmRpbmdTcGhlcmU9bmV3IEcocixlLnJhZGl1cykpO2EubmFtZSYmKGMubmFtZT1hLm5hbWUpO2EudXNlckRhdGEmJihjLnVzZXJEYXRhPWEudXNlckRhdGEpO3JldHVybiBjfX0pO3ZhciBRaT17SW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXk6InVuZGVmaW5lZCIhPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXk/VWludDhDbGFtcGVkQXJyYXk6VWludDhBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheX07WmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpaZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj0iIj09PXRoaXMucGF0aD9QaS5leHRyYWN0VXJsQmFzZShhKTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9CnRoaXMucmVzb3VyY2VQYXRofHx2O3Y9bmV3IHVjKHIubWFuYWdlcik7di5zZXRQYXRoKHRoaXMucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7dmFyIEU9bnVsbDt0cnl7RT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe3ZvaWQgMCE9PWcmJmcoRik7Y29uc29sZS5lcnJvcigiVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW4ndCBwYXJzZSAiK2ErIi4iLEYubWVzc2FnZSk7cmV0dXJufXo9RS5tZXRhZGF0YTt2b2lkIDA9PT16fHx2b2lkIDA9PT16LnR5cGV8fCJnZW9tZXRyeSI9PT16LnR5cGUudG9Mb3dlckNhc2UoKT9jb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIithKTpyLnBhcnNlKEUsYyl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5wYXJzZVNoYXBlKGEuc2hhcGVzKTtlPXRoaXMucGFyc2VHZW9tZXRyaWVzKGEuZ2VvbWV0cmllcyxlKTt2YXIgZz10aGlzLnBhcnNlSW1hZ2VzKGEuaW1hZ2VzLGZ1bmN0aW9uKCl7dm9pZCAwIT09CmMmJmMocil9KTtnPXRoaXMucGFyc2VUZXh0dXJlcyhhLnRleHR1cmVzLGcpO2c9dGhpcy5wYXJzZU1hdGVyaWFscyhhLm1hdGVyaWFscyxnKTt2YXIgcj10aGlzLnBhcnNlT2JqZWN0KGEub2JqZWN0LGUsZyk7YS5hbmltYXRpb25zJiYoci5hbmltYXRpb25zPXRoaXMucGFyc2VBbmltYXRpb25zKGEuYW5pbWF0aW9ucykpO3ZvaWQgMCE9PWEuaW1hZ2VzJiYwIT09YS5pbWFnZXMubGVuZ3RofHx2b2lkIDA9PT1jfHxjKHIpO3JldHVybiByfSxwYXJzZVNoYXBlOmZ1bmN0aW9uKGEpe3ZhciBjPXt9O2lmKHZvaWQgMCE9PWEpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj0obmV3IENkKS5mcm9tSlNPTihhW2VdKTtjW3IudXVpZF09cn1yZXR1cm4gY30scGFyc2VHZW9tZXRyaWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9e307aWYodm9pZCAwIT09YSlmb3IodmFyIGc9bmV3IFlnLHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07c3dpdGNoKHoudHlwZSl7Y2FzZSAiUGxhbmVHZW9tZXRyeSI6Y2FzZSAiUGxhbmVCdWZmZXJHZW9tZXRyeSI6dmFyIEU9Cm5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei53aWR0aFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMpO2JyZWFrO2Nhc2UgIkJveEdlb21ldHJ5IjpjYXNlICJCb3hCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiQ3ViZUdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei5kZXB0aCx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LmRlcHRoU2VnbWVudHMpO2JyZWFrO2Nhc2UgIkNpcmNsZUdlb21ldHJ5IjpjYXNlICJDaXJjbGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDeWxpbmRlckdlb21ldHJ5IjpjYXNlICJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzVG9wLHoucmFkaXVzQm90dG9tLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCwKei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkNvbmVHZW9tZXRyeSI6Y2FzZSAiQ29uZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiU3BoZXJlR2VvbWV0cnkiOmNhc2UgIlNwaGVyZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkRvZGVjYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkdlb21ldHJ5IjpjYXNlICJPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouZGV0YWlsKTticmVhaztjYXNlICJSaW5nR2VvbWV0cnkiOmNhc2UgIlJpbmdCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LmlubmVyUmFkaXVzLHoub3V0ZXJSYWRpdXMsei50aGV0YVNlZ21lbnRzLHoucGhpU2VnbWVudHMsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlRvcnVzR2VvbWV0cnkiOmNhc2UgIlRvcnVzQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoucmFkaWFsU2VnbWVudHMsei50dWJ1bGFyU2VnbWVudHMsei5hcmMpO2JyZWFrO2Nhc2UgIlRvcnVzS25vdEdlb21ldHJ5IjpjYXNlICJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnR1YmUsei50dWJ1bGFyU2VnbWVudHMsei5yYWRpYWxTZWdtZW50cyx6LnAsei5xKTticmVhaztjYXNlICJUdWJlR2VvbWV0cnkiOmNhc2UgIlR1YmVCdWZmZXJHZW9tZXRyeSI6RT0KbmV3IGdjW3oudHlwZV0oKG5ldyBPaVt6LnBhdGgudHlwZV0pLmZyb21KU09OKHoucGF0aCksei50dWJ1bGFyU2VnbWVudHMsei5yYWRpdXMsei5yYWRpYWxTZWdtZW50cyx6LmNsb3NlZCk7YnJlYWs7Y2FzZSAiTGF0aGVHZW9tZXRyeSI6Y2FzZSAiTGF0aGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnBvaW50cyx6LnNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgpO2JyZWFrO2Nhc2UgIlBvbHloZWRyb25HZW9tZXRyeSI6Y2FzZSAiUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoudmVydGljZXMsei5pbmRpY2VzLHoucmFkaXVzLHouZGV0YWlscyk7YnJlYWs7Y2FzZSAiU2hhcGVHZW9tZXRyeSI6Y2FzZSAiU2hhcGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtmb3IodmFyIEY9MCxKPXouc2hhcGVzLmxlbmd0aDtGPEo7RisrKXt2YXIgUD1jW3ouc2hhcGVzW0ZdXTtFLnB1c2goUCl9RT1uZXcgZ2Nbei50eXBlXShFLHouY3VydmVTZWdtZW50cyk7CmJyZWFrO2Nhc2UgIkV4dHJ1ZGVHZW9tZXRyeSI6Y2FzZSAiRXh0cnVkZUJ1ZmZlckdlb21ldHJ5IjpFPVtdO0Y9MDtmb3IoSj16LnNoYXBlcy5sZW5ndGg7RjxKO0YrKylQPWNbei5zaGFwZXNbRl1dLEUucHVzaChQKTtGPXoub3B0aW9ucy5leHRydWRlUGF0aDt2b2lkIDAhPT1GJiYoei5vcHRpb25zLmV4dHJ1ZGVQYXRoPShuZXcgT2lbRi50eXBlXSkuZnJvbUpTT04oRikpO0U9bmV3IGdjW3oudHlwZV0oRSx6Lm9wdGlvbnMpO2JyZWFrO2Nhc2UgIkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6RT1nLnBhcnNlKHopO2JyZWFrO2Nhc2UgIkdlb21ldHJ5IjoiVEhSRUUiaW4gd2luZG93JiYiTGVnYWN5SlNPTkxvYWRlciJpbiBUSFJFRT9FPShuZXcgVEhSRUUuTGVnYWN5SlNPTkxvYWRlcikucGFyc2Uoeix0aGlzLnJlc291cmNlUGF0aCkuZ2VvbWV0cnk6Y29uc29sZS5lcnJvcignVEhSRUUuT2JqZWN0TG9hZGVyOiBZb3UgaGF2ZSB0byBpbXBvcnQgTGVnYWN5SlNPTkxvYWRlciBpbiBvcmRlciBsb2FkIGdlb21ldHJ5IGRhdGEgb2YgdHlwZSAiR2VvbWV0cnkiLicpOwpicmVhaztkZWZhdWx0OmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICInK3oudHlwZSsnIicpO2NvbnRpbnVlfUUudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7ITA9PT1FLmlzQnVmZmVyR2VvbWV0cnkmJnZvaWQgMCE9PXoudXNlckRhdGEmJihFLnVzZXJEYXRhPXoudXNlckRhdGEpO2Vbei51dWlkXT1FfXJldHVybiBlfSxwYXJzZU1hdGVyaWFsczpmdW5jdGlvbihhLGMpe3ZhciBlPXt9LGc9e307aWYodm9pZCAwIT09YSl7dmFyIHI9bmV3IFZnO3Iuc2V0VGV4dHVyZXMoYyk7Yz0wO2Zvcih2YXIgdj1hLmxlbmd0aDtjPHY7YysrKXt2YXIgej1hW2NdO2lmKCJNdWx0aU1hdGVyaWFsIj09PXoudHlwZSl7Zm9yKHZhciBFPVtdLEY9MDtGPHoubWF0ZXJpYWxzLmxlbmd0aDtGKyspe3ZhciBKPXoubWF0ZXJpYWxzW0ZdO3ZvaWQgMD09PWVbSi51dWlkXSYmKGVbSi51dWlkXT1yLnBhcnNlKEopKTsKRS5wdXNoKGVbSi51dWlkXSl9Z1t6LnV1aWRdPUV9ZWxzZSB2b2lkIDA9PT1lW3oudXVpZF0mJihlW3oudXVpZF09ci5wYXJzZSh6KSksZ1t6LnV1aWRdPWVbei51dWlkXX19cmV0dXJuIGd9LHBhcnNlQW5pbWF0aW9uczpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz1hW2VdLHI9dGMucGFyc2UoZyk7dm9pZCAwIT09Zy51dWlkJiYoci51dWlkPWcudXVpZCk7Yy5wdXNoKHIpfXJldHVybiBjfSxwYXJzZUltYWdlczpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoUyl7Zy5tYW5hZ2VyLml0ZW1TdGFydChTKTtyZXR1cm4gdi5sb2FkKFMsZnVuY3Rpb24oKXtnLm1hbmFnZXIuaXRlbUVuZChTKX0sdm9pZCAwLGZ1bmN0aW9uKCl7Zy5tYW5hZ2VyLml0ZW1FcnJvcihTKTtnLm1hbmFnZXIuaXRlbUVuZChTKX0pfXZhciBnPXRoaXMscj17fTtpZih2b2lkIDAhPT1hJiYwPGEubGVuZ3RoKXtjPW5ldyAkaChjKTt2YXIgdj1uZXcgVWUoYyk7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKYz0wO2Zvcih2YXIgej1hLmxlbmd0aDtjPHo7YysrKXt2YXIgRT1hW2NdLEY9RS51cmw7aWYoQXJyYXkuaXNBcnJheShGKSl7cltFLnV1aWRdPVtdO2Zvcih2YXIgSj0wLFA9Ri5sZW5ndGg7SjxQO0orKyl7dmFyIFI9RltKXTtSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KFIpP1I6Zy5yZXNvdXJjZVBhdGgrUjtyW0UudXVpZF0ucHVzaChlKFIpKX19ZWxzZSBSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KEUudXJsKT9FLnVybDpnLnJlc291cmNlUGF0aCtFLnVybCxyW0UudXVpZF09ZShSKX19cmV0dXJuIHJ9LHBhcnNlVGV4dHVyZXM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKEYsSil7aWYoIm51bWJlciI9PT10eXBlb2YgRilyZXR1cm4gRjtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uIixGKTtyZXR1cm4gSltGXX12YXIgZz17fTtpZih2b2lkIDAhPT0KYSlmb3IodmFyIHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07dm9pZCAwPT09ei5pbWFnZSYmY29uc29sZS53YXJuKCdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicsei51dWlkKTt2b2lkIDA9PT1jW3ouaW1hZ2VdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlIix6LmltYWdlKTt2YXIgRT1BcnJheS5pc0FycmF5KGNbei5pbWFnZV0pP25ldyBjZChjW3ouaW1hZ2VdKTpuZXcgbChjW3ouaW1hZ2VdKTtFLm5lZWRzVXBkYXRlPSEwO0UudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7dm9pZCAwIT09ei5tYXBwaW5nJiYoRS5tYXBwaW5nPWUoei5tYXBwaW5nLExtKSk7dm9pZCAwIT09ei5vZmZzZXQmJkUub2Zmc2V0LmZyb21BcnJheSh6Lm9mZnNldCk7dm9pZCAwIT09ei5yZXBlYXQmJkUucmVwZWF0LmZyb21BcnJheSh6LnJlcGVhdCk7dm9pZCAwIT09ei5jZW50ZXImJgpFLmNlbnRlci5mcm9tQXJyYXkoei5jZW50ZXIpO3ZvaWQgMCE9PXoucm90YXRpb24mJihFLnJvdGF0aW9uPXoucm90YXRpb24pO3ZvaWQgMCE9PXoud3JhcCYmKEUud3JhcFM9ZSh6LndyYXBbMF0sc2spLEUud3JhcFQ9ZSh6LndyYXBbMV0sc2spKTt2b2lkIDAhPT16LmZvcm1hdCYmKEUuZm9ybWF0PXouZm9ybWF0KTt2b2lkIDAhPT16LnR5cGUmJihFLnR5cGU9ei50eXBlKTt2b2lkIDAhPT16LmVuY29kaW5nJiYoRS5lbmNvZGluZz16LmVuY29kaW5nKTt2b2lkIDAhPT16Lm1pbkZpbHRlciYmKEUubWluRmlsdGVyPWUoei5taW5GaWx0ZXIsdGspKTt2b2lkIDAhPT16Lm1hZ0ZpbHRlciYmKEUubWFnRmlsdGVyPWUoei5tYWdGaWx0ZXIsdGspKTt2b2lkIDAhPT16LmFuaXNvdHJvcHkmJihFLmFuaXNvdHJvcHk9ei5hbmlzb3Ryb3B5KTt2b2lkIDAhPT16LmZsaXBZJiYoRS5mbGlwWT16LmZsaXBZKTt2b2lkIDAhPT16LnByZW11bHRpcGx5QWxwaGEmJihFLnByZW11bHRpcGx5QWxwaGE9CnoucHJlbXVsdGlwbHlBbHBoYSk7dm9pZCAwIT09ei51bnBhY2tBbGlnbm1lbnQmJihFLnVucGFja0FsaWdubWVudD16LnVucGFja0FsaWdubWVudCk7Z1t6LnV1aWRdPUV9cmV0dXJuIGd9LHBhcnNlT2JqZWN0OmZ1bmN0aW9uKGEsYyxlKXtmdW5jdGlvbiBnKEope3ZvaWQgMD09PWNbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLEopO3JldHVybiBjW0pdfWZ1bmN0aW9uIHIoSil7aWYodm9pZCAwIT09Sil7aWYoQXJyYXkuaXNBcnJheShKKSl7Zm9yKHZhciBQPVtdLFI9MCxTPUoubGVuZ3RoO1I8UztSKyspe3ZhciBWPUpbUl07dm9pZCAwPT09ZVtWXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsVik7UC5wdXNoKGVbVl0pfXJldHVybiBQfXZvaWQgMD09PWVbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLEopO3JldHVybiBlW0pdfX0Kc3dpdGNoKGEudHlwZSl7Y2FzZSAiU2NlbmUiOnZhciB2PW5ldyB5O3ZvaWQgMCE9PWEuYmFja2dyb3VuZCYmTnVtYmVyLmlzSW50ZWdlcihhLmJhY2tncm91bmQpJiYodi5iYWNrZ3JvdW5kPW5ldyBJKGEuYmFja2dyb3VuZCkpO3ZvaWQgMCE9PWEuZm9nJiYoIkZvZyI9PT1hLmZvZy50eXBlP3YuZm9nPW5ldyBBZyhhLmZvZy5jb2xvcixhLmZvZy5uZWFyLGEuZm9nLmZhcik6IkZvZ0V4cDIiPT09YS5mb2cudHlwZSYmKHYuZm9nPW5ldyB6ZyhhLmZvZy5jb2xvcixhLmZvZy5kZW5zaXR5KSkpO2JyZWFrO2Nhc2UgIlBlcnNwZWN0aXZlQ2FtZXJhIjp2PW5ldyB2YihhLmZvdixhLmFzcGVjdCxhLm5lYXIsYS5mYXIpO3ZvaWQgMCE9PWEuZm9jdXMmJih2LmZvY3VzPWEuZm9jdXMpO3ZvaWQgMCE9PWEuem9vbSYmKHYuem9vbT1hLnpvb20pO3ZvaWQgMCE9PWEuZmlsbUdhdWdlJiYodi5maWxtR2F1Z2U9YS5maWxtR2F1Z2UpO3ZvaWQgMCE9PWEuZmlsbU9mZnNldCYmKHYuZmlsbU9mZnNldD0KYS5maWxtT2Zmc2V0KTt2b2lkIDAhPT1hLnZpZXcmJih2LnZpZXc9T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpKTticmVhaztjYXNlICJPcnRob2dyYXBoaWNDYW1lcmEiOnY9bmV3IGJnKGEubGVmdCxhLnJpZ2h0LGEudG9wLGEuYm90dG9tLGEubmVhcixhLmZhcik7dm9pZCAwIT09YS56b29tJiYodi56b29tPWEuem9vbSk7dm9pZCAwIT09YS52aWV3JiYodi52aWV3PU9iamVjdC5hc3NpZ24oe30sYS52aWV3KSk7YnJlYWs7Y2FzZSAiQW1iaWVudExpZ2h0Ijp2PW5ldyBUZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJEaXJlY3Rpb25hbExpZ2h0Ijp2PW5ldyBTZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJQb2ludExpZ2h0Ijp2PW5ldyBRZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5kZWNheSk7YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6dj1uZXcgVWcoYS5jb2xvcixhLmludGVuc2l0eSxhLndpZHRoLGEuaGVpZ2h0KTticmVhazsKY2FzZSAiU3BvdExpZ2h0Ijp2PW5ldyBQZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5hbmdsZSxhLnBlbnVtYnJhLGEuZGVjYXkpO2JyZWFrO2Nhc2UgIkhlbWlzcGhlcmVMaWdodCI6dj1uZXcgTmcoYS5jb2xvcixhLmdyb3VuZENvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJTa2lubmVkTWVzaCI6Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4iKTtjYXNlICJNZXNoIjp2PWcoYS5nZW9tZXRyeSk7dmFyIHo9cihhLm1hdGVyaWFsKTt2PXYuYm9uZXMmJjA8di5ib25lcy5sZW5ndGg/bmV3IEJmKHYseik6bmV3IHhhKHYseik7dm9pZCAwIT09YS5kcmF3TW9kZSYmdi5zZXREcmF3TW9kZShhLmRyYXdNb2RlKTticmVhaztjYXNlICJMT0QiOnY9bmV3IEFmO2JyZWFrO2Nhc2UgIkxpbmUiOnY9bmV3IFZiKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSxhLm1vZGUpOwpicmVhaztjYXNlICJMaW5lTG9vcCI6dj1uZXcgRGcoZyhhLmdlb21ldHJ5KSxyKGEubWF0ZXJpYWwpKTticmVhaztjYXNlICJMaW5lU2VnbWVudHMiOnY9bmV3IEliKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiUG9pbnRDbG91ZCI6Y2FzZSAiUG9pbnRzIjp2PW5ldyBDZShnKGEuZ2VvbWV0cnkpLHIoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlNwcml0ZSI6dj1uZXcgeWYocihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiR3JvdXAiOnY9bmV3IHVlO2JyZWFrO2RlZmF1bHQ6dj1uZXcgQX12LnV1aWQ9YS51dWlkO3ZvaWQgMCE9PWEubmFtZSYmKHYubmFtZT1hLm5hbWUpO3ZvaWQgMCE9PWEubWF0cml4Pyh2Lm1hdHJpeC5mcm9tQXJyYXkoYS5tYXRyaXgpLHZvaWQgMCE9PWEubWF0cml4QXV0b1VwZGF0ZSYmKHYubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGUpLHYubWF0cml4QXV0b1VwZGF0ZSYmdi5tYXRyaXguZGVjb21wb3NlKHYucG9zaXRpb24sCnYucXVhdGVybmlvbix2LnNjYWxlKSk6KHZvaWQgMCE9PWEucG9zaXRpb24mJnYucG9zaXRpb24uZnJvbUFycmF5KGEucG9zaXRpb24pLHZvaWQgMCE9PWEucm90YXRpb24mJnYucm90YXRpb24uZnJvbUFycmF5KGEucm90YXRpb24pLHZvaWQgMCE9PWEucXVhdGVybmlvbiYmdi5xdWF0ZXJuaW9uLmZyb21BcnJheShhLnF1YXRlcm5pb24pLHZvaWQgMCE9PWEuc2NhbGUmJnYuc2NhbGUuZnJvbUFycmF5KGEuc2NhbGUpKTt2b2lkIDAhPT1hLmNhc3RTaGFkb3cmJih2LmNhc3RTaGFkb3c9YS5jYXN0U2hhZG93KTt2b2lkIDAhPT1hLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93KTthLnNoYWRvdyYmKHZvaWQgMCE9PWEuc2hhZG93LmJpYXMmJih2LnNoYWRvdy5iaWFzPWEuc2hhZG93LmJpYXMpLHZvaWQgMCE9PWEuc2hhZG93LnJhZGl1cyYmKHYuc2hhZG93LnJhZGl1cz1hLnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PWEuc2hhZG93Lm1hcFNpemUmJgp2LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheShhLnNoYWRvdy5tYXBTaXplKSx2b2lkIDAhPT1hLnNoYWRvdy5jYW1lcmEmJih2LnNoYWRvdy5jYW1lcmE9dGhpcy5wYXJzZU9iamVjdChhLnNoYWRvdy5jYW1lcmEpKSk7dm9pZCAwIT09YS52aXNpYmxlJiYodi52aXNpYmxlPWEudmlzaWJsZSk7dm9pZCAwIT09YS5mcnVzdHVtQ3VsbGVkJiYodi5mcnVzdHVtQ3VsbGVkPWEuZnJ1c3R1bUN1bGxlZCk7dm9pZCAwIT09YS5yZW5kZXJPcmRlciYmKHYucmVuZGVyT3JkZXI9YS5yZW5kZXJPcmRlcik7dm9pZCAwIT09YS51c2VyRGF0YSYmKHYudXNlckRhdGE9YS51c2VyRGF0YSk7dm9pZCAwIT09YS5sYXllcnMmJih2LmxheWVycy5tYXNrPWEubGF5ZXJzKTtpZih2b2lkIDAhPT1hLmNoaWxkcmVuKXt6PWEuY2hpbGRyZW47Zm9yKHZhciBFPTA7RTx6Lmxlbmd0aDtFKyspdi5hZGQodGhpcy5wYXJzZU9iamVjdCh6W0VdLGMsZSkpfWlmKCJMT0QiPT09YS50eXBlKWZvcihhPWEubGV2ZWxzLHo9CjA7ejxhLmxlbmd0aDt6Kyspe0U9YVt6XTt2YXIgRj12LmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLEUub2JqZWN0KTt2b2lkIDAhPT1GJiZ2LmFkZExldmVsKEYsRS5kaXN0YW5jZSl9cmV0dXJuIHZ9fSk7dmFyIExtPXtVVk1hcHBpbmc6MzAwLEN1YmVSZWZsZWN0aW9uTWFwcGluZzozMDEsQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOjMwMixFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzozMDMsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6MzA0LFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOjMwNSxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzozMDYsQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6MzA3fSxzaz17UmVwZWF0V3JhcHBpbmc6MUUzLENsYW1wVG9FZGdlV3JhcHBpbmc6MTAwMSxNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOjEwMDJ9LHRrPXtOZWFyZXN0RmlsdGVyOjEwMDMsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOjEwMDUsCkxpbmVhckZpbHRlcjoxMDA2LExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6MTAwOH07ZWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjplaSxzZXRPcHRpb25zOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz1hO3JldHVybiB0aGlzfSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtmZXRjaChhKS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB6LmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oeil7cmV0dXJuIHZvaWQgMD09PQpyLm9wdGlvbnM/Y3JlYXRlSW1hZ2VCaXRtYXAoeik6Y3JlYXRlSW1hZ2VCaXRtYXAoeixyLm9wdGlvbnMpfSkudGhlbihmdW5jdGlvbih6KXtpZS5hZGQoYSx6KTtjJiZjKHopO3IubWFuYWdlci5pdGVtRW5kKGEpfSkuY2F0Y2goZnVuY3Rpb24oeil7ZyYmZyh6KTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSk7ci5tYW5hZ2VyLml0ZW1TdGFydChhKX19KTtPYmplY3QuYXNzaWduKGZpLnByb3RvdHlwZSx7bW92ZVRvOmZ1bmN0aW9uKGEsYyl7dGhpcy5jdXJyZW50UGF0aD1uZXcgR2M7dGhpcy5zdWJQYXRocy5wdXNoKHRoaXMuY3VycmVudFBhdGgpO3RoaXMuY3VycmVudFBhdGgubW92ZVRvKGEsYyl9LGxpbmVUbzpmdW5jdGlvbihhLGMpe3RoaXMuY3VycmVudFBhdGgubGluZVRvKGEsYyl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKGEsYyxlLGcpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKGEsYyxlLGcscix2KX0sc3BsaW5lVGhydTpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoYSl9LHRvU2hhcGVzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShmYSl7Zm9yKHZhciByYT1bXSxwYT0wLHFhPWZhLmxlbmd0aDtwYTxxYTtwYSsrKXt2YXIgdWE9ZmFbcGFdLG9hPW5ldyBDZDtvYS5jdXJ2ZXM9dWEuY3VydmVzO3JhLnB1c2gob2EpfXJldHVybiByYX1mdW5jdGlvbiBnKGZhLHJhKXtmb3IodmFyIHBhPXJhLmxlbmd0aCxxYT0hMSx1YT1wYS0xLG9hPTA7b2E8cGE7dWE9b2ErKyl7dmFyIHRhPXJhW3VhXSxCYT1yYVtvYV0sVGE9QmEueC10YS54LFVhPUJhLnktdGEueTtpZihNYXRoLmFicyhVYSk+TnVtYmVyLkVQU0lMT04pe2lmKDA+VWEmJih0YT1yYVtvYV0sVGE9LVRhLEJhPXJhW3VhXSxVYT0tVWEpLCEoZmEueTx0YS55fHxmYS55PkJhLnkpKWlmKGZhLnk9PT10YS55KXtpZihmYS54PT09CnRhLngpcmV0dXJuITB9ZWxzZXt1YT1VYSooZmEueC10YS54KS1UYSooZmEueS10YS55KTtpZigwPT09dWEpcmV0dXJuITA7MD51YXx8KHFhPSFxYSl9fWVsc2UgaWYoZmEueT09PXRhLnkmJihCYS54PD1mYS54JiZmYS54PD10YS54fHx0YS54PD1mYS54JiZmYS54PD1CYS54KSlyZXR1cm4hMH1yZXR1cm4gcWF9dmFyIHI9ZWQuaXNDbG9ja1dpc2Usdj10aGlzLnN1YlBhdGhzO2lmKDA9PT12Lmxlbmd0aClyZXR1cm5bXTtpZighMD09PWMpcmV0dXJuIGUodik7Yz1bXTtpZigxPT09di5sZW5ndGgpe3ZhciB6PXZbMF07dmFyIEU9bmV3IENkO0UuY3VydmVzPXouY3VydmVzO2MucHVzaChFKTtyZXR1cm4gY312YXIgRj0hcih2WzBdLmdldFBvaW50cygpKTtGPWE/IUY6RjtFPVtdO3ZhciBKPVtdLFA9W10sUj0wO0pbUl09dm9pZCAwO1BbUl09W107Zm9yKHZhciBTPTAsVj12Lmxlbmd0aDtTPFY7UysrKXt6PXZbU107dmFyIFc9ei5nZXRQb2ludHMoKTt2YXIgaGE9cihXKTsoaGE9YT8haGE6CmhhKT8oIUYmJkpbUl0mJlIrKyxKW1JdPXtzOm5ldyBDZCxwOld9LEpbUl0ucy5jdXJ2ZXM9ei5jdXJ2ZXMsRiYmUisrLFBbUl09W10pOlBbUl0ucHVzaCh7aDp6LHA6V1swXX0pfWlmKCFKWzBdKXJldHVybiBlKHYpO2lmKDE8Si5sZW5ndGgpe1M9ITE7YT1bXTtyPTA7Zm9yKHY9Si5sZW5ndGg7cjx2O3IrKylFW3JdPVtdO3I9MDtmb3Iodj1KLmxlbmd0aDtyPHY7cisrKWZvcih6PVBbcl0saGE9MDtoYTx6Lmxlbmd0aDtoYSsrKXtGPXpbaGFdO1I9ITA7Zm9yKFc9MDtXPEoubGVuZ3RoO1crKylnKEYucCxKW1ddLnApJiYociE9PVcmJmEucHVzaCh7ZnJvbXM6cix0b3M6Vyxob2xlOmhhfSksUj8oUj0hMSxFW1ddLnB1c2goRikpOlM9ITApO1ImJkVbcl0ucHVzaChGKX0wPGEubGVuZ3RoJiYoU3x8KFA9RSkpfVM9MDtmb3Iocj1KLmxlbmd0aDtTPHI7UysrKWZvcihFPUpbU10ucyxjLnB1c2goRSksYT1QW1NdLHY9MCx6PWEubGVuZ3RoO3Y8ejt2KyspRS5ob2xlcy5wdXNoKGFbdl0uaCk7CnJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oZ2kucHJvdG90eXBlLHtpc0ZvbnQ6ITAsZ2VuZXJhdGVTaGFwZXM6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0xMDApO3ZhciBlPVtdO2E9dm0oYSxjLHRoaXMuZGF0YSk7Yz0wO2Zvcih2YXIgZz1hLmxlbmd0aDtjPGc7YysrKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsYVtjXS50b1NoYXBlcygpKTtyZXR1cm4gZX19KTtoaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmhpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1Yyh0aGlzLm1hbmFnZXIpO3Yuc2V0UGF0aCh0aGlzLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope3RyeXt2YXIgRT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe2NvbnNvbGUud2FybigiVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLiIpLApFPUpTT04ucGFyc2Uoei5zdWJzdHJpbmcoNjUsei5sZW5ndGgtMikpfXo9ci5wYXJzZShFKTtjJiZjKHopfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGdpKGEpfX0pO3ZhciB5aCxtaT17Z2V0Q29udGV4dDpmdW5jdGlvbigpe3ZvaWQgMD09PXloJiYoeWg9bmV3ICh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSk7cmV0dXJuIHlofSxzZXRDb250ZXh0OmZ1bmN0aW9uKGEpe3loPWF9fTskZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOiRnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9bmV3IHVjKHRoaXMubWFuYWdlcik7ci5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7ci5zZXRQYXRoKHRoaXMucGF0aCk7ci5sb2FkKGEsZnVuY3Rpb24odil7dj12LnNsaWNlKDApO21pLmdldENvbnRleHQoKS5kZWNvZGVBdWRpb0RhdGEodixmdW5jdGlvbih6KXtjKHopfSl9LAplLGcpfX0pO09iamVjdC5hc3NpZ24oYWgucHJvdG90eXBlLHtpc1NwaGVyaWNhbEhhcm1vbmljczM6ITAsc2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzk+YztjKyspdGhpcy5jb2VmZmljaWVudHNbY10uY29weShhW2NdKTtyZXR1cm4gdGhpc30semVybzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wOzk+YTthKyspdGhpcy5jb2VmZmljaWVudHNbYV0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc30sZ2V0QXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7dmFyIHI9dGhpcy5jb2VmZmljaWVudHM7Yy5jb3B5KHJbMF0pLm11bHRpcGx5U2NhbGFyKC4yODIwOTUpO2MuYWRkU2NhbGUoclsxXSwuNDg4NjAzKmcpO2MuYWRkU2NhbGUoclsyXSwuNDg4NjAzKmEpO2MuYWRkU2NhbGUoclszXSwuNDg4NjAzKmUpO2MuYWRkU2NhbGUocls0XSwxLjA5MjU0OCplKmcpO2MuYWRkU2NhbGUocls1XSwxLjA5MjU0OCpnKmEpO2MuYWRkU2NhbGUocls2XSwuMzE1MzkyKigzKmEqYS0xKSk7CmMuYWRkU2NhbGUocls3XSwxLjA5MjU0OCplKmEpO2MuYWRkU2NhbGUocls4XSwuNTQ2Mjc0KihlKmUtZypnKSk7cmV0dXJuIGN9LGdldElycmFkaWFuY2VBdDpmdW5jdGlvbihhLGMpe3ZhciBlPWEueCxnPWEueTthPWEuejt2YXIgcj10aGlzLmNvZWZmaWNpZW50cztjLmNvcHkoclswXSkubXVsdGlwbHlTY2FsYXIoLjg4NjIyNyk7Yy5hZGRTY2FsZShyWzFdLDEuMDIzMzI4KmcpO2MuYWRkU2NhbGUoclsyXSwxLjAyMzMyOCphKTtjLmFkZFNjYWxlKHJbM10sMS4wMjMzMjgqZSk7Yy5hZGRTY2FsZShyWzRdLC44NTgwODYqZSpnKTtjLmFkZFNjYWxlKHJbNV0sLjg1ODA4NipnKmEpO2MuYWRkU2NhbGUocls2XSwuNzQzMTI1KmEqYS0uMjQ3NzA4KTtjLmFkZFNjYWxlKHJbN10sLjg1ODA4NiplKmEpO2MuYWRkU2NhbGUocls4XSwuNDI5MDQzKihlKmUtZypnKSk7cmV0dXJuIGN9LGFkZDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLmFkZChhLmNvZWZmaWNpZW50c1tjXSk7CnJldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLm11bHRpcGx5U2NhbGFyKGEpO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5sZXJwKGEuY29lZmZpY2llbnRzW2VdLGMpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKylpZighdGhpcy5jb2VmZmljaWVudHNbY10uZXF1YWxzKGEuY29lZmZpY2llbnRzW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH0sY29weTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXQoYS5jb2VmZmljaWVudHMpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGc9MDs5Pmc7ZysrKWVbZ10uZnJvbUFycmF5KGEsCmMrMypnKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTtmb3IodmFyIGU9dGhpcy5jb2VmZmljaWVudHMsZz0wOzk+ZztnKyspZVtnXS50b0FycmF5KGEsYyszKmcpO3JldHVybiBhfX0pO09iamVjdC5hc3NpZ24oYWgse2dldEJhc2lzQXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7Y1swXT0uMjgyMDk1O2NbMV09LjQ4ODYwMypnO2NbMl09LjQ4ODYwMyphO2NbM109LjQ4ODYwMyplO2NbNF09MS4wOTI1NDgqZSpnO2NbNV09MS4wOTI1NDgqZyphO2NbNl09LjMxNTM5MiooMyphKmEtMSk7Y1s3XT0xLjA5MjU0OCplKmE7Y1s4XT0uNTQ2Mjc0KihlKmUtZypnKX19KTtIYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkhjLGlzTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5zaC5jb3B5KGEuc2gpO3RoaXMuaW50ZW5zaXR5PWEuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7cmV0dXJuIEpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpfX0pO2lpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6aWksaXNIZW1pc3BoZXJlTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0hjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3JldHVybiBIYy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKX19KTtqaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEhjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmppLGlzQW1iaWVudExpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtIYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXtyZXR1cm4gSGMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmEpfX0pO3ZhciB1az1uZXcgcSx2az1uZXcgcTtPYmplY3QuYXNzaWduKFFqLnByb3RvdHlwZSx7dXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2NhY2hlO2lmKGMuZm9jdXMhPT1hLmZvY3VzfHxjLmZvdiE9PWEuZm92fHxjLmFzcGVjdCE9PWEuYXNwZWN0KnRoaXMuYXNwZWN0fHxjLm5lYXIhPT1hLm5lYXJ8fGMuZmFyIT09YS5mYXJ8fGMuem9vbSE9PWEuem9vbXx8Yy5leWVTZXAhPT10aGlzLmV5ZVNlcCl7Yy5mb2N1cz1hLmZvY3VzO2MuZm92PWEuZm92O2MuYXNwZWN0PWEuYXNwZWN0KnRoaXMuYXNwZWN0O2MubmVhcj1hLm5lYXI7Yy5mYXI9YS5mYXI7Yy56b29tPWEuem9vbTtjLmV5ZVNlcD10aGlzLmV5ZVNlcDt2YXIgZT1hLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKSxnPWMuZXllU2VwLzIscj1nKmMubmVhci9jLmZvY3VzLHY9Yy5uZWFyKk1hdGgudGFuKGhiLkRFRzJSQUQqYy5mb3YqLjUpL2Muem9vbTt2ay5lbGVtZW50c1sxMl09LWc7dWsuZWxlbWVudHNbMTJdPQpnO2c9LXYqYy5hc3BlY3Qrcjt2YXIgej12KmMuYXNwZWN0K3I7ZS5lbGVtZW50c1swXT0yKmMubmVhci8oei1nKTtlLmVsZW1lbnRzWzhdPSh6K2cpLyh6LWcpO3RoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoZSk7Zz0tdipjLmFzcGVjdC1yO3o9dipjLmFzcGVjdC1yO2UuZWxlbWVudHNbMF09MipjLm5lYXIvKHotZyk7ZS5lbGVtZW50c1s4XT0oeitnKS8oei1nKTt0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KGUpfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpLm11bHRpcGx5KHZrKTt0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKS5tdWx0aXBseSh1ayl9fSk7T2JqZWN0LmFzc2lnbihraS5wcm90b3R5cGUse3N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTsKdGhpcy5lbGFwc2VkVGltZT0wO3RoaXMucnVubmluZz0hMH0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKTt0aGlzLmF1dG9TdGFydD10aGlzLnJ1bm5pbmc9ITF9LGdldEVsYXBzZWRUaW1lOmZ1bmN0aW9uKCl7dGhpcy5nZXREZWx0YSgpO3JldHVybiB0aGlzLmVsYXBzZWRUaW1lfSxnZXREZWx0YTpmdW5jdGlvbigpe3ZhciBhPTA7aWYodGhpcy5hdXRvU3RhcnQmJiF0aGlzLnJ1bm5pbmcpcmV0dXJuIHRoaXMuc3RhcnQoKSwwO2lmKHRoaXMucnVubmluZyl7dmFyIGM9KCJ1bmRlZmluZWQiPT09dHlwZW9mIHBlcmZvcm1hbmNlP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpO2E9KGMtdGhpcy5vbGRUaW1lKS8xRTM7dGhpcy5vbGRUaW1lPWM7dGhpcy5lbGFwc2VkVGltZSs9YX1yZXR1cm4gYX19KTt2YXIgamU9bmV3IGssd2s9bmV3IGgsTW09bmV3IGssa2U9bmV3IGs7bGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpsaSxnZXRJbnB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW59LHJlbW92ZUZpbHRlcjpmdW5jdGlvbigpe251bGwhPT10aGlzLmZpbHRlciYmKHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSx0aGlzLmZpbHRlci5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7bnVsbCE9PXRoaXMuZmlsdGVyPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3RoaXMuZmlsdGVyPWE7dGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpOwp0aGlzLmZpbHRlci5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7cmV0dXJuIHRoaXN9LGdldE1hc3RlclZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0TWFzdGVyVm9sdW1lOmZ1bmN0aW9uKGEpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShhLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7YT10aGlzLmNvbnRleHQubGlzdGVuZXI7dmFyIGM9dGhpcy51cDt0aGlzLnRpbWVEZWx0YT10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGplLHdrLE1tKTtrZS5zZXQoMCwwLC0xKS5hcHBseVF1YXRlcm5pb24od2spO2lmKGEucG9zaXRpb25YKXt2YXIgZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7CmEucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGplLngsZSk7YS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoamUueSxlKTthLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqZS56LGUpO2EuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoa2UueCxlKTthLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGtlLnksZSk7YS5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS56LGUpO2EudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGMueCxlKTthLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjLnksZSk7YS51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYy56LGUpfWVsc2UgYS5zZXRQb3NpdGlvbihqZS54LGplLnksamUueiksYS5zZXRPcmllbnRhdGlvbihrZS54LGtlLnksa2UueixjLngsYy55LGMueil9fSk7V2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpXZSxnZXRPdXRwdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxzZXROb2RlU291cmNlOmZ1bmN0aW9uKGEpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIjt0aGlzLnNvdXJjZT1hO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRNZWRpYUVsZW1lbnRTb3VyY2U6ZnVuY3Rpb24oYSl7dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITE7dGhpcy5zb3VyY2VUeXBlPSJtZWRpYU5vZGUiO3RoaXMuc291cmNlPXRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UoYSk7dGhpcy5jb25uZWN0KCk7cmV0dXJuIHRoaXN9LHNldEJ1ZmZlcjpmdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcj1hO3RoaXMuc291cmNlVHlwZT0iYnVmZmVyIjt0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKTtyZXR1cm4gdGhpc30scGxheTpmdW5jdGlvbigpe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpOwplbHNlIGlmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNle3ZhciBhPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTthLmJ1ZmZlcj10aGlzLmJ1ZmZlcjthLmxvb3A9dGhpcy5sb29wO2Eub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKTt0aGlzLnN0YXJ0VGltZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWU7YS5zdGFydCh0aGlzLnN0YXJ0VGltZSx0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKTt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnNvdXJjZT1hO3RoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKTt0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSk7cmV0dXJuIHRoaXMuY29ubmVjdCgpfX0scGF1c2U6ZnVuY3Rpb24oKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmKHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQrPSh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQ9MCx0aGlzLmlzUGxheWluZz0hMSx0aGlzfSxjb25uZWN0OmZ1bmN0aW9uKCl7aWYoMDx0aGlzLmZpbHRlcnMubGVuZ3RoKXt0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKHZhciBhPTEsYz10aGlzLmZpbHRlcnMubGVuZ3RoO2E8YzthKyspdGhpcy5maWx0ZXJzW2EtCjFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZGlzY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYT0xLGM9dGhpcy5maWx0ZXJzLmxlbmd0aDthPGM7YSsrKXRoaXMuZmlsdGVyc1thLTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcnN9LHNldEZpbHRlcnM6ZnVuY3Rpb24oYSl7YXx8CihhPVtdKTshMD09PXRoaXMuaXNQbGF5aW5nPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9YSx0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPWE7cmV0dXJuIHRoaXN9LHNldERldHVuZTpmdW5jdGlvbihhKXt0aGlzLmRldHVuZT1hO2lmKHZvaWQgMCE9PXRoaXMuc291cmNlLmRldHVuZSlyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMuZGV0dW5lLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9LGdldERldHVuZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRldHVuZX0sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RmlsdGVycyhhP1thXTpbXSl9LHNldFBsYXliYWNrUmF0ZTpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuIHRoaXMucGxheWJhY2tSYXRlPWEsITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFRhcmdldEF0VGltZSh0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9LG9uRW5kZWQ6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMX0sZ2V0TG9vcDpmdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIiksITEpOnRoaXMubG9vcH0sc2V0TG9vcDpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZSByZXR1cm4gdGhpcy5sb29wPQphLCEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5sb29wPXRoaXMubG9vcCksdGhpc30sZ2V0Vm9sdW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfSxzZXRWb2x1bWU6ZnVuY3Rpb24oYSl7dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGEsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSk7cmV0dXJuIHRoaXN9fSk7dmFyIGxlPW5ldyBrLHhrPW5ldyBoLE5tPW5ldyBrLG1lPW5ldyBrO25pLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoV2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6bmksZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyfSxnZXRSZWZEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZX0sc2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIucmVmRGlzdGFuY2U9YTtyZXR1cm4gdGhpc30sZ2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfSwKc2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yPWE7cmV0dXJuIHRoaXN9LGdldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH0sc2V0RGlzdGFuY2VNb2RlbDpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPWE7cmV0dXJuIHRoaXN9LGdldE1heERpc3RhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlfSxzZXRNYXhEaXN0YW5jZTpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5tYXhEaXN0YW5jZT1hO3JldHVybiB0aGlzfSxzZXREaXJlY3Rpb25hbENvbmU6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPWE7dGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9Yzt0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPWU7cmV0dXJuIHRoaXN9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcywKYSk7aWYoITAhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbHx8ITEhPT10aGlzLmlzUGxheWluZylpZih0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZSx4ayxObSksbWUuc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24oeGspLGE9dGhpcy5wYW5uZXIsYS5wb3NpdGlvblgpe3ZhciBjPXRoaXMuY29udGV4dC5jdXJyZW50VGltZSt0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTthLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZS54LGMpO2EucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxlLnksYyk7YS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGUueixjKTthLm9yaWVudGF0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtZS54LGMpO2Eub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1lLnksYyk7YS5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobWUueixjKX1lbHNlIGEuc2V0UG9zaXRpb24obGUueCwKbGUueSxsZS56KSxhLnNldE9yaWVudGF0aW9uKG1lLngsbWUueSxtZS56KX19KTtPYmplY3QuYXNzaWduKG9pLnByb3RvdHlwZSx7Z2V0RnJlcXVlbmN5RGF0YTpmdW5jdGlvbigpe3RoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5kYXRhfSxnZXRBdmVyYWdlRnJlcXVlbmN5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz10aGlzLmdldEZyZXF1ZW5jeURhdGEoKSxlPTA7ZTxjLmxlbmd0aDtlKyspYSs9Y1tlXTtyZXR1cm4gYS9jLmxlbmd0aH19KTtPYmplY3QuYXNzaWduKHBpLnByb3RvdHlwZSx7YWNjdW11bGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuYnVmZmVyLGc9dGhpcy52YWx1ZVNpemU7YT1hKmcrZzt2YXIgcj10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYoMD09PXIpe2ZvcihyPTA7ciE9PWc7KytyKWVbYStyXT1lW3JdO3I9Y31lbHNlIHIrPWMsdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGUsYSwwLGMvcixnKTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9CnJ9LGFwcGx5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmFsdWVTaXplLGU9dGhpcy5idWZmZXI7YT1hKmMrYzt2YXIgZz10aGlzLmN1bXVsYXRpdmVXZWlnaHQscj10aGlzLmJpbmRpbmc7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTA7MT5nJiZ0aGlzLl9taXhCdWZmZXJSZWdpb24oZSxhLDMqYywxLWcsYyk7Zz1jO2Zvcih2YXIgdj1jK2M7ZyE9PXY7KytnKWlmKGVbZ10hPT1lW2crY10pe3Iuc2V0VmFsdWUoZSxhKTticmVha319LHNhdmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXIsYz10aGlzLnZhbHVlU2l6ZSxlPTMqYzt0aGlzLmJpbmRpbmcuZ2V0VmFsdWUoYSxlKTtmb3IodmFyIGc9YztnIT09ZTsrK2cpYVtnXT1hW2UrZyVjXTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH0scmVzdG9yZU9yaWdpbmFsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLmJpbmRpbmcuc2V0VmFsdWUodGhpcy5idWZmZXIsMyp0aGlzLnZhbHVlU2l6ZSl9LF9zZWxlY3Q6ZnVuY3Rpb24oYSwKYyxlLGcscil7aWYoLjU8PWcpZm9yKGc9MDtnIT09cjsrK2cpYVtjK2ddPWFbZStnXX0sX3NsZXJwOmZ1bmN0aW9uKGEsYyxlLGcpe2guc2xlcnBGbGF0KGEsYyxhLGMsYSxlLGcpfSxfbGVycDpmdW5jdGlvbihhLGMsZSxnLHIpe2Zvcih2YXIgdj0xLWcsej0wO3ohPT1yOysreil7dmFyIEU9Yyt6O2FbRV09YVtFXSp2K2FbZSt6XSpnfX19KTt2YXIgT209L1tcW1xdXC46XC9dL2csUG09IlteIisiXFxbXFxdXFwuOlxcLyIucmVwbGFjZSgiXFwuIiwiIikrIl0iLFFtPS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxSbT0vKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCJXQ09EIixQbSksU209Lyg/OlwuKFdDKykoPzpcWyguKylcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxUbT0vXC4oV0MrKSg/OlxbKC4rKVxdKT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxVbT0KbmV3IFJlZ0V4cCgiXiIrUW0rUm0rU20rVG0rIiQiKSxWbT1bIm1hdGVyaWFsIiwibWF0ZXJpYWxzIiwiYm9uZXMiXTtPYmplY3QuYXNzaWduKFJqLnByb3RvdHlwZSx7Z2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmJpbmQoKTt2YXIgZT10aGlzLl9iaW5kaW5nc1t0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c19dO3ZvaWQgMCE9PWUmJmUuZ2V0VmFsdWUoYSxjKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18scj1lLmxlbmd0aDtnIT09cjsrK2cpZVtnXS5zZXRWYWx1ZShhLGMpfSxiaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLGU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10uYmluZCgpfSx1bmJpbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYmluZGluZ3MsYz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCmU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10udW5iaW5kKCl9fSk7T2JqZWN0LmFzc2lnbigkYix7Q29tcG9zaXRlOlJqLGNyZWF0ZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIGEmJmEuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgJGIuQ29tcG9zaXRlKGEsYyxlKTpuZXcgJGIoYSxjLGUpfSxzYW5pdGl6ZU5vZGVOYW1lOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKE9tLCIiKX0scGFyc2VUcmFja05hbWU6ZnVuY3Rpb24oYSl7dmFyIGM9VW0uZXhlYyhhKTtpZighYyl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAiK2EpO2M9e25vZGVOYW1lOmNbMl0sb2JqZWN0TmFtZTpjWzNdLG9iamVjdEluZGV4OmNbNF0scHJvcGVydHlOYW1lOmNbNV0scHJvcGVydHlJbmRleDpjWzZdfTt2YXIgZT1jLm5vZGVOYW1lJiZjLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYodm9pZCAwIT09ZSYmLTEhPT0KZSl7dmFyIGc9Yy5ub2RlTmFtZS5zdWJzdHJpbmcoZSsxKTstMSE9PVZtLmluZGV4T2YoZykmJihjLm5vZGVOYW1lPWMubm9kZU5hbWUuc3Vic3RyaW5nKDAsZSksYy5vYmplY3ROYW1lPWcpfWlmKG51bGw9PT1jLnByb3BlcnR5TmFtZXx8MD09PWMucHJvcGVydHlOYW1lLmxlbmd0aCl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIithKTtyZXR1cm4gY30sZmluZE5vZGU6ZnVuY3Rpb24oYSxjKXtpZighY3x8IiI9PT1jfHwicm9vdCI9PT1jfHwiLiI9PT1jfHwtMT09PWN8fGM9PT1hLm5hbWV8fGM9PT1hLnV1aWQpcmV0dXJuIGE7aWYoYS5za2VsZXRvbil7dmFyIGU9YS5za2VsZXRvbi5nZXRCb25lQnlOYW1lKGMpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGV9aWYoYS5jaGlsZHJlbil7dmFyIGc9ZnVuY3Rpb24ocil7Zm9yKHZhciB2PTA7djxyLmxlbmd0aDt2Kyspe3ZhciB6PXJbdl07aWYoei5uYW1lPT09CmN8fHoudXVpZD09PWMpcmV0dXJuIHo7aWYoej1nKHouY2hpbGRyZW4pKXJldHVybiB6fXJldHVybiBudWxsfTtpZihhPWcoYS5jaGlsZHJlbikpcmV0dXJuIGF9cmV0dXJuIG51bGx9fSk7T2JqZWN0LmFzc2lnbigkYi5wcm90b3R5cGUse19nZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sX3NldFZhbHVlX3VuYXZhaWxhYmxlOmZ1bmN0aW9uKCl7fSxCaW5kaW5nVHlwZTp7RGlyZWN0OjAsRW50aXJlQXJyYXk6MSxBcnJheUVsZW1lbnQ6MixIYXNGcm9tVG9BcnJheTozfSxWZXJzaW9uaW5nOntOb25lOjAsTmVlZHNVcGRhdGU6MSxNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOjJ9LEdldHRlckJ5QmluZGluZ1R5cGU6W2Z1bmN0aW9uKGEsYyl7YVtjXT10aGlzLm5vZGVbdGhpcy5wcm9wZXJ0eU5hbWVdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWFbYysrXT1lW2ddfSxmdW5jdGlvbihhLGMpe2FbY109CnRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KGEsYyl9XSxTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzpbW2Z1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY119LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWVbZ109YVtjKytdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksCmc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV0sW2Z1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YVtjXX0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSwKYyl9LGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShhLGMpO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSxjKTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV1dLGdldFZhbHVlOmZ1bmN0aW9uKGEsYyl7dGhpcy5iaW5kKCk7dGhpcy5nZXRWYWx1ZShhLGMpfSxzZXRWYWx1ZTpmdW5jdGlvbihhLGMpe3RoaXMuYmluZCgpO3RoaXMuc2V0VmFsdWUoYSxjKX0sYmluZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubm9kZSxjPXRoaXMucGFyc2VkUGF0aCxlPWMub2JqZWN0TmFtZSxnPWMucHJvcGVydHlOYW1lLHI9Yy5wcm9wZXJ0eUluZGV4O2F8fCh0aGlzLm5vZGU9YT0kYi5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLGMubm9kZU5hbWUpfHx0aGlzLnJvb3ROb2RlKTt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlOwp0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO2lmKGEpe2lmKGUpe3ZhciB2PWMub2JqZWN0SW5kZXg7c3dpdGNoKGUpe2Nhc2UgIm1hdGVyaWFscyI6aWYoIWEubWF0ZXJpYWwpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLiIsdGhpcyk7cmV0dXJufWlmKCFhLm1hdGVyaWFsLm1hdGVyaWFscyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLHRoaXMpO3JldHVybn1hPWEubWF0ZXJpYWwubWF0ZXJpYWxzO2JyZWFrO2Nhc2UgImJvbmVzIjppZighYS5za2VsZXRvbil7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIiwKdGhpcyk7cmV0dXJufWE9YS5za2VsZXRvbi5ib25lcztmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGFbZV0ubmFtZT09PXYpe3Y9ZTticmVha31icmVhaztkZWZhdWx0OmlmKHZvaWQgMD09PWFbZV0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTtyZXR1cm59YT1hW2VdfWlmKHZvaWQgMCE9PXYpe2lmKHZvaWQgMD09PWFbdl0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4iLHRoaXMsYSk7cmV0dXJufWE9YVt2XX19dj1hW2ddO2lmKHZvaWQgMD09PXYpY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitjLm5vZGVOYW1lKyIuIitnKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLAphKTtlbHNle2M9dGhpcy5WZXJzaW9uaW5nLk5vbmU7dGhpcy50YXJnZXRPYmplY3Q9YTt2b2lkIDAhPT1hLm5lZWRzVXBkYXRlP2M9dGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlOnZvaWQgMCE9PWEubWF0cml4V29ybGROZWVkc1VwZGF0ZSYmKGM9dGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGUpO2U9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYodm9pZCAwIT09cil7aWYoIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyI9PT1nKXtpZighYS5nZW9tZXRyeSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIix0aGlzKTtyZXR1cm59aWYoYS5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KXtpZighYS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLAp0aGlzKTtyZXR1cm59Zm9yKGU9MDtlPHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoO2UrKylpZihhLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbltlXS5uYW1lPT09cil7cj1lO2JyZWFrfX1lbHNle2lmKCFhLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLiIsdGhpcyk7cmV0dXJufWZvcihlPTA7ZTx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDtlKyspaWYoYS5nZW9tZXRyeS5tb3JwaFRhcmdldHNbZV0ubmFtZT09PXIpe3I9ZTticmVha319fWU9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7dGhpcy5yZXNvbHZlZFByb3BlcnR5PXY7dGhpcy5wcm9wZXJ0eUluZGV4PXJ9ZWxzZSB2b2lkIDAhPT0Kdi5mcm9tQXJyYXkmJnZvaWQgMCE9PXYudG9BcnJheT8oZT10aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT12KTpBcnJheS5pc0FycmF5KHYpPyhlPXRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PXYpOnRoaXMucHJvcGVydHlOYW1lPWc7dGhpcy5nZXRWYWx1ZT10aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbZV07dGhpcy5zZXRWYWx1ZT10aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nW2VdW2NdfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogIit0aGlzLnBhdGgrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIpfSx1bmJpbmQ6ZnVuY3Rpb24oKXt0aGlzLm5vZGU9bnVsbDt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQ7dGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfX0pOwpPYmplY3QuYXNzaWduKCRiLnByb3RvdHlwZSx7X2dldFZhbHVlX3VuYm91bmQ6JGIucHJvdG90eXBlLmdldFZhbHVlLF9zZXRWYWx1ZV91bmJvdW5kOiRiLnByb3RvdHlwZS5zZXRWYWx1ZX0pO09iamVjdC5hc3NpZ24oU2oucHJvdG90eXBlLHtpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiEwLGFkZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9YS5sZW5ndGgsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxnPXRoaXMuX2luZGljZXNCeVVVSUQscj10aGlzLl9wYXRocyx2PXRoaXMuX3BhcnNlZFBhdGhzLHo9dGhpcy5fYmluZGluZ3MsRT16Lmxlbmd0aCxGPXZvaWQgMCxKPTAsUD1hcmd1bWVudHMubGVuZ3RoO0ohPT1QOysrSil7dmFyIFI9YXJndW1lbnRzW0pdLFM9Ui51dWlkLFY9Z1tTXTtpZih2b2lkIDA9PT1WKXtWPWMrKztnW1NdPVY7YS5wdXNoKFIpO1M9MDtmb3IodmFyIFc9RTtTIT09VzsrK1MpeltTXS5wdXNoKG5ldyAkYihSLHJbU10sdltTXSkpfWVsc2UgaWYoVjwKZSl7Rj1hW1ZdO3ZhciBoYT0tLWU7Vz1hW2hhXTtnW1cudXVpZF09VjthW1ZdPVc7Z1tTXT1oYTthW2hhXT1SO1M9MDtmb3IoVz1FO1MhPT1XOysrUyl7dmFyIGZhPXpbU10scmE9ZmFbVl07ZmFbVl09ZmFbaGFdO3ZvaWQgMD09PXJhJiYocmE9bmV3ICRiKFIscltTXSx2W1NdKSk7ZmFbaGFdPXJhfX1lbHNlIGFbVl0hPT1GJiZjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEIGRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLiIpfXRoaXMubkNhY2hlZE9iamVjdHNfPWV9LHJlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9dGhpcy5uQ2FjaGVkT2JqZWN0c18sZT10aGlzLl9pbmRpY2VzQnlVVUlELGc9dGhpcy5fYmluZGluZ3Mscj1nLmxlbmd0aCx2PTAsej1hcmd1bWVudHMubGVuZ3RoO3YhPT0KejsrK3Ype3ZhciBFPWFyZ3VtZW50c1t2XSxGPUUudXVpZCxKPWVbRl07aWYodm9pZCAwIT09SiYmSj49Yyl7dmFyIFA9YysrLFI9YVtQXTtlW1IudXVpZF09SjthW0pdPVI7ZVtGXT1QO2FbUF09RTtFPTA7Zm9yKEY9cjtFIT09RjsrK0Upe1I9Z1tFXTt2YXIgUz1SW0pdO1JbSl09UltQXTtSW1BdPVN9fX10aGlzLm5DYWNoZWRPYmplY3RzXz1jfSx1bmNhY2hlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX29iamVjdHMsYz1hLmxlbmd0aCxlPXRoaXMubkNhY2hlZE9iamVjdHNfLGc9dGhpcy5faW5kaWNlc0J5VVVJRCxyPXRoaXMuX2JpbmRpbmdzLHY9ci5sZW5ndGgsej0wLEU9YXJndW1lbnRzLmxlbmd0aDt6IT09RTsrK3ope3ZhciBGPWFyZ3VtZW50c1t6XS51dWlkLEo9Z1tGXTtpZih2b2lkIDAhPT1KKWlmKGRlbGV0ZSBnW0ZdLEo8ZSl7Rj0tLWU7dmFyIFA9YVtGXSxSPS0tYyxTPWFbUl07Z1tQLnV1aWRdPUo7YVtKXT1QO2dbUy51dWlkXT1GO2FbRl09UzthLnBvcCgpO1A9CjA7Zm9yKFM9djtQIT09UzsrK1Ape3ZhciBWPXJbUF0sVz1WW1JdO1ZbSl09VltGXTtWW0ZdPVc7Vi5wb3AoKX19ZWxzZSBmb3IoUj0tLWMsUz1hW1JdLGdbUy51dWlkXT1KLGFbSl09UyxhLnBvcCgpLFA9MCxTPXY7UCE9PVM7KytQKVY9cltQXSxWW0pdPVZbUl0sVi5wb3AoKX10aGlzLm5DYWNoZWRPYmplY3RzXz1lfSxzdWJzY3JpYmVfOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGc9ZVthXSxyPXRoaXMuX2JpbmRpbmdzO2lmKHZvaWQgMCE9PWcpcmV0dXJuIHJbZ107dmFyIHY9dGhpcy5fcGF0aHMsej10aGlzLl9wYXJzZWRQYXRocyxFPXRoaXMuX29iamVjdHMsRj10aGlzLm5DYWNoZWRPYmplY3RzXyxKPUFycmF5KEUubGVuZ3RoKTtnPXIubGVuZ3RoO2VbYV09Zzt2LnB1c2goYSk7ei5wdXNoKGMpO3IucHVzaChKKTtlPUY7Zm9yKGc9RS5sZW5ndGg7ZSE9PWc7KytlKUpbZV09bmV3ICRiKEVbZV0sYSxjKTtyZXR1cm4gSn0sdW5zdWJzY3JpYmVfOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsZT1jW2FdO2lmKHZvaWQgMCE9PWUpe3ZhciBnPXRoaXMuX3BhdGhzLHI9dGhpcy5fcGFyc2VkUGF0aHMsdj10aGlzLl9iaW5kaW5ncyx6PXYubGVuZ3RoLTEsRT12W3pdO2NbYVt6XV09ZTt2W2VdPUU7di5wb3AoKTtyW2VdPXJbel07ci5wb3AoKTtnW2VdPWdbel07Zy5wb3AoKX19fSk7T2JqZWN0LmFzc2lnbihUai5wcm90b3R5cGUse3BsYXk6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXN9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKTtyZXR1cm4gdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3RoaXMucGF1c2VkPSExO3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRpbWU9MDt0aGlzLl9sb29wQ291bnQ9LTE7dGhpcy5fc3RhcnRUaW1lPW51bGw7cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCl9LGlzUnVubmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVuYWJsZWQmJgohdGhpcy5wYXVzZWQmJjAhPT10aGlzLnRpbWVTY2FsZSYmbnVsbD09PXRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxpc1NjaGVkdWxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9LHN0YXJ0QXQ6ZnVuY3Rpb24oYSl7dGhpcy5fc3RhcnRUaW1lPWE7cmV0dXJuIHRoaXN9LHNldExvb3A6ZnVuY3Rpb24oYSxjKXt0aGlzLmxvb3A9YTt0aGlzLnJlcGV0aXRpb25zPWM7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbihhKXt0aGlzLndlaWdodD1hO3RoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ/YTowO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKX0sZ2V0RWZmZWN0aXZlV2VpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH0sZmFkZUluOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhhLDAsMSl9LGZhZGVPdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKGEsCjEsMCl9LGNyb3NzRmFkZUZyb206ZnVuY3Rpb24oYSxjLGUpe2EuZmFkZU91dChjKTt0aGlzLmZhZGVJbihjKTtpZihlKXtlPXRoaXMuX2NsaXAuZHVyYXRpb247dmFyIGc9YS5fY2xpcC5kdXJhdGlvbixyPWUvZzthLndhcnAoMSxnL2UsYyk7dGhpcy53YXJwKHIsMSxjKX1yZXR1cm4gdGhpc30sY3Jvc3NGYWRlVG86ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBhLmNyb3NzRmFkZUZyb20odGhpcyxjLGUpfSxzdG9wRmFkaW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbCE9PWEmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChhKSk7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt0aGlzLnRpbWVTY2FsZT1hO3RoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOmE7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sZ2V0RWZmZWN0aXZlVGltZVNjYWxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZX0sCnNldER1cmF0aW9uOmZ1bmN0aW9uKGEpe3RoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vYTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxzeW5jV2l0aDpmdW5jdGlvbihhKXt0aGlzLnRpbWU9YS50aW1lO3RoaXMudGltZVNjYWxlPWEudGltZVNjYWxlO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGhhbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCxhKX0sd2FycDpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5fbWl4ZXIscj1nLnRpbWUsdj10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCx6PXRoaXMudGltZVNjYWxlO251bGw9PT12JiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9dj1nLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO2c9di5wYXJhbWV0ZXJQb3NpdGlvbnM7dj12LnNhbXBsZVZhbHVlcztnWzBdPXI7Z1sxXT1yK2U7dlswXT1hL3o7dlsxXT1jL3o7cmV0dXJuIHRoaXN9LHN0b3BXYXJwaW5nOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O251bGwhPT1hJiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYSkpO3JldHVybiB0aGlzfSxnZXRNaXhlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlcn0sZ2V0Q2xpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGlwfSxnZXRSb290OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvY2FsUm9vdHx8dGhpcy5fbWl4ZXIuX3Jvb3R9LF91cGRhdGU6ZnVuY3Rpb24oYSxjLGUsZyl7aWYodGhpcy5lbmFibGVkKXt2YXIgcj10aGlzLl9zdGFydFRpbWU7aWYobnVsbCE9PXIpe2M9KGEtcikqZTtpZigwPmN8fDA9PT1lKXJldHVybjt0aGlzLl9zdGFydFRpbWU9bnVsbDtjKj1lfWMqPXRoaXMuX3VwZGF0ZVRpbWVTY2FsZShhKTtlPXRoaXMuX3VwZGF0ZVRpbWUoYyk7YT10aGlzLl91cGRhdGVXZWlnaHQoYSk7aWYoMDxhKXtjPXRoaXMuX2ludGVycG9sYW50czsKcj10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO2Zvcih2YXIgdj0wLHo9Yy5sZW5ndGg7diE9PXo7Kyt2KWNbdl0uZXZhbHVhdGUoZSksclt2XS5hY2N1bXVsYXRlKGcsYSl9fWVsc2UgdGhpcy5fdXBkYXRlV2VpZ2h0KGEpfSxfdXBkYXRlV2VpZ2h0OmZ1bmN0aW9uKGEpe3ZhciBjPTA7aWYodGhpcy5lbmFibGVkKXtjPXRoaXMud2VpZ2h0O3ZhciBlPXRoaXMuX3dlaWdodEludGVycG9sYW50O2lmKG51bGwhPT1lKXt2YXIgZz1lLmV2YWx1YXRlKGEpWzBdO2MqPWc7YT5lLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcEZhZGluZygpLDA9PT1nJiYodGhpcy5lbmFibGVkPSExKSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9Y30sX3VwZGF0ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt2YXIgYz0wO2lmKCF0aGlzLnBhdXNlZCl7Yz10aGlzLnRpbWVTY2FsZTt2YXIgZT10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtpZihudWxsIT09ZSl7dmFyIGc9ZS5ldmFsdWF0ZShhKVswXTsKYyo9ZzthPmUucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wV2FycGluZygpLDA9PT1jP3RoaXMucGF1c2VkPSEwOnRoaXMudGltZVNjYWxlPWMpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPWN9LF91cGRhdGVUaW1lOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGltZSthLGU9dGhpcy5fY2xpcC5kdXJhdGlvbixnPXRoaXMubG9vcCxyPXRoaXMuX2xvb3BDb3VudCx2PTIyMDI9PT1nO2lmKDA9PT1hKXJldHVybi0xPT09cj9jOnYmJjE9PT0ociYxKT9lLWM6YztpZigyMjAwPT09ZylhOntpZigtMT09PXImJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSksYz49ZSljPWU7ZWxzZSBpZigwPmMpYz0wO2Vsc2V7dGhpcy50aW1lPWM7YnJlYWsgYX10aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMTt0aGlzLnRpbWU9Yzt0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsCmFjdGlvbjp0aGlzLGRpcmVjdGlvbjowPmE/LTE6MX0pfWVsc2V7LTE9PT1yJiYoMDw9YT8ocj0wLHRoaXMuX3NldEVuZGluZ3MoITAsMD09PXRoaXMucmVwZXRpdGlvbnMsdikpOnRoaXMuX3NldEVuZGluZ3MoMD09PXRoaXMucmVwZXRpdGlvbnMsITAsdikpO2lmKGM+PWV8fDA+Yyl7Zz1NYXRoLmZsb29yKGMvZSk7Yy09ZSpnO3IrPU1hdGguYWJzKGcpO3ZhciB6PXRoaXMucmVwZXRpdGlvbnMtcjswPj16Pyh0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSx0aGlzLnRpbWU9Yz0wPGE/ZTowLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246MDxhPzE6LTF9KSk6KDE9PT16PyhhPTA+YSx0aGlzLl9zZXRFbmRpbmdzKGEsIWEsdikpOnRoaXMuX3NldEVuZGluZ3MoITEsITEsdiksdGhpcy5fbG9vcENvdW50PXIsdGhpcy50aW1lPWMsdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsCmFjdGlvbjp0aGlzLGxvb3BEZWx0YTpnfSkpfWVsc2UgdGhpcy50aW1lPWM7aWYodiYmMT09PShyJjEpKXJldHVybiBlLWN9cmV0dXJuIGN9LF9zZXRFbmRpbmdzOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO2U/KGcuZW5kaW5nU3RhcnQ9MjQwMSxnLmVuZGluZ0VuZD0yNDAxKTooZy5lbmRpbmdTdGFydD1hP3RoaXMuemVyb1Nsb3BlQXRTdGFydD8yNDAxOjI0MDA6MjQwMixnLmVuZGluZ0VuZD1jP3RoaXMuemVyb1Nsb3BlQXRFbmQ/MjQwMToyNDAwOjI0MDIpfSxfc2NoZWR1bGVGYWRpbmc6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX21peGVyLHI9Zy50aW1lLHY9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbD09PXYmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD12PWcuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSk7Zz12LnBhcmFtZXRlclBvc2l0aW9uczt2PXYuc2FtcGxlVmFsdWVzO2dbMF09cjt2WzBdPWM7Z1sxXT1yK2E7dlsxXT0KZTtyZXR1cm4gdGhpc319KTtxaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6cWksX2JpbmRBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QsZz1hLl9jbGlwLnRyYWNrcyxyPWcubGVuZ3RoLHY9YS5fcHJvcGVydHlCaW5kaW5nczthPWEuX2ludGVycG9sYW50czt2YXIgej1lLnV1aWQsRT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsRj1FW3pdO3ZvaWQgMD09PUYmJihGPXt9LEVbel09Rik7Zm9yKEU9MDtFIT09cjsrK0Upe3ZhciBKPWdbRV0sUD1KLm5hbWUsUj1GW1BdO2lmKHZvaWQgMD09PVIpe1I9dltFXTtpZih2b2lkIDAhPT1SKXtudWxsPT09Ui5fY2FjaGVJbmRleCYmKCsrUi5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApKTtjb250aW51ZX1SPW5ldyBwaSgkYi5jcmVhdGUoZSxQLGMmJmMuX3Byb3BlcnR5QmluZGluZ3NbRV0uYmluZGluZy5wYXJzZWRQYXRoKSwKSi5WYWx1ZVR5cGVOYW1lLEouZ2V0VmFsdWVTaXplKCkpOysrUi5yZWZlcmVuY2VDb3VudDt0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApfXZbRV09UjthW0VdLnJlc3VsdEJ1ZmZlcj1SLmJ1ZmZlcn19LF9hY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihhKXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24oYSkpe2lmKG51bGw9PT1hLl9jYWNoZUluZGV4KXt2YXIgYz0oYS5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLGU9YS5fY2xpcC51dWlkLGc9dGhpcy5fYWN0aW9uc0J5Q2xpcFtlXTt0aGlzLl9iaW5kQWN0aW9uKGEsZyYmZy5rbm93bkFjdGlvbnNbMF0pO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGEsZSxjKX1jPWEuX3Byb3BlcnR5QmluZGluZ3M7ZT0wO2ZvcihnPWMubGVuZ3RoO2UhPT1nOysrZSl7dmFyIHI9Y1tlXTswPT09ci51c2VDb3VudCsrJiYodGhpcy5fbGVuZEJpbmRpbmcociksci5zYXZlT3JpZ2luYWxTdGF0ZSgpKX10aGlzLl9sZW5kQWN0aW9uKGEpfX0sCl9kZWFjdGl2YXRlQWN0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKGEpKXtmb3IodmFyIGM9YS5fcHJvcGVydHlCaW5kaW5ncyxlPTAsZz1jLmxlbmd0aDtlIT09ZzsrK2Upe3ZhciByPWNbZV07MD09PS0tci51c2VDb3VudCYmKHIucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl90YWtlQmFja0JpbmRpbmcocikpfXRoaXMuX3Rha2VCYWNrQWN0aW9uKGEpfX0sX2luaXRNZW1vcnlNYW5hZ2VyOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aW9ucz1bXTt0aGlzLl9uQWN0aXZlQWN0aW9ucz0wO3RoaXMuX2FjdGlvbnNCeUNsaXA9e307dGhpcy5fYmluZGluZ3M9W107dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTA7dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9O3RoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W107dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDt2YXIgYT10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiBhLl9hY3Rpb25zLmxlbmd0aH0sCmdldCBpblVzZSgpe3JldHVybiBhLl9uQWN0aXZlQWN0aW9uc319LGJpbmRpbmdzOntnZXQgdG90YWwoKXtyZXR1cm4gYS5fYmluZGluZ3MubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUJpbmRpbmdzfX0sY29udHJvbEludGVycG9sYW50czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGEuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHN9fX19LF9pc0FjdGl2ZUFjdGlvbjpmdW5jdGlvbihhKXthPWEuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1hJiZhPHRoaXMuX25BY3RpdmVBY3Rpb25zfSxfYWRkSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX2FjdGlvbnMscj10aGlzLl9hY3Rpb25zQnlDbGlwLHY9cltjXTt2b2lkIDA9PT12Pyh2PXtrbm93bkFjdGlvbnM6W2FdLGFjdGlvbkJ5Um9vdDp7fX0sYS5fYnlDbGlwQ2FjaGVJbmRleD0wLHJbY109dik6KGM9CnYua25vd25BY3Rpb25zLGEuX2J5Q2xpcENhY2hlSW5kZXg9Yy5sZW5ndGgsYy5wdXNoKGEpKTthLl9jYWNoZUluZGV4PWcubGVuZ3RoO2cucHVzaChhKTt2LmFjdGlvbkJ5Um9vdFtlXT1hfSxfcmVtb3ZlSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9ucyxlPWNbYy5sZW5ndGgtMV0sZz1hLl9jYWNoZUluZGV4O2UuX2NhY2hlSW5kZXg9ZztjW2ddPWU7Yy5wb3AoKTthLl9jYWNoZUluZGV4PW51bGw7Yz1hLl9jbGlwLnV1aWQ7ZT10aGlzLl9hY3Rpb25zQnlDbGlwO2c9ZVtjXTt2YXIgcj1nLmtub3duQWN0aW9ucyx2PXJbci5sZW5ndGgtMV0sej1hLl9ieUNsaXBDYWNoZUluZGV4O3YuX2J5Q2xpcENhY2hlSW5kZXg9ejtyW3pdPXY7ci5wb3AoKTthLl9ieUNsaXBDYWNoZUluZGV4PW51bGw7ZGVsZXRlIGcuYWN0aW9uQnlSb290WyhhLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWRdOzA9PT1yLmxlbmd0aCYmZGVsZXRlIGVbY107dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihhKX0sCl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOmZ1bmN0aW9uKGEpe2E9YS5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2MhPT1lOysrYyl7dmFyIGc9YVtjXTswPT09LS1nLnJlZmVyZW5jZUNvdW50JiZ0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoZyl9fSxfbGVuZEFjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zLGU9YS5fY2FjaGVJbmRleCxnPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscj1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7ci5fY2FjaGVJbmRleD1lO2NbZV09cn0sX3Rha2VCYWNrQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2FjdGlvbnMsZT1hLl9jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfYWRkSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCnI9Z1tjXSx2PXRoaXMuX2JpbmRpbmdzO3ZvaWQgMD09PXImJihyPXt9LGdbY109cik7cltlXT1hO2EuX2NhY2hlSW5kZXg9di5sZW5ndGg7di5wdXNoKGEpfSxfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2JpbmRpbmdzLGU9YS5iaW5kaW5nLGc9ZS5yb290Tm9kZS51dWlkO2U9ZS5wYXRoO3ZhciByPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSx2PXJbZ10sej1jW2MubGVuZ3RoLTFdO2E9YS5fY2FjaGVJbmRleDt6Ll9jYWNoZUluZGV4PWE7Y1thXT16O2MucG9wKCk7ZGVsZXRlIHZbZV07MD09PU9iamVjdC5rZXlzKHYpLmxlbmd0aCYmZGVsZXRlIHJbZ119LF9sZW5kQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfdGFrZUJhY2tCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfbGVuZENvbnRyb2xJbnRlcnBvbGFudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsYz10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrLGU9YVtjXTt2b2lkIDA9PT1lJiYoZT1uZXcgWWYobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksZS5fX2NhY2hlSW5kZXg9YyxhW2NdPWUpO3JldHVybiBlfSxfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxlPWEuX19jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxyPWNbZ107YS5fX2NhY2hlSW5kZXg9Cmc7Y1tnXT1hO3IuX19jYWNoZUluZGV4PWU7Y1tlXT1yfSxfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjpuZXcgRmxvYXQzMkFycmF5KDEpLGNsaXBBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290LGc9ZS51dWlkO2U9InN0cmluZyI9PT10eXBlb2YgYT90Yy5maW5kQnlOYW1lKGUsYSk6YTthPW51bGwhPT1lP2UudXVpZDphO3ZhciByPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV0sdj1udWxsO2lmKHZvaWQgMCE9PXIpe3Y9ci5hY3Rpb25CeVJvb3RbZ107aWYodm9pZCAwIT09dilyZXR1cm4gdjt2PXIua25vd25BY3Rpb25zWzBdO251bGw9PT1lJiYoZT12Ll9jbGlwKX1pZihudWxsPT09ZSlyZXR1cm4gbnVsbDtjPW5ldyBUaih0aGlzLGUsYyk7dGhpcy5fYmluZEFjdGlvbihjLHYpO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGMsYSxnKTtyZXR1cm4gY30sZXhpc3RpbmdBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290O2M9ZS51dWlkOwplPSJzdHJpbmciPT09dHlwZW9mIGE/dGMuZmluZEJ5TmFtZShlLGEpOmE7YT10aGlzLl9hY3Rpb25zQnlDbGlwW2U/ZS51dWlkOmFdO3JldHVybiB2b2lkIDAhPT1hP2EuYWN0aW9uQnlSb290W2NdfHxudWxsOm51bGx9LHN0b3BBbGxBY3Rpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYWN0aW9ucyxjPXRoaXMuX25BY3RpdmVBY3Rpb25zLGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl9uQWN0aXZlQmluZGluZ3Mscj10aGlzLl9uQWN0aXZlQmluZGluZ3M9dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDtyIT09YzsrK3IpYVtyXS5yZXNldCgpO2ZvcihyPTA7ciE9PWc7KytyKWVbcl0udXNlQ291bnQ9MDtyZXR1cm4gdGhpc30sdXBkYXRlOmZ1bmN0aW9uKGEpe2EqPXRoaXMudGltZVNjYWxlO2Zvcih2YXIgYz10aGlzLl9hY3Rpb25zLGU9dGhpcy5fbkFjdGl2ZUFjdGlvbnMsZz10aGlzLnRpbWUrPWEscj1NYXRoLnNpZ24oYSksdj10aGlzLl9hY2N1SW5kZXhePTEsej0wO3ohPT1lOysreiljW3pdLl91cGRhdGUoZywKYSxyLHYpO2E9dGhpcy5fYmluZGluZ3M7Yz10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKHo9MDt6IT09YzsrK3opYVt6XS5hcHBseSh2KTtyZXR1cm4gdGhpc30sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSx1bmNhY2hlQ2xpcDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zO2E9YS51dWlkO3ZhciBlPXRoaXMuX2FjdGlvbnNCeUNsaXAsZz1lW2FdO2lmKHZvaWQgMCE9PWcpe2c9Zy5rbm93bkFjdGlvbnM7Zm9yKHZhciByPTAsdj1nLmxlbmd0aDtyIT09djsrK3Ipe3ZhciB6PWdbcl07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbih6KTt2YXIgRT16Ll9jYWNoZUluZGV4LEY9Y1tjLmxlbmd0aC0xXTt6Ll9jYWNoZUluZGV4PW51bGw7ei5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO0YuX2NhY2hlSW5kZXg9RTtjW0VdPUY7Yy5wb3AoKTt0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHopfWRlbGV0ZSBlW2FdfX0sdW5jYWNoZVJvb3Q6ZnVuY3Rpb24oYSl7YT0KYS51dWlkO3ZhciBjPXRoaXMuX2FjdGlvbnNCeUNsaXA7Zm9yKGcgaW4gYyl7dmFyIGU9Y1tnXS5hY3Rpb25CeVJvb3RbYV07dm9pZCAwIT09ZSYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oZSksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oZSkpfXZhciBnPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVthXTtpZih2b2lkIDAhPT1nKWZvcih2YXIgciBpbiBnKWE9Z1tyXSxhLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGEpfSx1bmNhY2hlQWN0aW9uOmZ1bmN0aW9uKGEsYyl7YT10aGlzLmV4aXN0aW5nQWN0aW9uKGEsYyk7bnVsbCE9PWEmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGEpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGEpKX19KTtiaC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGJoKHZvaWQgMD09PXRoaXMudmFsdWUuY2xvbmU/dGhpcy52YWx1ZTp0aGlzLnZhbHVlLmNsb25lKCkpfTtyaS5wcm90b3R5cGU9Ck9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShRZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpyaSxpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiEwLGNvcHk6ZnVuY3Rpb24oYSl7UWQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihVai5wcm90b3R5cGUse2xpbmVQcmVjaXNpb246MSxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLnJheS5zZXQoYSxjKX0sc2V0RnJvbUNhbWVyYTpmdW5jdGlvbihhLGMpe2MmJmMuaXNQZXJzcGVjdGl2ZUNhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KGEueCxhLnksLjUpLnVucHJvamVjdChjKS5zdWIodGhpcy5yYXkub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzLmNhbWVyYT1jKTpjJiZjLmlzT3J0aG9ncmFwaGljQ2FtZXJhPwoodGhpcy5yYXkub3JpZ2luLnNldChhLngsYS55LChjLm5lYXIrYy5mYXIpLyhjLm5lYXItYy5mYXIpKS51bnByb2plY3QoYyksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1jKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLiIpfSxpbnRlcnNlY3RPYmplY3Q6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8W107c2koYSx0aGlzLGUsYyk7ZS5zb3J0KFZqKTtyZXR1cm4gZX0saW50ZXJzZWN0T2JqZWN0czpmdW5jdGlvbihhLGMsZSl7ZT1lfHxbXTtpZighMT09PUFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHM6IG9iamVjdHMgaXMgbm90IGFuIEFycmF5LiIpLGU7Zm9yKHZhciBnPTAscj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sdGhpcyxlLGMpO2Uuc29ydChWaik7cmV0dXJuIGV9fSk7Ck9iamVjdC5hc3NpZ24oV2oucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucmFkaXVzPWE7dGhpcy5waGk9Yzt0aGlzLnRoZXRhPWU7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucmFkaXVzPWEucmFkaXVzO3RoaXMucGhpPWEucGhpO3RoaXMudGhldGE9YS50aGV0YTtyZXR1cm4gdGhpc30sbWFrZVNhZmU6ZnVuY3Rpb24oKXt0aGlzLnBoaT1NYXRoLm1heCgxRS02LE1hdGgubWluKE1hdGguUEktMUUtNix0aGlzLnBoaSkpO3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGEueCxhLnksYS56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGEqYStjKmMrZSplKTswPT09dGhpcy5yYWRpdXM/dGhpcy5waGk9CnRoaXMudGhldGE9MDoodGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsZSksdGhpcy5waGk9TWF0aC5hY29zKGhiLmNsYW1wKGMvdGhpcy5yYWRpdXMsLTEsMSkpKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFhqLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1hO3RoaXMudGhldGE9Yzt0aGlzLnk9ZTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5yYWRpdXM9YS5yYWRpdXM7dGhpcy50aGV0YT1hLnRoZXRhO3RoaXMueT1hLnk7cmV0dXJuIHRoaXN9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoYS54LGEueSxhLnopfSxzZXRGcm9tQ2FydGVzaWFuQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1NYXRoLnNxcnQoYSphK2UqZSk7dGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsCmUpO3RoaXMueT1jO3JldHVybiB0aGlzfX0pO3ZhciB5az1uZXcgZjtPYmplY3QuYXNzaWduKHRpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5taW4uY29weShhKTt0aGlzLm1heC5jb3B5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMuZXhwYW5kQnlQb2ludChhW2NdKTtyZXR1cm4gdGhpc30sc2V0RnJvbUNlbnRlckFuZFNpemU6ZnVuY3Rpb24oYSxjKXtjPXlrLmNvcHkoYykubXVsdGlwbHlTY2FsYXIoLjUpO3RoaXMubWluLmNvcHkoYSkuc3ViKGMpO3RoaXMubWF4LmNvcHkoYSkuYWRkKGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm1pbi5jb3B5KGEubWluKTt0aGlzLm1heC5jb3B5KGEubWF4KTtyZXR1cm4gdGhpc30sCm1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT1JbmZpbml0eTt0aGlzLm1heC54PXRoaXMubWF4Lnk9LUluZmluaXR5O3JldHVybiB0aGlzfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLnN1YlZlY3RvcnModGhpcy5tYXgsCnRoaXMubWluKX0sZXhwYW5kQnlQb2ludDpmdW5jdGlvbihhKXt0aGlzLm1pbi5taW4oYSk7dGhpcy5tYXgubWF4KGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVZlY3RvcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5zdWIoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGRTY2FsYXIoLWEpO3RoaXMubWF4LmFkZFNjYWxhcihhKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnk/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApjPW5ldyBmKTtyZXR1cm4gYy5zZXQoKGEueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYS55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXgueDx0aGlzLm1pbi54fHxhLm1pbi54PnRoaXMubWF4Lnh8fGEubWF4Lnk8dGhpcy5taW4ueXx8YS5taW4ueT50aGlzLm1heC55PyExOiEwfSxjbGFtcFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgZik7cmV0dXJuIGMuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4geWsuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuc3ViKGEpLmxlbmd0aCgpfSxpbnRlcnNlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWF4KGEubWluKTsKdGhpcy5tYXgubWluKGEubWF4KTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1pbi5lcXVhbHModGhpcy5taW4pJiZhLm1heC5lcXVhbHModGhpcy5tYXgpfX0pO3ZhciB6az1uZXcgayx6aD1uZXcgaztPYmplY3QuYXNzaWduKHVpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5zdGFydC5jb3B5KGEpO3RoaXMuZW5kLmNvcHkoYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuY29weShhLnN0YXJ0KTt0aGlzLmVuZC5jb3B5KGEuZW5kKTtyZXR1cm4gdGhpc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX0sZGVsdGE6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5kZWx0YSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfSxkaXN0YW5jZVNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfSxkaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfSxhdDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz0KbmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGMpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcjpmdW5jdGlvbihhLGMpe3prLnN1YlZlY3RvcnMoYSx0aGlzLnN0YXJ0KTt6aC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2E9emguZG90KHprKS96aC5kb3QoemgpO2MmJihhPWhiLmNsYW1wKGEsMCwxKSk7cmV0dXJuIGF9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjLGUpe2E9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGEsYyk7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KGEpOwp0aGlzLmVuZC5hcHBseU1hdHJpeDQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJmEuZW5kLmVxdWFscyh0aGlzLmVuZCl9fSk7Y2cucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO2NnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZztjZy5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Q9ITA7dmFyIFpjPW5ldyBrLG9kPW5ldyBrLFJpPW5ldyB0LFdtPVsiYSIsImIiLCJjIl07ZGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtkZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGc7ZGcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtSaS5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBhPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLAplPXRoaXMub2JqZWN0Lmdlb21ldHJ5O2lmKGUmJmUuaXNHZW9tZXRyeSlmb3IodmFyIGc9ZS52ZXJ0aWNlcyxyPWUuZmFjZXMsdj1lPTAsej1yLmxlbmd0aDt2PHo7disrKWZvcih2YXIgRT1yW3ZdLEY9MCxKPUUudmVydGV4Tm9ybWFscy5sZW5ndGg7RjxKO0YrKyl7dmFyIFA9RS52ZXJ0ZXhOb3JtYWxzW0ZdO1pjLmNvcHkoZ1tFW1dtW0ZdXV0pLmFwcGx5TWF0cml4NChhKTtvZC5jb3B5KFApLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpO2Muc2V0WFlaKGUsWmMueCxaYy55LFpjLnopO2UrPTE7Yy5zZXRYWVooZSxvZC54LG9kLnksb2Queik7ZSs9MX1lbHNlIGlmKGUmJmUuaXNCdWZmZXJHZW9tZXRyeSlmb3IoZz1lLmF0dHJpYnV0ZXMucG9zaXRpb24scj1lLmF0dHJpYnV0ZXMubm9ybWFsLEY9ZT0wLEo9Zy5jb3VudDtGPEo7RisrKVpjLnNldChnLmdldFgoRiksZy5nZXRZKEYpLGcuZ2V0WihGKSkuYXBwbHlNYXRyaXg0KGEpLApvZC5zZXQoci5nZXRYKEYpLHIuZ2V0WShGKSxyLmdldFooRikpLG9kLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpLGMuc2V0WFlaKGUsWmMueCxaYy55LFpjLnopLGUrPTEsYy5zZXRYWVooZSxvZC54LG9kLnksb2QueiksZSs9MTtjLm5lZWRzVXBkYXRlPSEwfTt2YXIgQWs9bmV3IGs7WGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO1hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZTtYZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX07WGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt2YXIgYT10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6MUUzLGM9YSpNYXRoLnRhbih0aGlzLmxpZ2h0LmFuZ2xlKTsKdGhpcy5jb25lLnNjYWxlLnNldChjLGMsYSk7QWsuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTt0aGlzLmNvbmUubG9va0F0KEFrKTt2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9O3ZhciBJZD1uZXcgayxBaD1uZXcgcSxTaT1uZXcgcTtZZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO1llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZTtZZS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5ib25lcyxlPXRoaXMuZ2VvbWV0cnksZz1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtTaS5nZXRJbnZlcnNlKHRoaXMucm9vdC5tYXRyaXhXb3JsZCk7Zm9yKHZhciByPTAsdj0wO3I8Yy5sZW5ndGg7cisrKXt2YXIgej1jW3JdO3oucGFyZW50JiYKei5wYXJlbnQuaXNCb25lJiYoQWgubXVsdGlwbHlNYXRyaWNlcyhTaSx6Lm1hdHJpeFdvcmxkKSxJZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oQWgpLGcuc2V0WFlaKHYsSWQueCxJZC55LElkLnopLEFoLm11bHRpcGx5TWF0cmljZXMoU2ksei5wYXJlbnQubWF0cml4V29ybGQpLElkLnNldEZyb21NYXRyaXhQb3NpdGlvbihBaCksZy5zZXRYWVoodisxLElkLngsSWQueSxJZC56KSx2Kz0yKX1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMDtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSl9O1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7WmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVplO1plLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O1plLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmNvbG9yPwp0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9OyRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7JGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRlOyRlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlLnNldCguNSp0aGlzLmxpZ2h0LndpZHRoLC41KnRoaXMubGlnaHQuaGVpZ2h0LDEpO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXt0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcikubXVsdGlwbHlTY2FsYXIodGhpcy5saWdodC5pbnRlbnNpdHkpO3ZhciBhPXRoaXMubWF0ZXJpYWwuY29sb3IsYz1NYXRoLm1heChhLnIsYS5nLGEuYik7MTxjJiZhLm11bHRpcGx5U2NhbGFyKDEvCmMpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLm1hdGVyaWFsLmNvbG9yKX19OyRlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O3ZhciBYbT1uZXcgayxCaz1uZXcgSSxDaz1uZXcgSTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7YWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFmO2FmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O2FmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoaWxkcmVuWzBdO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7CmVsc2V7dmFyIGM9YS5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7QmsuY29weSh0aGlzLmxpZ2h0LmNvbG9yKTtDay5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2Zvcih2YXIgZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXt2YXIgcj1lPGcvMj9CazpDaztjLnNldFhZWihlLHIucixyLmcsci5iKX1jLm5lZWRzVXBkYXRlPSEwfWEubG9va0F0KFhtLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKS5uZWdhdGUoKSl9O2JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7YmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJmO2JmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O2JmLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbigpe3RoaXMucG9zaXRpb24uY29weSh0aGlzLmxpZ2h0UHJvYmUucG9zaXRpb24pO3RoaXMuc2NhbGUuc2V0KDEsCjEsMSkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKTt0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmludGVuc2l0eS52YWx1ZT10aGlzLmxpZ2h0UHJvYmUuaW50ZW5zaXR5fTtjaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmNoLGNvcHk6ZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ2VvbWV0cnkuY29weShhLmdlb21ldHJ5KTt0aGlzLm1hdGVyaWFsLmNvcHkoYS5tYXRlcmlhbCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX0pO2RoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZGgucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRoO2NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7Y2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNmO2NmLnByb3RvdHlwZS51cGRhdGU9CmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShXLGhhLGZhLHJhKXtmYT0oaGEtVykvZmE7Vi5zZXRYWVooRiwwLDAsMCk7SisrO2ZvcihQPVc7UDxoYTtQKz1mYSlSPUYrSixWLnNldFhZWihSLE1hdGguc2luKFApKmUsMCxNYXRoLmNvcyhQKSplKSxWLnNldFhZWihSKzEsTWF0aC5zaW4oTWF0aC5taW4oUCtmYSxoYSkpKmUsMCxNYXRoLmNvcyhNYXRoLm1pbihQK2ZhLGhhKSkqZSksVi5zZXRYWVooUisyLDAsMCwwKSxKKz0zO1MuYWRkR3JvdXAoRixKLHJhKTtGKz1KO0o9MH12YXIgYz10aGlzLmF1ZGlvLGU9dGhpcy5yYW5nZSxnPXRoaXMuZGl2aXNpb25zSW5uZXJBbmdsZSxyPXRoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZSx2PWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVJbm5lckFuZ2xlKTtjPWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVPdXRlckFuZ2xlKTt2YXIgej12LzIsRT1jLzIsRj0wLEo9MCxQLFIsUz10aGlzLmdlb21ldHJ5LFY9Uy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1MuY2xlYXJHcm91cHMoKTsKYSgtRSwteixyLDApO2EoLXoseixnLDEpO2EoeixFLHIsMCk7Vi5uZWVkc1VwZGF0ZT0hMDt2PT09YyYmKHRoaXMubWF0ZXJpYWxbMF0udmlzaWJsZT0hMSl9O2NmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFswXS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFsxXS5kaXNwb3NlKCl9O3ZhciBxZz1uZXcgayxCaD1uZXcgayxEaz1uZXcgdDtlZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2VnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lZztlZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoITApO0RrLmdldE5vcm1hbE1hdHJpeCh0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCk7dmFyIGE9dGhpcy5vYmplY3QubWF0cml4V29ybGQsYz10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm9iamVjdC5nZW9tZXRyeSxnPQplLnZlcnRpY2VzO2U9ZS5mYWNlcztmb3IodmFyIHI9MCx2PTAsej1lLmxlbmd0aDt2PHo7disrKXt2YXIgRT1lW3ZdLEY9RS5ub3JtYWw7cWcuY29weShnW0UuYV0pLmFkZChnW0UuYl0pLmFkZChnW0UuY10pLmRpdmlkZVNjYWxhcigzKS5hcHBseU1hdHJpeDQoYSk7QmguY29weShGKS5hcHBseU1hdHJpeDMoRGspLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKHFnKTtjLnNldFhZWihyLHFnLngscWcueSxxZy56KTtyKz0xO2Muc2V0WFlaKHIsQmgueCxCaC55LEJoLnopO3IrPTF9Yy5uZWVkc1VwZGF0ZT0hMH07dmFyIEVrPW5ldyBrLENoPW5ldyBrLEZrPW5ldyBrO2RmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtkZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGY7ZGYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7CnRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKX07ZGYucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe0VrLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTtDaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpO0ZrLnN1YlZlY3RvcnMoQ2gsRWspO3RoaXMubGlnaHRQbGFuZS5sb29rQXQoQ2gpO3ZvaWQgMCE9PXRoaXMuY29sb3I/KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSk6KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpKTt0aGlzLnRhcmdldExpbmUubG9va0F0KENoKTsKdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9RmsubGVuZ3RoKCl9O3ZhciBlaD1uZXcgayxPYj1uZXcgemI7ZmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtmZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Zmc7ZmcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnksYz10aGlzLnBvaW50TWFwO09iLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpO1BiKCJjIixjLGEsT2IsMCwwLC0xKTtQYigidCIsYyxhLE9iLDAsMCwxKTtQYigibjEiLGMsYSxPYiwtMSwtMSwtMSk7UGIoIm4yIixjLGEsT2IsMSwtMSwtMSk7UGIoIm4zIixjLGEsT2IsLTEsMSwtMSk7UGIoIm40IixjLGEsT2IsMSwxLC0xKTtQYigiZjEiLGMsYSxPYiwtMSwtMSwxKTtQYigiZjIiLGMsYSxPYiwxLC0xLDEpO1BiKCJmMyIsYyxhLE9iLC0xLDEsMSk7UGIoImY0IixjLGEsT2IsMSwxLDEpO1BiKCJ1MSIsCmMsYSxPYiwuNywxLjEsLTEpO1BiKCJ1MiIsYyxhLE9iLC0uNywxLjEsLTEpO1BiKCJ1MyIsYyxhLE9iLDAsMiwtMSk7UGIoImNmMSIsYyxhLE9iLC0xLDAsMSk7UGIoImNmMiIsYyxhLE9iLDEsMCwxKTtQYigiY2YzIixjLGEsT2IsMCwtMSwxKTtQYigiY2Y0IixjLGEsT2IsMCwxLDEpO1BiKCJjbjEiLGMsYSxPYiwtMSwwLC0xKTtQYigiY24yIixjLGEsT2IsMSwwLC0xKTtQYigiY24zIixjLGEsT2IsMCwtMSwtMSk7UGIoImNuNCIsYyxhLE9iLDAsMSwtMSk7YS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITB9O3ZhciBEaD1uZXcgdztoZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2hkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZDtoZC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEmJmNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIik7dm9pZCAwIT09CnRoaXMub2JqZWN0JiZEaC5zZXRGcm9tT2JqZWN0KHRoaXMub2JqZWN0KTtpZighRGguaXNFbXB0eSgpKXthPURoLm1pbjt2YXIgYz1EaC5tYXgsZT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZz1lLmFycmF5O2dbMF09Yy54O2dbMV09Yy55O2dbMl09Yy56O2dbM109YS54O2dbNF09Yy55O2dbNV09Yy56O2dbNl09YS54O2dbN109YS55O2dbOF09Yy56O2dbOV09Yy54O2dbMTBdPWEueTtnWzExXT1jLno7Z1sxMl09Yy54O2dbMTNdPWMueTtnWzE0XT1hLno7Z1sxNV09YS54O2dbMTZdPWMueTtnWzE3XT1hLno7Z1sxOF09YS54O2dbMTldPWEueTtnWzIwXT1hLno7Z1syMV09Yy54O2dbMjJdPWEueTtnWzIzXT1hLno7ZS5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfX07aGQucHJvdG90eXBlLnNldEZyb21PYmplY3Q9ZnVuY3Rpb24oYSl7dGhpcy5vYmplY3Q9YTt0aGlzLnVwZGF0ZSgpO3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY29weT0KZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMub2JqZWN0PWEub2JqZWN0O3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9O2dnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7Z2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWdnO2dnLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmJveDtjLmlzRW1wdHkoKXx8KGMuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGMuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSkpfTtoZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpO2hnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZztoZy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9CmZ1bmN0aW9uKGEpe3ZhciBjPS10aGlzLnBsYW5lLmNvbnN0YW50OzFFLTg+TWF0aC5hYnMoYykmJihjPTFFLTgpO3RoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsYyk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5zaWRlPTA+Yz8xOjA7dGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpO0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKX07dmFyIEdrPW5ldyBrLGZoLHZpO2lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtpZC5wcm90b3R5cGUuY29uc3RydWN0b3I9aWQ7aWQucHJvdG90eXBlLnNldERpcmVjdGlvbj1mdW5jdGlvbihhKXsuOTk5OTk8YS55P3RoaXMucXVhdGVybmlvbi5zZXQoMCwwLDAsMSk6LS45OTk5OT5hLnk/dGhpcy5xdWF0ZXJuaW9uLnNldCgxLDAsMCwwKTooR2suc2V0KGEueiwwLC1hLngpLm5vcm1hbGl6ZSgpLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKEdrLE1hdGguYWNvcyhhLnkpKSl9OwppZC5wcm90b3R5cGUuc2V0TGVuZ3RoPWZ1bmN0aW9uKGEsYyxlKXt2b2lkIDA9PT1jJiYoYz0uMiphKTt2b2lkIDA9PT1lJiYoZT0uMipjKTt0aGlzLmxpbmUuc2NhbGUuc2V0KDEsTWF0aC5tYXgoMCxhLWMpLDEpO3RoaXMubGluZS51cGRhdGVNYXRyaXgoKTt0aGlzLmNvbmUuc2NhbGUuc2V0KGUsYyxlKTt0aGlzLmNvbmUucG9zaXRpb24ueT1hO3RoaXMuY29uZS51cGRhdGVNYXRyaXgoKX07aWQucHJvdG90eXBlLnNldENvbG9yPWZ1bmN0aW9uKGEpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoYSk7dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldChhKX07aWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSwhMSk7dGhpcy5saW5lLmNvcHkoYS5saW5lKTt0aGlzLmNvbmUuY29weShhLmNvbmUpO3JldHVybiB0aGlzfTtpZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9OwppZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2lnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pZztaYS5jcmVhdGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLmxvZygiVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCIpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucHJvdG90eXBlLmdldFBvaW50PWM7cmV0dXJuIGF9O09iamVjdC5hc3NpZ24oZ2QucHJvdG90eXBlLHtjcmVhdGVQb2ludHNHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7YT10aGlzLmdldFBvaW50cyhhKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShhKX0sY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpOwphPXRoaXMuZ2V0U3BhY2VkUG9pbnRzKGEpO3JldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KGEpfSxjcmVhdGVHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7Zm9yKHZhciBjPW5ldyB5YSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MudmVydGljZXMucHVzaChuZXcgayhyLngsci55LHIuenx8MCkpfXJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oR2MucHJvdG90eXBlLHtmcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIik7dGhpcy5zZXRGcm9tUG9pbnRzKGEpfX0pO1pqLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7CmFrLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7d2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmIucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHdpLnByb3RvdHlwZSx7aW5pdEZyb21BcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRDb250cm9sUG9pbnRzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO2NoLnByb3RvdHlwZS5zZXRDb2xvcnM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuIil9OwpZZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuIil9O09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4iKTtyZXR1cm4gUGkuZXh0cmFjdFVybEJhc2UoYSl9fSk7T2JqZWN0LmFzc2lnbihaZy5wcm90b3R5cGUse3NldFRleHR1cmVQYXRoOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4iKTtyZXR1cm4gdGhpcy5zZXRSZXNvdXJjZVBhdGgoYSl9fSk7T2JqZWN0LmFzc2lnbih0aS5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChhKX0sc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSwKe2NlbnRlcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKTtyZXR1cm4gdGhpcy5nZXRDZW50ZXIoYSl9LGVtcHR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfSxpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGEpfSwKc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7dWkucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfTtPYmplY3QuYXNzaWduKGhiLHtyYW5kb20xNjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4iKTtyZXR1cm4gTWF0aC5yYW5kb20oKX0sbmVhcmVzdFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4iKTsKcmV0dXJuIGhiLmZsb29yUG93ZXJPZlR3byhhKX0sbmV4dFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmV4dFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jZWlsUG93ZXJPZlR3bygpLiIpO3JldHVybiBoYi5jZWlsUG93ZXJPZlR3byhhKX19KTtPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LG11bHRpcGx5VmVjdG9yMzpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseU1hdHJpeDModGhpcyl9LAptdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFwcGx5VG9CdWZmZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGEpfSxhcHBseVRvVmVjdG9yM0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24ocS5wcm90b3R5cGUse2V4dHJhY3RQb3NpdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKGEpfSxmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBrKS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMyl9LHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuIik7CnJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKGEpfSxtdWx0aXBseVRvQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVBeGlzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuIik7YS50cmFuc2Zvcm1EaXJlY3Rpb24odGhpcyl9LGNyb3NzVmVjdG9yOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmNyb3NzVmVjdG9yKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnJvdGF0ZVo6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZUJ5QXhpczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShhKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbWFrZUZydXN0dW06ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4iKTsKcmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKGEsYyxnLGUscix2KX19KTtIYi5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKGEpfTtoLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseVF1YXRlcm5pb24odGhpcyl9O09iamVjdC5hc3NpZ24oRC5wcm90b3R5cGUse2lzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7CnJldHVybiB0aGlzLmludGVyc2VjdHNCb3goYSl9LGlzSW50ZXJzZWN0aW9uUGxhbmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7YXJlYTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLiIpO3JldHVybiB0aGlzLmdldEFyZWEoKX0sYmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoYSxjKX0sbWlkcG9pbnQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4iKTtyZXR1cm4gdGhpcy5nZXRNaWRwb2ludChhKX0sbm9ybWFsOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gdGhpcy5nZXROb3JtYWwoYSl9LHBsYW5lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuIik7cmV0dXJuIHRoaXMuZ2V0UGxhbmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLAp7YmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsYyxlLGcscil7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpO3JldHVybiBCLmdldEJhcnljb29yZChhLGMsZSxnLHIpfSxub3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpO3JldHVybiBCLmdldE5vcm1hbChhLGMsZSxnKX19KTtPYmplY3QuYXNzaWduKENkLnByb3RvdHlwZSx7ZXh0cmFjdEFsbFBvaW50czpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyhhKX0sZXh0cnVkZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gbmV3IFVkKHRoaXMsYSl9LG1ha2VHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgVmQodGhpcyxhKX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxkaXN0YW5jZVRvTWFuaGF0dGFuOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyhhKX0sCmxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse3NldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuIil9LHNldEV1bGVyRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuIil9LGdldFBvc2l0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEpfSxnZXRTY2FsZUZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKGEpfSxnZXRDb2x1bW5Gcm9tTWF0cml4OmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4iKTtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGMsYSl9LGFwcGx5UHJvamVjdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEpfSwKZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYSl9LGxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24ocC5wcm90b3R5cGUsCntmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKHlhLnByb3RvdHlwZSx7Y29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpIGluc3RlYWQuIil9fSk7Ck9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUse2dldENoaWxkQnlOYW1lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLiIpO3JldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZShhKX0scmVuZGVyRGVwdGg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4iKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGMsYSl9LGdldFdvcmxkUm90YXRpb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLnByb3RvdHlwZSx7ZXVsZXJPcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKTtyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcn0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7dGhpcy5yb3RhdGlvbi5vcmRlcj1hfX0sdXNlUXVhdGVybmlvbjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX19fSk7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFmLnByb3RvdHlwZSx7b2JqZWN0czp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4iKTtyZXR1cm4gdGhpcy5sZXZlbHN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDZy5wcm90b3R5cGUsInVzZVZlcnRleFRleHR1cmUiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtCZi5wcm90b3R5cGUuaW5pdEJvbmVzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuIil9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaYS5wcm90b3R5cGUsCiJfX2FyY0xlbmd0aERpdmlzaW9ucyIse2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4iKTtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YX19KTt2Yi5wcm90b3R5cGUuc2V0TGVucz1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iKTt2b2lkIDAhPT1jJiYodGhpcy5maWxtR2F1Z2U9Yyk7dGhpcy5zZXRGb2NhbExlbmd0aChhKX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSmIucHJvdG90eXBlLAp7b25seVNoYWRvdzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHNoYWRvd0NhbWVyYUZvdjp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZm92PWF9fSxzaGFkb3dDYW1lcmFMZWZ0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQ9YX19LHNoYWRvd0NhbWVyYVJpZ2h0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4iKTt0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQ9YX19LHNoYWRvd0NhbWVyYVRvcDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4iKTsKdGhpcy5zaGFkb3cuY2FtZXJhLnRvcD1hfX0sc2hhZG93Q2FtZXJhQm90dG9tOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5ib3R0b209YX19LHNoYWRvd0NhbWVyYU5lYXI6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEubmVhcj1hfX0sc2hhZG93Q2FtZXJhRmFyOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZmFyLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5mYXI9YX19LHNoYWRvd0NhbWVyYVZpc2libGU6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4iKX19LApzaGFkb3dCaWFzOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4iKTt0aGlzLnNoYWRvdy5iaWFzPWF9fSxzaGFkb3dEYXJrbmVzczp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dNYXBXaWR0aDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLiIpO3RoaXMuc2hhZG93Lm1hcFNpemUud2lkdGg9YX19LHNoYWRvd01hcEhlaWdodDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuIik7dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQ9YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUS5wcm90b3R5cGUsCntsZW5ndGg6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcnJheS5sZW5ndGh9fSxjb3B5SW5kaWNlc0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuY29weUluZGljZXNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmFzc2lnbih2YS5wcm90b3R5cGUse2FkZEluZGV4OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuIik7dGhpcy5zZXRJbmRleChhKX0sYWRkRHJhd0NhbGw6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4iKTsKY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLiIpO3RoaXMuYWRkR3JvdXAoYSxjKX0sY2xlYXJEcmF3Q2FsbHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuIik7dGhpcy5jbGVhckdyb3VwcygpfSxjb21wdXRlVGFuZ2VudHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZU9mZnNldHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZhLnByb3RvdHlwZSx7ZHJhd2NhbGxzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7CnJldHVybiB0aGlzLmdyb3Vwc319LG9mZnNldHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4iKTtyZXR1cm4gdGhpcy5ncm91cHN9fX0pO09iamVjdC5hc3NpZ24oUmMucHJvdG90eXBlLHtnZXRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZUxpc3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiaC5wcm90b3R5cGUsCntkeW5hbWljOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlVuaWZvcm06IC5keW5hbWljIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLiIpfX0sb25VcGRhdGU6e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTS5wcm90b3R5cGUse3dyYXBBcm91bmQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxvdmVyZHJhdzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9LApzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuIik7cmV0dXJuIG5ldyBJfX0sc2hhZGluZzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIik7dGhpcy5mbGF0U2hhZGluZz0xPT09YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmMucHJvdG90eXBlLHttZXRhbDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLiIpOwpyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFiLnByb3RvdHlwZSx7ZGVyaXZhdGl2ZXM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTt0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM9YX19fSk7T2JqZWN0LmFzc2lnbihPaC5wcm90b3R5cGUsCntjbGVhclRhcmdldDpmdW5jdGlvbihhLGMsZSxnKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jbGVhclRhcmdldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgYW5kIC5jbGVhcigpIGluc3RlYWQuIik7dGhpcy5zZXRSZW5kZXJUYXJnZXQoYSk7dGhpcy5jbGVhcihjLGUsZyl9LGFuaW1hdGU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpO3RoaXMuc2V0QW5pbWF0aW9uTG9vcChhKX0sZ2V0Q3VycmVudFJlbmRlclRhcmdldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpO3JldHVybiB0aGlzLmdldFJlbmRlclRhcmdldCgpfSxnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sZ2V0UHJlY2lzaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpO3JldHVybiB0aGlzLmNhcGFiaWxpdGllcy5wcmVjaXNpb259LHJlc2V0R0xTdGF0ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4iKTtyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpfSxzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LApzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iil9LHN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpOwpyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LHN1cHBvcnRzQmxlbmRNaW5NYXg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKX0sc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxzdXBwb3J0c0luc3RhbmNlZEFycmF5czpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKX0sZW5hYmxlU2Npc3NvclRlc3Q6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuIik7dGhpcy5zZXRTY2lzc29yVGVzdChhKX0saW5pdE1hdGVyaWFsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkUHJlUGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCmFkZFBvc3RQbHVnaW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sdXBkYXRlU2hhZG93TWFwOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0RmFjZUN1bGxpbmc6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRGYWNlQ3VsbGluZygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFsbG9jVGV4dHVyZVVuaXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXRUZXh0dXJlMkQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlMkQoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0VGV4dHVyZUN1YmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlQ3ViZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdldEFjdGl2ZU1pcE1hcExldmVsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0QWN0aXZlTWlwTWFwTGV2ZWwoKSBpcyBub3cgLmdldEFjdGl2ZU1pcG1hcExldmVsKCkuIik7cmV0dXJuIHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPaC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpO3RoaXMuc2hhZG93TWFwLmVuYWJsZWQ9YX19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSwKc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4iKTt0aGlzLnNoYWRvd01hcC50eXBlPWF9fSxzaGFkb3dNYXBDdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LGNvbnRleHQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCl9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2ai5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sCnJlbmRlclNpbmdsZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE5iLnByb3RvdHlwZSx7YWN0aXZlQ3ViZUZhY2U6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlQ3ViZUZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fSwKYWN0aXZlTWlwTWFwTGV2ZWw6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlTWlwTWFwTGV2ZWwgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgV2ViR0xSZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoKS4iKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobS5wcm90b3R5cGUse3dyYXBTOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3JldHVybiB0aGlzLnRleHR1cmUud3JhcFN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3RoaXMudGV4dHVyZS53cmFwUz1hfX0sd3JhcFQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIik7CnJldHVybiB0aGlzLnRleHR1cmUud3JhcFR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpO3RoaXMudGV4dHVyZS53cmFwVD1hfX0sbWFnRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXJ9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcj1hfX0sbWluRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXJ9LApzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5taW5GaWx0ZXI9YX19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3JldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3RoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PWF9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldH0sCnNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7dGhpcy50ZXh0dXJlLm9mZnNldD1hfX0scmVwZWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7dGhpcy50ZXh0dXJlLnJlcGVhdD1hfX0sZm9ybWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7CnRoaXMudGV4dHVyZS5mb3JtYXQ9YX19LHR5cGU6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3JldHVybiB0aGlzLnRleHR1cmUudHlwZX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3RoaXMudGV4dHVyZS50eXBlPWF9fSxnZW5lcmF0ZU1pcG1hcHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwc30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTsKdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1hfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhOaC5wcm90b3R5cGUse3N0YW5kaW5nOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuIil9fSx1c2VySGVpZ2h0OntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnVzZXJIZWlnaHQgaGFzIGJlZW4gcmVtb3ZlZC4iKX19fSk7V2UucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuIik7dmFyIGM9dGhpczsobmV3ICRnKS5sb2FkKGEsZnVuY3Rpb24oZSl7Yy5zZXRCdWZmZXIoZSl9KTtyZXR1cm4gdGhpc307b2kucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuIik7CnJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKX07R2IucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXA9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4iKTtyZXR1cm4gdGhpcy51cGRhdGUoYSxjKX07RGQuY3Jvc3NPcmlnaW49dm9pZCAwO0RkLmxvYWRUZXh0dXJlPWZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuIik7dmFyIHI9bmV3IE1nO3Iuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7YT1yLmxvYWQoYSxlLHZvaWQgMCxnKTtjJiYoYS5tYXBwaW5nPWMpO3JldHVybiBhfTtEZC5sb2FkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpOwp2YXIgcj1uZXcgTGc7ci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTthPXIubG9hZChhLGUsdm9pZCAwLGcpO2MmJihhLm1hcHBpbmc9Yyk7cmV0dXJuIGF9O0RkLmxvYWRDb21wcmVzc2VkVGV4dHVyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX07RGQubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O2IuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nPTU7Yi5BZGRFcXVhdGlvbj0xMDA7Yi5BZGRPcGVyYXRpb249MjtiLkFkZGl0aXZlQmxlbmRpbmc9MjtiLkFscGhhRm9ybWF0PTEwMjE7Yi5BbHdheXNEZXB0aD0KMTtiLkFsd2F5c1N0ZW5jaWxGdW5jPTUxOTtiLkFtYmllbnRMaWdodD1UZztiLkFtYmllbnRMaWdodFByb2JlPWppO2IuQW5pbWF0aW9uQ2xpcD10YztiLkFuaW1hdGlvbkxvYWRlcj1haTtiLkFuaW1hdGlvbk1peGVyPXFpO2IuQW5pbWF0aW9uT2JqZWN0R3JvdXA9U2o7Yi5BbmltYXRpb25VdGlscz1UYjtiLkFyY0N1cnZlPVZlO2IuQXJyYXlDYW1lcmE9dmY7Yi5BcnJvd0hlbHBlcj1pZDtiLkF1ZGlvPVdlO2IuQXVkaW9BbmFseXNlcj1vaTtiLkF1ZGlvQ29udGV4dD1taTtiLkF1ZGlvTGlzdGVuZXI9bGk7Yi5BdWRpb0xvYWRlcj0kZztiLkF4ZXNIZWxwZXI9aWc7Yi5BeGlzSGVscGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQXhpc0hlbHBlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkF4ZXNIZWxwZXIuIik7cmV0dXJuIG5ldyBpZyhhKX07Yi5CYWNrU2lkZT0xO2IuQmFzaWNEZXB0aFBhY2tpbmc9MzIwMDtiLkJhc2ljU2hhZG93TWFwPTA7Yi5CaW5hcnlUZXh0dXJlTG9hZGVyPQpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4iKTtyZXR1cm4gbmV3IEtnKGEpfTtiLkJvbmU9VWg7Yi5Cb29sZWFuS2V5ZnJhbWVUcmFjaz1HZztiLkJvdW5kaW5nQm94SGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLiIpO3JldHVybiBuZXcgaGQoYSxjKX07Yi5Cb3gyPXRpO2IuQm94Mz13O2IuQm94M0hlbHBlcj1nZztiLkJveEJ1ZmZlckdlb21ldHJ5PVhhO2IuQm94R2VvbWV0cnk9U2E7Yi5Cb3hIZWxwZXI9aGQ7Yi5CdWZmZXJBdHRyaWJ1dGU9UTtiLkJ1ZmZlckdlb21ldHJ5PXZhO2IuQnVmZmVyR2VvbWV0cnlMb2FkZXI9WWc7Yi5CeXRlVHlwZT0xMDEwO2IuQ2FjaGU9aWU7Yi5DYW1lcmE9emI7Yi5DYW1lcmFIZWxwZXI9CmZnO2IuQ2FudmFzUmVuZGVyZXI9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiByZW1vdmVkIil9O2IuQ2FudmFzVGV4dHVyZT1DZjtiLkNhdG11bGxSb21DdXJ2ZTM9WmI7Yi5DaW5lb25Ub25lTWFwcGluZz00O2IuQ2lyY2xlQnVmZmVyR2VvbWV0cnk9UWU7Yi5DaXJjbGVHZW9tZXRyeT1YZjtiLkNsYW1wVG9FZGdlV3JhcHBpbmc9MTAwMTtiLkNsb2NrPWtpO2IuQ2xvc2VkU3BsaW5lQ3VydmUzPVpqO2IuQ29sb3I9STtiLkNvbG9yS2V5ZnJhbWVUcmFjaz1IZztiLkNvbXByZXNzZWRUZXh0dXJlPURlO2IuQ29tcHJlc3NlZFRleHR1cmVMb2FkZXI9Ymk7Yi5Db25lQnVmZmVyR2VvbWV0cnk9V2Y7Yi5Db25lR2VvbWV0cnk9VmY7Yi5DdWJlQ2FtZXJhPUdiO2IuQ3ViZUdlb21ldHJ5PVNhO2IuQ3ViZVJlZmxlY3Rpb25NYXBwaW5nPTMwMTtiLkN1YmVSZWZyYWN0aW9uTWFwcGluZz0zMDI7Yi5DdWJlVGV4dHVyZT1jZDtiLkN1YmVUZXh0dXJlTG9hZGVyPQpMZztiLkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nPTMwNjtiLkN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nPTMwNztiLkN1YmljQmV6aWVyQ3VydmU9Q2M7Yi5DdWJpY0JlemllckN1cnZlMz1UYztiLkN1YmljSW50ZXJwb2xhbnQ9RWc7Yi5DdWxsRmFjZUJhY2s9MTtiLkN1bGxGYWNlRnJvbnQ9MjtiLkN1bGxGYWNlRnJvbnRCYWNrPTM7Yi5DdWxsRmFjZU5vbmU9MDtiLkN1cnZlPVphO2IuQ3VydmVQYXRoPWdkO2IuQ3VzdG9tQmxlbmRpbmc9NTtiLkN5bGluZGVyQnVmZmVyR2VvbWV0cnk9ZmQ7Yi5DeWxpbmRlckdlb21ldHJ5PVhkO2IuQ3lsaW5kcmljYWw9WGo7Yi5EYXRhVGV4dHVyZT1BYjtiLkRhdGFUZXh0dXJlMkRBcnJheT1yZTtiLkRhdGFUZXh0dXJlM0Q9c2U7Yi5EYXRhVGV4dHVyZUxvYWRlcj1LZztiLkRlY3JlbWVudFN0ZW5jaWxPcD03NjgzO2IuRGVjcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NjtiLkRlZmF1bHRMb2FkaW5nTWFuYWdlcj1PajtiLkRlcHRoRm9ybWF0PTEwMjY7CmIuRGVwdGhTdGVuY2lsRm9ybWF0PTEwMjc7Yi5EZXB0aFRleHR1cmU9RGY7Yi5EaXJlY3Rpb25hbExpZ2h0PVNnO2IuRGlyZWN0aW9uYWxMaWdodEhlbHBlcj1kZjtiLkRpcmVjdGlvbmFsTGlnaHRTaGFkb3c9Umc7Yi5EaXNjcmV0ZUludGVycG9sYW50PUZnO2IuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SWU7Yi5Eb2RlY2FoZWRyb25HZW9tZXRyeT1KZjtiLkRvdWJsZVNpZGU9MjtiLkRzdEFscGhhRmFjdG9yPTIwNjtiLkRzdENvbG9yRmFjdG9yPTIwODtiLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXREeW5hbWljKCB0cnVlICkgaW5zdGVhZC4iKTtyZXR1cm4obmV3IFEoYSxjKSkuc2V0RHluYW1pYyghMCl9O2IuRWRnZXNHZW9tZXRyeT1QZTtiLkVkZ2VzSGVscGVyPWZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IEliKG5ldyBQZShhLmdlb21ldHJ5KSxuZXcgRmIoe2NvbG9yOnZvaWQgMCE9PWM/YzoxNjc3NzIxNX0pKX07Yi5FbGxpcHNlQ3VydmU9cGM7Yi5FcXVhbERlcHRoPTQ7Yi5FcXVhbFN0ZW5jaWxGdW5jPTUxNDtiLkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nPTMwMztiLkVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nPTMwNDtiLkV1bGVyPXU7Yi5FdmVudERpc3BhdGNoZXI9ZDtiLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeT1SYztiLkV4dHJ1ZGVHZW9tZXRyeT1VZDtiLkZhY2UzPUs7Yi5GYWNlND1mdW5jdGlvbihhLGMsZSxnLHIsdix6KXtjb25zb2xlLndhcm4oIlRIUkVFLkZhY2U0IGhhcyBiZWVuIHJlbW92ZWQuIEEgVEhSRUUuRmFjZTMgd2lsbCBiZSBjcmVhdGVkIGluc3RlYWQuIik7cmV0dXJuIG5ldyBLKGEsCmMsZSxyLHYseil9O2IuRmFjZUNvbG9ycz0xO2IuRmFjZU5vcm1hbHNIZWxwZXI9ZWc7Yi5GaWxlTG9hZGVyPXVjO2IuRmxhdFNoYWRpbmc9MTtiLkZsb2F0MzJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGNhKGEsYyl9O2IuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZT1jYTtiLkZsb2F0NjRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0NjRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDY0QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGthKGEsYyl9O2IuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZT1rYTtiLkZsb2F0VHlwZT0xMDE1O2IuRm9nPUFnO2IuRm9nRXhwMj16ZztiLkZvbnQ9Z2k7CmIuRm9udExvYWRlcj1oaTtiLkZyb250RmFjZURpcmVjdGlvbkNDVz0xO2IuRnJvbnRGYWNlRGlyZWN0aW9uQ1c9MDtiLkZyb250U2lkZT0wO2IuRnJ1c3R1bT1pYztiLkdhbW1hRW5jb2Rpbmc9MzAwNztiLkdlb21ldHJ5PXlhO2IuR2VvbWV0cnlVdGlscz17bWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLm1lcmdlKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSBpbnN0ZWFkLiIpO2lmKGMuaXNNZXNoKXtjLm1hdHJpeEF1dG9VcGRhdGUmJmMudXBkYXRlTWF0cml4KCk7dmFyIGc9Yy5tYXRyaXg7Yz1jLmdlb21ldHJ5fWEubWVyZ2UoYyxnLGUpfSxjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5HZW9tZXRyeVV0aWxzOiAuY2VudGVyKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5jZW50ZXIoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gYS5jZW50ZXIoKX19O2IuR3JlYXRlckRlcHRoPTY7Yi5HcmVhdGVyRXF1YWxEZXB0aD01O2IuR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM9NTE4O2IuR3JlYXRlclN0ZW5jaWxGdW5jPTUxNjtiLkdyaWRIZWxwZXI9Y2g7Yi5Hcm91cD11ZTtiLkhhbGZGbG9hdFR5cGU9MTAxNjtiLkhlbWlzcGhlcmVMaWdodD1OZztiLkhlbWlzcGhlcmVMaWdodEhlbHBlcj1hZjtiLkhlbWlzcGhlcmVMaWdodFByb2JlPWlpO2IuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeT1IZTtiLkljb3NhaGVkcm9uR2VvbWV0cnk9SWY7Yi5JbWFnZUJpdG1hcExvYWRlcj1laTtiLkltYWdlTG9hZGVyPVVlO2IuSW1hZ2VVdGlscz1EZDtiLkltbWVkaWF0ZVJlbmRlck9iamVjdD1jZztiLkluY3JlbWVudFN0ZW5jaWxPcD03NjgyO2IuSW5jcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NTtiLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT1YZztiLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PVdnO2IuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9CnJpO2IuSW50MTZBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgbGEoYSxjKX07Yi5JbnQxNkJ1ZmZlckF0dHJpYnV0ZT1sYTtiLkludDMyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGJhKGEsYyl9O2IuSW50MzJCdWZmZXJBdHRyaWJ1dGU9YmE7Yi5JbnQ4QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBUKGEsCmMpfTtiLkludDhCdWZmZXJBdHRyaWJ1dGU9VDtiLkludFR5cGU9MTAxMztiLkludGVybGVhdmVkQnVmZmVyPVFkO2IuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9eGY7Yi5JbnRlcnBvbGFudD1vYztiLkludGVycG9sYXRlRGlzY3JldGU9MjMwMDtiLkludGVycG9sYXRlTGluZWFyPTIzMDE7Yi5JbnRlcnBvbGF0ZVNtb290aD0yMzAyO2IuSW52ZXJ0U3RlbmNpbE9wPTUzODY7Yi5KU09OTG9hZGVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuSlNPTkxvYWRlciBoYXMgYmVlbiByZW1vdmVkLiIpfTtiLktlZXBTdGVuY2lsT3A9NzY4MDtiLktleWZyYW1lVHJhY2s9WGI7Yi5MT0Q9QWY7Yi5MYXRoZUJ1ZmZlckdlb21ldHJ5PU9lO2IuTGF0aGVHZW9tZXRyeT1VZjtiLkxheWVycz14O2IuTGVuc0ZsYXJlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTGVuc0ZsYXJlIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9vYmplY3RzL0xlbnNmbGFyZS5qcyIpfTsKYi5MZXNzRGVwdGg9MjtiLkxlc3NFcXVhbERlcHRoPTM7Yi5MZXNzRXF1YWxTdGVuY2lsRnVuYz01MTU7Yi5MZXNzU3RlbmNpbEZ1bmM9NTEzO2IuTGlnaHQ9SmI7Yi5MaWdodFByb2JlPUhjO2IuTGlnaHRQcm9iZUhlbHBlcj1iZjtiLkxpZ2h0U2hhZG93PVZjO2IuTGluZT1WYjtiLkxpbmUzPXVpO2IuTGluZUJhc2ljTWF0ZXJpYWw9RmI7Yi5MaW5lQ3VydmU9a2M7Yi5MaW5lQ3VydmUzPURjO2IuTGluZURhc2hlZE1hdGVyaWFsPWRlO2IuTGluZUxvb3A9RGc7Yi5MaW5lUGllY2VzPTE7Yi5MaW5lU2VnbWVudHM9SWI7Yi5MaW5lU3RyaXA9MDtiLkxpbmVhckVuY29kaW5nPTNFMztiLkxpbmVhckZpbHRlcj0xMDA2O2IuTGluZWFySW50ZXJwb2xhbnQ9WWY7Yi5MaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwODtiLkxpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI9MTAwNztiLkxpbmVhck1pcG1hcExpbmVhckZpbHRlcj0xMDA4O2IuTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA3OwpiLkxpbmVhclRvbmVNYXBwaW5nPTE7Yi5Mb2FkZXI9RGI7Yi5Mb2FkZXJVdGlscz1QaTtiLkxvYWRpbmdNYW5hZ2VyPSRoO2IuTG9nTHV2RW5jb2Rpbmc9MzAwMztiLkxvb3BPbmNlPTIyMDA7Yi5Mb29wUGluZ1Bvbmc9MjIwMjtiLkxvb3BSZXBlYXQ9MjIwMTtiLkx1bWluYW5jZUFscGhhRm9ybWF0PTEwMjU7Yi5MdW1pbmFuY2VGb3JtYXQ9MTAyNDtiLk1PVVNFPXtMRUZUOjAsTUlERExFOjEsUklHSFQ6MixST1RBVEU6MCxET0xMWToxLFBBTjoyfTtiLk1hdGVyaWFsPU07Yi5NYXRlcmlhbExvYWRlcj1WZztiLk1hdGg9aGI7Yi5NYXRyaXgzPXQ7Yi5NYXRyaXg0PXE7Yi5NYXhFcXVhdGlvbj0xMDQ7Yi5NZXNoPXhhO2IuTWVzaEJhc2ljTWF0ZXJpYWw9TDtiLk1lc2hEZXB0aE1hdGVyaWFsPXZkO2IuTWVzaERpc3RhbmNlTWF0ZXJpYWw9d2Q7Yi5NZXNoRmFjZU1hdGVyaWFsPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTsKcmV0dXJuIGF9O2IuTWVzaExhbWJlcnRNYXRlcmlhbD1iZTtiLk1lc2hNYXRjYXBNYXRlcmlhbD1jZTtiLk1lc2hOb3JtYWxNYXRlcmlhbD1hZTtiLk1lc2hQaG9uZ01hdGVyaWFsPUJjO2IuTWVzaFBoeXNpY2FsTWF0ZXJpYWw9WmQ7Yi5NZXNoU3RhbmRhcmRNYXRlcmlhbD1TYztiLk1lc2hUb29uTWF0ZXJpYWw9JGQ7Yi5NaW5FcXVhdGlvbj0xMDM7Yi5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nPTEwMDI7Yi5NaXhPcGVyYXRpb249MTtiLk11bHRpTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO2NvbnNvbGUud2FybigiVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTthLmlzTXVsdGlNYXRlcmlhbD0hMDthLm1hdGVyaWFscz1hO2EuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5zbGljZSgpfTtyZXR1cm4gYX07Yi5NdWx0aXBseUJsZW5kaW5nPTQ7Yi5NdWx0aXBseU9wZXJhdGlvbj0wO2IuTmVhcmVzdEZpbHRlcj0KMTAwMztiLk5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwNTtiLk5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDQ7Yi5OZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyPTEwMDU7Yi5OZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA0O2IuTmV2ZXJEZXB0aD0wO2IuTmV2ZXJTdGVuY2lsRnVuYz01MTI7Yi5Ob0JsZW5kaW5nPTA7Yi5Ob0NvbG9ycz0wO2IuTm9Ub25lTWFwcGluZz0wO2IuTm9ybWFsQmxlbmRpbmc9MTtiLk5vdEVxdWFsRGVwdGg9NztiLk5vdEVxdWFsU3RlbmNpbEZ1bmM9NTE3O2IuTnVtYmVyS2V5ZnJhbWVUcmFjaz1TZTtiLk9iamVjdDNEPUE7Yi5PYmplY3RMb2FkZXI9Wmc7Yi5PYmplY3RTcGFjZU5vcm1hbE1hcD0xO2IuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVJkO2IuT2N0YWhlZHJvbkdlb21ldHJ5PUhmO2IuT25lRmFjdG9yPTIwMTtiLk9uZU1pbnVzRHN0QWxwaGFGYWN0b3I9MjA3O2IuT25lTWludXNEc3RDb2xvckZhY3Rvcj0yMDk7Yi5PbmVNaW51c1NyY0FscGhhRmFjdG9yPQoyMDU7Yi5PbmVNaW51c1NyY0NvbG9yRmFjdG9yPTIwMztiLk9ydGhvZ3JhcGhpY0NhbWVyYT1iZztiLlBDRlNoYWRvd01hcD0xO2IuUENGU29mdFNoYWRvd01hcD0yO2IuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5PUZlO2IuUGFyYW1ldHJpY0dlb21ldHJ5PUVmO2IuUGFydGljbGU9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4iKTtyZXR1cm4gbmV3IHlmKGEpfTtiLlBhcnRpY2xlQmFzaWNNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUGFydGljbGVTeXN0ZW09ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgQ2UoYSwKYyl9O2IuUGFydGljbGVTeXN0ZW1NYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IEFjKGEpfTtiLlBhdGg9R2M7Yi5QZXJzcGVjdGl2ZUNhbWVyYT12YjtiLlBsYW5lPUhiO2IuUGxhbmVCdWZmZXJHZW9tZXRyeT1MYztiLlBsYW5lR2VvbWV0cnk9cmQ7Yi5QbGFuZUhlbHBlcj1oZztiLlBvaW50Q2xvdWQ9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuIik7cmV0dXJuIG5ldyBDZShhLGMpfTtiLlBvaW50Q2xvdWRNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUG9pbnRMaWdodD0KUWc7Yi5Qb2ludExpZ2h0SGVscGVyPVplO2IuUG9pbnRzPUNlO2IuUG9pbnRzTWF0ZXJpYWw9QWM7Yi5Qb2xhckdyaWRIZWxwZXI9ZGg7Yi5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk9amM7Yi5Qb2x5aGVkcm9uR2VvbWV0cnk9RmY7Yi5Qb3NpdGlvbmFsQXVkaW89bmk7Yi5Qb3NpdGlvbmFsQXVkaW9IZWxwZXI9Y2Y7Yi5Qcm9wZXJ0eUJpbmRpbmc9JGI7Yi5Qcm9wZXJ0eU1peGVyPXBpO2IuUXVhZHJhdGljQmV6aWVyQ3VydmU9RWM7Yi5RdWFkcmF0aWNCZXppZXJDdXJ2ZTM9VWM7Yi5RdWF0ZXJuaW9uPWg7Yi5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaz1aZjtiLlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudD1JZztiLlJFVklTSU9OPSIxMDgiO2IuUkdCQURlcHRoUGFja2luZz0zMjAxO2IuUkdCQUZvcm1hdD0xMDIzO2IuUkdCQV9BU1RDXzEweDEwX0Zvcm1hdD0zNzgxOTtiLlJHQkFfQVNUQ18xMHg1X0Zvcm1hdD0zNzgxNjtiLlJHQkFfQVNUQ18xMHg2X0Zvcm1hdD0zNzgxNztiLlJHQkFfQVNUQ18xMHg4X0Zvcm1hdD0KMzc4MTg7Yi5SR0JBX0FTVENfMTJ4MTBfRm9ybWF0PTM3ODIwO2IuUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdD0zNzgyMTtiLlJHQkFfQVNUQ180eDRfRm9ybWF0PTM3ODA4O2IuUkdCQV9BU1RDXzV4NF9Gb3JtYXQ9Mzc4MDk7Yi5SR0JBX0FTVENfNXg1X0Zvcm1hdD0zNzgxMDtiLlJHQkFfQVNUQ182eDVfRm9ybWF0PTM3ODExO2IuUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ9Mzc4MTI7Yi5SR0JBX0FTVENfOHg1X0Zvcm1hdD0zNzgxMztiLlJHQkFfQVNUQ184eDZfRm9ybWF0PTM3ODE0O2IuUkdCQV9BU1RDXzh4OF9Gb3JtYXQ9Mzc4MTU7Yi5SR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ9MzU4NDM7Yi5SR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDI7Yi5SR0JBX1MzVENfRFhUMV9Gb3JtYXQ9MzM3Nzc7Yi5SR0JBX1MzVENfRFhUM19Gb3JtYXQ9MzM3Nzg7Yi5SR0JBX1MzVENfRFhUNV9Gb3JtYXQ9MzM3Nzk7Yi5SR0JERW5jb2Rpbmc9MzAwNjtiLlJHQkVFbmNvZGluZz0zMDAyO2IuUkdCRUZvcm1hdD0KMTAyMztiLlJHQkZvcm1hdD0xMDIyO2IuUkdCTTE2RW5jb2Rpbmc9MzAwNTtiLlJHQk03RW5jb2Rpbmc9MzAwNDtiLlJHQl9FVEMxX0Zvcm1hdD0zNjE5NjtiLlJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQxO2IuUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDA7Yi5SR0JfUzNUQ19EWFQxX0Zvcm1hdD0zMzc3NjtiLlJhd1NoYWRlck1hdGVyaWFsPVJlO2IuUmF5PUQ7Yi5SYXljYXN0ZXI9VWo7Yi5SZWN0QXJlYUxpZ2h0PVVnO2IuUmVjdEFyZWFMaWdodEhlbHBlcj0kZTtiLlJlZEZvcm1hdD0xMDI4O2IuUmVpbmhhcmRUb25lTWFwcGluZz0yO2IuUmVwZWF0V3JhcHBpbmc9MUUzO2IuUmVwbGFjZVN0ZW5jaWxPcD03NjgxO2IuUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb249MTAyO2IuUmluZ0J1ZmZlckdlb21ldHJ5PU5lO2IuUmluZ0dlb21ldHJ5PVRmO2IuU2NlbmU9eTtiLlNjZW5lVXRpbHM9e2NyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LApkZXRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LGF0dGFjaDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMiKX19O2IuU2hhZGVyQ2h1bms9cmI7Yi5TaGFkZXJMaWI9TWM7Yi5TaGFkZXJNYXRlcmlhbD1xYjtiLlNoYWRvd01hdGVyaWFsPVlkO2IuU2hhcGU9Q2Q7Yi5TaGFwZUJ1ZmZlckdlb21ldHJ5PVdkO2IuU2hhcGVHZW9tZXRyeT1WZDtiLlNoYXBlUGF0aD1maTtiLlNoYXBlVXRpbHM9ZWQ7Yi5TaG9ydFR5cGU9MTAxMTtiLlNrZWxldG9uPUNnO2IuU2tlbGV0b25IZWxwZXI9WWU7Yi5Ta2lubmVkTWVzaD1CZjtiLlNtb290aFNoYWRpbmc9MjtiLlNwaGVyZT1HO2IuU3BoZXJlQnVmZmVyR2VvbWV0cnk9QmQ7Yi5TcGhlcmVHZW9tZXRyeT0KU2Y7Yi5TcGhlcmljYWw9V2o7Yi5TcGhlcmljYWxIYXJtb25pY3MzPWFoO2IuU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc9MzA1O2IuU3BsaW5lPXdpO2IuU3BsaW5lQ3VydmU9RmM7Yi5TcGxpbmVDdXJ2ZTM9YWs7Yi5TcG90TGlnaHQ9UGc7Yi5TcG90TGlnaHRIZWxwZXI9WGU7Yi5TcG90TGlnaHRTaGFkb3c9T2c7Yi5TcHJpdGU9eWY7Yi5TcHJpdGVNYXRlcmlhbD1BZDtiLlNyY0FscGhhRmFjdG9yPTIwNDtiLlNyY0FscGhhU2F0dXJhdGVGYWN0b3I9MjEwO2IuU3JjQ29sb3JGYWN0b3I9MjAyO2IuU3RlcmVvQ2FtZXJhPVFqO2IuU3RyaW5nS2V5ZnJhbWVUcmFjaz1KZztiLlN1YnRyYWN0RXF1YXRpb249MTAxO2IuU3VidHJhY3RpdmVCbGVuZGluZz0zO2IuVE9VQ0g9e1JPVEFURTowLFBBTjoxLERPTExZX1BBTjoyLERPTExZX1JPVEFURTozfTtiLlRhbmdlbnRTcGFjZU5vcm1hbE1hcD0wO2IuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeT1HZTtiLlRldHJhaGVkcm9uR2VvbWV0cnk9CkdmO2IuVGV4dEJ1ZmZlckdlb21ldHJ5PU1lO2IuVGV4dEdlb21ldHJ5PVJmO2IuVGV4dHVyZT1sO2IuVGV4dHVyZUxvYWRlcj1NZztiLlRvcnVzQnVmZmVyR2VvbWV0cnk9S2U7Yi5Ub3J1c0dlb21ldHJ5PU1mO2IuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk9SmU7Yi5Ub3J1c0tub3RHZW9tZXRyeT1MZjtiLlRyaWFuZ2xlPUI7Yi5UcmlhbmdsZUZhbkRyYXdNb2RlPTI7Yi5UcmlhbmdsZVN0cmlwRHJhd01vZGU9MTtiLlRyaWFuZ2xlc0RyYXdNb2RlPTA7Yi5UdWJlQnVmZmVyR2VvbWV0cnk9U2Q7Yi5UdWJlR2VvbWV0cnk9S2Y7Yi5VVk1hcHBpbmc9MzAwO2IuVWludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWihhLGMpfTtiLlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZT1aO2IuVWludDMyQXR0cmlidXRlPQpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGVhKGEsYyl9O2IuVWludDMyQnVmZmVyQXR0cmlidXRlPWVhO2IuVWludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWChhLGMpfTtiLlVpbnQ4QnVmZmVyQXR0cmlidXRlPVg7Yi5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBhYShhLApjKX07Yi5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9YWE7Yi5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MztiLlVuaWZvcm09Ymg7Yi5Vbmlmb3Jtc0xpYj1XYTtiLlVuaWZvcm1zVXRpbHM9Rm07Yi5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7Yi5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDtiLlVuc2lnbmVkSW50VHlwZT0xMDE0O2IuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7Yi5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODtiLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7Yi5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2IuVlNNU2hhZG93TWFwPTM7Yi5WZWN0b3IyPWY7Yi5WZWN0b3IzPWs7Yi5WZWN0b3I0PXA7Yi5WZWN0b3JLZXlmcmFtZVRyYWNrPVRlO2IuVmVydGV4PWZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgayhhLGMsZSl9O2IuVmVydGV4Q29sb3JzPQoyO2IuVmVydGV4Tm9ybWFsc0hlbHBlcj1kZztiLlZpZGVvVGV4dHVyZT1YaDtiLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9bjtiLldlYkdMUmVuZGVyVGFyZ2V0PW07Yi5XZWJHTFJlbmRlclRhcmdldEN1YmU9TmI7Yi5XZWJHTFJlbmRlcmVyPU9oO2IuV2ViR0xVdGlscz13ajtiLldpcmVmcmFtZUdlb21ldHJ5PUVlO2IuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgRWUoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2IuWEhSTG9hZGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyB1YyhhKX07Yi5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7Yi5aZXJvRmFjdG9yPTIwMDtiLlplcm9TbG9wZUVuZGluZz0yNDAxO2IuWmVyb1N0ZW5jaWxPcD0wO2Iuc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBmKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpZLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBoKCl7cmV0dXJuIE1hdGgucG93KC45NSxZLnpvb21TcGVlZCl9ZnVuY3Rpb24gayhzYSl7WGEudGhldGEtPXNhfWZ1bmN0aW9uIHQoc2Epe1hhLnBoaS09c2F9ZnVuY3Rpb24gbChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT91Yi89c2E6WS5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFkub2JqZWN0Lnpvb209TWF0aC5tYXgoWS5taW5ab29tLE1hdGgubWluKFkubWF4Wm9vbSxZLm9iamVjdC56b29tKnNhKSksWS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHFiPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFkuZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gcChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KdWIqPXNhOlkub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhZLm9iamVjdC56b29tPU1hdGgubWF4KFkubWluWm9vbSxNYXRoLm1pbihZLm1heFpvb20sWS5vYmplY3Quem9vbS9zYSkpLFkub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSxxYj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxZLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIG0oc2Epe3piLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIG4oc2Epe2ljLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHEoc2Epe05iLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHUoc2Epe3ZiLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO0diLnN1YlZlY3RvcnModmIsemIpLm11bHRpcGx5U2NhbGFyKFkucm90YXRlU3BlZWQpO3NhPQpZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIHgoc2Epe2JjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO09kLnN1YlZlY3RvcnMoYmMsaWMpOzA8T2QueT9sKGgoKSk6MD5PZC55JiZwKGgoKSk7aWMuY29weShiYyk7WS51cGRhdGUoKX1mdW5jdGlvbiBBKHNhKXtBYi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtIYi5zdWJWZWN0b3JzKEFiLE5iKS5tdWx0aXBseVNjYWxhcihZLnBhblNwZWVkKTtzZChIYi54LEhiLnkpO05iLmNvcHkoQWIpO1kudXBkYXRlKCl9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB3KHNhKXswPnNhLmRlbHRhWT9wKGgoKSk6MDxzYS5kZWx0YVkmJmwoaCgpKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIEMoc2Epe3ZhciBNYj0hMTtzd2l0Y2goc2Eua2V5Q29kZSl7Y2FzZSBZLmtleXMuVVA6c2QoMCwKWS5rZXlQYW5TcGVlZCk7TWI9ITA7YnJlYWs7Y2FzZSBZLmtleXMuQk9UVE9NOnNkKDAsLVkua2V5UGFuU3BlZWQpO01iPSEwO2JyZWFrO2Nhc2UgWS5rZXlzLkxFRlQ6c2QoWS5rZXlQYW5TcGVlZCwwKTtNYj0hMDticmVhaztjYXNlIFkua2V5cy5SSUdIVDpzZCgtWS5rZXlQYW5TcGVlZCwwKSxNYj0hMH1NYiYmKHNhLnByZXZlbnREZWZhdWx0KCksWS51cGRhdGUoKSl9ZnVuY3Rpb24gRyhzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/emIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6emIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9OYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpOYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrCnNhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHNhKXt2YXIgTWI9c2EudG91Y2hlc1swXS5wYWdlWC1zYS50b3VjaGVzWzFdLnBhZ2VYO3NhPXNhLnRvdWNoZXNbMF0ucGFnZVktc2EudG91Y2hlc1sxXS5wYWdlWTtpYy5zZXQoMCxNYXRoLnNxcnQoTWIqTWIrc2Eqc2EpKX1mdW5jdGlvbiBJKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUGFuJiZEKHNhKX1mdW5jdGlvbiBOKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUm90YXRlJiZHKHNhKX1mdW5jdGlvbiBPKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD92Yi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTp2Yi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0diLnN1YlZlY3RvcnModmIsCnpiKS5tdWx0aXBseVNjYWxhcihZLnJvdGF0ZVNwZWVkKTtzYT1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKX1mdW5jdGlvbiBIKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9BYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0hiLnN1YlZlY3RvcnMoQWIsTmIpLm11bHRpcGx5U2NhbGFyKFkucGFuU3BlZWQpO3NkKEhiLngsSGIueSk7TmIuY29weShBYil9ZnVuY3Rpb24gSyhzYSl7dmFyIE1iPXNhLnRvdWNoZXNbMF0ucGFnZVgtc2EudG91Y2hlc1sxXS5wYWdlWDtzYT1zYS50b3VjaGVzWzBdLnBhZ2VZLQpzYS50b3VjaGVzWzFdLnBhZ2VZO2JjLnNldCgwLE1hdGguc3FydChNYipNYitzYSpzYSkpO09kLnNldCgwLE1hdGgucG93KGJjLnkvaWMueSxZLnpvb21TcGVlZCkpO2woT2QueSk7aWMuY29weShiYyl9ZnVuY3Rpb24gTShzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVBhbiYmSChzYSl9ZnVuY3Rpb24gTChzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVJvdGF0ZSYmTyhzYSl9ZnVuY3Rpb24gUSgpe31mdW5jdGlvbiBUKHNhKXtpZighMSE9PVkuZW5hYmxlZCl7c2EucHJldmVudERlZmF1bHQoKTtZLmRvbUVsZW1lbnQuZm9jdXM/WS5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHNhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChZLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9CkFhLlBBTn1lbHNle2lmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlyZXR1cm47bShzYSk7RmE9QWEuUk9UQVRFfWVsc2V7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOfWJyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFkubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVkuZW5hYmxlWm9vbSlyZXR1cm47bihzYSk7RmE9QWEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goWS5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX19RmEhPT1BYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixYLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixhYSwhMSksWS5kaXNwYXRjaEV2ZW50KHZhKSl9fWZ1bmN0aW9uIFgoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLEZhKXtjYXNlIEFhLlJPVEFURTppZighMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO3Uoc2EpO2JyZWFrO2Nhc2UgQWEuRE9MTFk6aWYoITE9PT1ZLmVuYWJsZVpvb20pYnJlYWs7eChzYSk7YnJlYWs7Y2FzZSBBYS5QQU46ITEhPT1ZLmVuYWJsZVBhbiYmQShzYSl9fWZ1bmN0aW9uIGFhKHNhKXshMSE9PVkuZW5hYmxlZCYmKHkoc2EpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsClgsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGFhLCExKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGxhKHNhKXshMT09PVkuZW5hYmxlZHx8ITE9PT1ZLmVuYWJsZVpvb218fEZhIT09QWEuTk9ORSYmRmEhPT1BYS5ST1RBVEV8fChzYS5wcmV2ZW50RGVmYXVsdCgpLHNhLnN0b3BQcm9wYWdhdGlvbigpLFkuZGlzcGF0Y2hFdmVudCh2YSksdyhzYSksWS5kaXNwYXRjaEV2ZW50KHhhKSl9ZnVuY3Rpb24gWihzYSl7ITEhPT1ZLmVuYWJsZWQmJiExIT09WS5lbmFibGVLZXlzJiYhMSE9PVkuZW5hYmxlUGFuJiZDKHNhKX1mdW5jdGlvbiBiYShzYSl7aWYoITEhPT1ZLmVuYWJsZWQpe3NhLnByZXZlbnREZWZhdWx0KCk7c3dpdGNoKHNhLnRvdWNoZXMubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKFkudG91Y2hlcy5PTkUpe2Nhc2UgVEhSRUUuVE9VQ0guUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO0coc2EpO0ZhPQpBYS5UT1VDSF9ST1RBVEU7YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47RChzYSk7RmE9QWEuVE9VQ0hfUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKFkudG91Y2hlcy5UV08pe2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUEFOOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUGFuKXJldHVybjtJKHNhKTtGYT1BYS5UT1VDSF9ET0xMWV9QQU47YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5ET0xMWV9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVpvb20mJiExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO04oc2EpO0ZhPUFhLlRPVUNIX0RPTExZX1JPVEFURTticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfUZhIT09QWEuTk9ORSYmWS5kaXNwYXRjaEV2ZW50KHZhKX19ZnVuY3Rpb24gZWEoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLApzYS5zdG9wUHJvcGFnYXRpb24oKSxGYSl7Y2FzZSBBYS5UT1VDSF9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlicmVhaztPKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfUEFOOmlmKCExPT09WS5lbmFibGVQYW4pYnJlYWs7SChzYSk7WS51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX0RPTExZX1BBTjppZighMT09PVkuZW5hYmxlWm9vbSYmITE9PT1ZLmVuYWJsZVBhbilicmVhaztNKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfRE9MTFlfUk9UQVRFOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO0woc2EpO1kudXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfX1mdW5jdGlvbiBjYShzYSl7ITEhPT1ZLmVuYWJsZWQmJihRKHNhKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGthKHNhKXshMSE9PVkuZW5hYmxlZCYmc2EucHJldmVudERlZmF1bHQoKX10aGlzLm9iamVjdD0KYjt0aGlzLmRvbUVsZW1lbnQ9dm9pZCAwIT09ZD9kOmRvY3VtZW50O3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRhcmdldD1uZXcgVEhSRUUuVmVjdG9yMzt0aGlzLm1pbkRpc3RhbmNlPTA7dGhpcy5tYXhEaXN0YW5jZT1JbmZpbml0eTt0aGlzLm1pblpvb209MDt0aGlzLm1heFpvb209SW5maW5pdHk7dGhpcy5taW5Qb2xhckFuZ2xlPTA7dGhpcy5tYXhQb2xhckFuZ2xlPU1hdGguUEk7dGhpcy5taW5BemltdXRoQW5nbGU9LUluZmluaXR5O3RoaXMubWF4QXppbXV0aEFuZ2xlPUluZmluaXR5O3RoaXMuZW5hYmxlRGFtcGluZz0hMTt0aGlzLmRhbXBpbmdGYWN0b3I9LjA1O3RoaXMuZW5hYmxlWm9vbT0hMDt0aGlzLnpvb21TcGVlZD0xO3RoaXMuZW5hYmxlUm90YXRlPSEwO3RoaXMucm90YXRlU3BlZWQ9MTt0aGlzLmVuYWJsZVBhbj0hMDt0aGlzLnBhblNwZWVkPTE7dGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITE7dGhpcy5rZXlQYW5TcGVlZD03O3RoaXMuYXV0b1JvdGF0ZT0hMTt0aGlzLmF1dG9Sb3RhdGVTcGVlZD0KMjt0aGlzLmVuYWJsZUtleXM9ITA7dGhpcy5rZXlzPXtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LEJPVFRPTTo0MH07dGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6VEhSRUUuTU9VU0UuUk9UQVRFLE1JRERMRTpUSFJFRS5NT1VTRS5ET0xMWSxSSUdIVDpUSFJFRS5NT1VTRS5QQU59O3RoaXMudG91Y2hlcz17T05FOlRIUkVFLlRPVUNILlJPVEFURSxUV086VEhSRUUuVE9VQ0guRE9MTFlfUEFOfTt0aGlzLnRhcmdldDA9dGhpcy50YXJnZXQuY2xvbmUoKTt0aGlzLnBvc2l0aW9uMD10aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO3RoaXMuem9vbTA9dGhpcy5vYmplY3Quem9vbTt0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gU2EucGhpfTt0aGlzLmdldEF6aW11dGhhbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFNhLnRoZXRhfTt0aGlzLnNhdmVTdGF0ZT1mdW5jdGlvbigpe1kudGFyZ2V0MC5jb3B5KFkudGFyZ2V0KTtZLnBvc2l0aW9uMC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKTsKWS56b29tMD1ZLm9iamVjdC56b29tfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7WS50YXJnZXQuY29weShZLnRhcmdldDApO1kub2JqZWN0LnBvc2l0aW9uLmNvcHkoWS5wb3NpdGlvbjApO1kub2JqZWN0Lnpvb209WS56b29tMDtZLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7WS5kaXNwYXRjaEV2ZW50KEVhKTtZLnVwZGF0ZSgpO0ZhPUFhLk5PTkV9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzLE1iPShuZXcgVEhSRUUuUXVhdGVybmlvbikuc2V0RnJvbVVuaXRWZWN0b3JzKGIudXAsbmV3IFRIUkVFLlZlY3RvcjMoMCwxLDApKSx3Yz1NYi5jbG9uZSgpLmludmVyc2UoKSxiZD1uZXcgVEhSRUUuVmVjdG9yMyx0ZD1uZXcgVEhSRUUuUXVhdGVybmlvbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdGc9WS5vYmplY3QucG9zaXRpb247c2EuY29weSh0Zykuc3ViKFkudGFyZ2V0KTtzYS5hcHBseVF1YXRlcm5pb24oTWIpO1NhLnNldEZyb21WZWN0b3IzKHNhKTsKWS5hdXRvUm90YXRlJiZGYT09PUFhLk5PTkUmJmsoZigpKTtZLmVuYWJsZURhbXBpbmc/KFNhLnRoZXRhKz1YYS50aGV0YSpZLmRhbXBpbmdGYWN0b3IsU2EucGhpKz1YYS5waGkqWS5kYW1waW5nRmFjdG9yKTooU2EudGhldGErPVhhLnRoZXRhLFNhLnBoaSs9WGEucGhpKTtTYS50aGV0YT1NYXRoLm1heChZLm1pbkF6aW11dGhBbmdsZSxNYXRoLm1pbihZLm1heEF6aW11dGhBbmdsZSxTYS50aGV0YSkpO1NhLnBoaT1NYXRoLm1heChZLm1pblBvbGFyQW5nbGUsTWF0aC5taW4oWS5tYXhQb2xhckFuZ2xlLFNhLnBoaSkpO1NhLm1ha2VTYWZlKCk7U2EucmFkaXVzKj11YjtTYS5yYWRpdXM9TWF0aC5tYXgoWS5taW5EaXN0YW5jZSxNYXRoLm1pbihZLm1heERpc3RhbmNlLFNhLnJhZGl1cykpOyEwPT09WS5lbmFibGVEYW1waW5nP1kudGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihCYixZLmRhbXBpbmdGYWN0b3IpOlkudGFyZ2V0LmFkZChCYik7c2Euc2V0RnJvbVNwaGVyaWNhbChTYSk7c2EuYXBwbHlRdWF0ZXJuaW9uKHdjKTsKdGcuY29weShZLnRhcmdldCkuYWRkKHNhKTtZLm9iamVjdC5sb29rQXQoWS50YXJnZXQpOyEwPT09WS5lbmFibGVEYW1waW5nPyhYYS50aGV0YSo9MS1ZLmRhbXBpbmdGYWN0b3IsWGEucGhpKj0xLVkuZGFtcGluZ0ZhY3RvcixCYi5tdWx0aXBseVNjYWxhcigxLVkuZGFtcGluZ0ZhY3RvcikpOihYYS5zZXQoMCwwLDApLEJiLnNldCgwLDAsMCkpO3ViPTE7cmV0dXJuIHFifHxiZC5kaXN0YW5jZVRvU3F1YXJlZChZLm9iamVjdC5wb3NpdGlvbik+eWF8fDgqKDEtdGQuZG90KFkub2JqZWN0LnF1YXRlcm5pb24pKT55YT8oWS5kaXNwYXRjaEV2ZW50KEVhKSxiZC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKSx0ZC5jb3B5KFkub2JqZWN0LnF1YXRlcm5pb24pLHFiPSExLCEwKTohMX19KCk7dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixrYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsClQsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixjYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZWEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsWCwhMSk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYWEsITEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixaLCExKX07dmFyIFk9dGhpcyxFYT17dHlwZToiY2hhbmdlIn0sdmE9e3R5cGU6InN0YXJ0In0seGE9e3R5cGU6ImVuZCJ9LEFhPXtOT05FOi0xLFJPVEFURTowLERPTExZOjEsUEFOOjIsVE9VQ0hfUk9UQVRFOjMsVE9VQ0hfUEFOOjQsVE9VQ0hfRE9MTFlfUEFOOjUsVE9VQ0hfRE9MTFlfUk9UQVRFOjZ9LApGYT1BYS5OT05FLHlhPTFFLTYsU2E9bmV3IFRIUkVFLlNwaGVyaWNhbCxYYT1uZXcgVEhSRUUuU3BoZXJpY2FsLHViPTEsQmI9bmV3IFRIUkVFLlZlY3RvcjMscWI9ITEsemI9bmV3IFRIUkVFLlZlY3RvcjIsdmI9bmV3IFRIUkVFLlZlY3RvcjIsR2I9bmV3IFRIUkVFLlZlY3RvcjIsTmI9bmV3IFRIUkVFLlZlY3RvcjIsQWI9bmV3IFRIUkVFLlZlY3RvcjIsSGI9bmV3IFRIUkVFLlZlY3RvcjIsaWM9bmV3IFRIUkVFLlZlY3RvcjIsYmM9bmV3IFRIUkVFLlZlY3RvcjIsT2Q9bmV3IFRIUkVFLlZlY3RvcjIscmQ9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXtzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApO3NhLm11bHRpcGx5U2NhbGFyKC1NYik7QmIuYWRkKHNhKX19KCksTGM9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXshMD09PVkuc2NyZWVuU3BhY2VQYW5uaW5nPwpzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDEpOihzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApLHNhLmNyb3NzVmVjdG9ycyhZLm9iamVjdC51cCxzYSkpO3NhLm11bHRpcGx5U2NhbGFyKE1iKTtCYi5hZGQoc2EpfX0oKSxzZD1mdW5jdGlvbigpe3ZhciBzYT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oTWIsd2Mpe3ZhciBiZD1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aWYoWS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSl7c2EuY29weShZLm9iamVjdC5wb3NpdGlvbikuc3ViKFkudGFyZ2V0KTt2YXIgdGQ9c2EubGVuZ3RoKCk7dGQqPU1hdGgudGFuKFkub2JqZWN0LmZvdi8yKk1hdGguUEkvMTgwKTtyZCgyKk1iKnRkL2JkLmNsaWVudEhlaWdodCxZLm9iamVjdC5tYXRyaXgpO0xjKDIqd2MqdGQvYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCl9ZWxzZSBZLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHJkKE1iKihZLm9iamVjdC5yaWdodC1ZLm9iamVjdC5sZWZ0KS9ZLm9iamVjdC56b29tL2JkLmNsaWVudFdpZHRoLFkub2JqZWN0Lm1hdHJpeCksTGMod2MqKFkub2JqZWN0LnRvcC1ZLm9iamVjdC5ib3R0b20pL1kub2JqZWN0Lnpvb20vYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCkpOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4iKSxZLmVuYWJsZVBhbj0hMSl9fSgpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsa2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFQsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwKY2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGVhLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWiwhMSk7dGhpcy51cGRhdGUoKX07VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1USFJFRS5PcmJpdENvbnRyb2xzO1RIUkVFLk1hcENvbnRyb2xzPWZ1bmN0aW9uKGIsZCl7VEhSRUUuT3JiaXRDb250cm9scy5jYWxsKHRoaXMsYixkKTt0aGlzLm1vdXNlQnV0dG9ucy5MRUZUPVRIUkVFLk1PVVNFLlBBTjt0aGlzLm1vdXNlQnV0dG9ucy5SSUdIVD1USFJFRS5NT1VTRS5ST1RBVEU7dGhpcy50b3VjaGVzLk9ORT1USFJFRS5UT1VDSC5QQU47dGhpcy50b3VjaGVzLlRXTz1USFJFRS5UT1VDSC5ET0xMWV9ST1RBVEV9OwpUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuTWFwQ29udHJvbHM7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9hcnJheS1idWZmZXItZGF0YS1wcm92aWRlci5qcwp2YXIgTGs7CihmdW5jdGlvbihiKXtiLkVycm9yQ29kZXM9e0NBTkNFTExFRDoxfTtjb25zdCBkPXtWRVJURVg6MSxGQUNFOjIsQ09MT1I6M30sZj17VkVSVEVYOiJmbG9hdDMyIixGQUNFOiJpbnQzMiIsQ09MT1I6InVpbnQ4In07Y2xhc3MgaHtjb25zdHJ1Y3RvcihrKXt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX2NhbmNlbGxlcj1uZXcgdmMuQ2FuY2VsbGVyfXJlbG9hZChrLHQsbCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3JldHVybiB0aGlzLl9mZXRjaE1ldGFkYXRhKGssdCxsKX1fZmV0Y2hEYXRhQnlTdGVwKGssdCxsLHAsbSxuKXtmdW5jdGlvbiBxKHUpe2xldCB4PVtdO2ZvcihsZXQgQT0wO0E8dS5sZW5ndGgvMztBKyspe2xldCB5PVtdO2ZvcihsZXQgdz0wOzM+dzt3KyspeS5wdXNoKHVbMypBK3ddKTt4LnB1c2goeSl9cmV0dXJuIHh9az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9kYXRhIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dCxydW46aywKY29udGVudF90eXBlOmwsc2FtcGxlOnAsc3RlcDptfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHU9PntpZih1LmNhbmNlbGxlZClyZXR1cm4gUHJvbWlzZS5yZWplY3Qoe2NvZGU6Yi5FcnJvckNvZGVzLkNBTkNFTExFRCxtZXNzYWdlOiJSZXNwb25zZSB3YXMgaW52YWxpZGF0ZWQuIn0pO3U9dS52YWx1ZTtzd2l0Y2gobCl7Y2FzZSAiVkVSVEVYIjpuLnZlcnRpY2VzPXEobmV3IEZsb2F0MzJBcnJheSh1KSk7YnJlYWs7Y2FzZSAiRkFDRSI6bi5mYWNlcz1xKG5ldyBJbnQzMkFycmF5KHUpKTticmVhaztjYXNlICJDT0xPUiI6bi5jb2xvcnM9cShuZXcgVWludDhBcnJheSh1KSl9cmV0dXJuIG59KTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goayxudWxsLCJhcnJheWJ1ZmZlciIsZltsXSkudGhlbih1PT51LmFycmF5QnVmZmVyKCkpLnRoZW4odCl9ZmV0Y2hEYXRhKGssdCxsLHApe2xldCBtPVtdLG49bmV3IE1hcDtPYmplY3Qua2V5cyhkKS5mb3JFYWNoKHE9Pgp7ay5jb21wb25lbnRzJjE8PGRbcV0mJm0ucHVzaCh0aGlzLl9mZXRjaERhdGFCeVN0ZXAodCxsLHEscCxrLnN0ZXAsbikpfSk7cmV0dXJuIFByb21pc2UuYWxsKG0pfV9mZXRjaE1ldGFkYXRhKGssdCxsKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9tZXNoZXMiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0LHJ1bjprLHNhbXBsZTpsfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHA9PnAuY2FuY2VsbGVkP1Byb21pc2UucmVqZWN0KHtjb2RlOmIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTpwLnZhbHVlKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goaykudGhlbihwPT5wLmpzb24oKSkudGhlbih0KS50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKX1fcHJvY2Vzc01ldGFkYXRhKGspe2lmKGspe3ZhciB0PQpuZXcgTWFwO2ZvcihsZXQgcD0wO3A8ay5sZW5ndGg7cCsrKXtsZXQgbT1rW3BdO3QuaGFzKG0uc3RlcCl8fHQuc2V0KG0uc3RlcCxbXSk7dC5nZXQobS5zdGVwKS5wdXNoKG0pfXZhciBsPVtdO3QuZm9yRWFjaChwPT57cD10aGlzLl9jcmVhdGVTdGVwRGF0dW0ocFswXSk7bC5wdXNoKHApfSk7cmV0dXJuIGx9fV9jcmVhdGVTdGVwRGF0dW0oayl7cmV0dXJue3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqay53YWxsX3RpbWUpLHN0ZXA6ay5zdGVwLGNvbmZpZzprLmNvbmZpZyxjb250ZW50X3R5cGU6ay5jb250ZW50X3R5cGUsY29tcG9uZW50czprLmNvbXBvbmVudHN9fX1iLkFycmF5QnVmZmVyRGF0YVByb3ZpZGVyPWh9KShMa3x8KExrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9tZXNoLXZpZXdlci5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlcntjb25zdHJ1Y3RvcihmKXtzdXBlcigpO3RoaXMuX2xhc3RNZXNoPW51bGw7dGhpcy5fY2xvY2s9bmV3IFRIUkVFLkNsb2NrO3RoaXMuX2NhbnZhc1NpemU9bnVsbDt0aGlzLl9ydW5Db2xvcj1mfV9pc09iamVjdChmKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGYmJm51bGwhPWYmJiFBcnJheS5pc0FycmF5KGYpfV9hcHBseURlZmF1bHRzKGYsaCl7bGV0IGs9e307Zj1bZixoXTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKXtjb25zdCB0PWZbaF07Zm9yKGxldCBsIGluIHQpe2NvbnN0IHA9bCBpbiBrO3RoaXMuX2lzT2JqZWN0KHRbbF0pP2tbbF09dGhpcy5fYXBwbHlEZWZhdWx0cyhrW2xdfHx7fSx0W2xdKTpwfHwoa1tsXT10W2xdKX19cmV0dXJuIGt9X2NyZWF0ZVdvcmxkKGYsaCl7dGhpcy5pc1JlYWR5KCl8fCh0aGlzLl9zY2VuZT1uZXcgVEhSRUUuU2NlbmUsdGhpcy5fY2FtZXJhPWY9bmV3IFRIUkVFW2YuY2FtZXJhLmNsc10oZi5jYW1lcmEuZm92LAp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0LGYuY2FtZXJhLm5lYXIsZi5jYW1lcmEuZmFyKSxoPW5ldyBUSFJFRS5PcmJpdENvbnRyb2xzKGYsaCksaC5sb29rU3BlZWQ9LjQsaC5tb3ZlbWVudFNwZWVkPTIwLGgubm9GbHk9ITAsaC5sb29rVmVydGljYWw9ITAsaC5jb25zdHJhaW5WZXJ0aWNhbD0hMCxoLnZlcnRpY2FsTWluPTEsaC52ZXJ0aWNhbE1heD0yLGguYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuX2NhbWVyYUNvbnRyb2xzPWgsdGhpcy5fcmVuZGVyZXI9bmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2FudGlhbGlhczohMH0pLHRoaXMuX3JlbmRlcmVyLnNldFBpeGVsUmF0aW8oKSx0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpLHRoaXMuX3JlbmRlcmVyLnNldENsZWFyQ29sb3IoMTY3NzcyMTUsCjEpKX1fY2xlYXJTY2VuZSgpe2Zvcig7MDx0aGlzLl9zY2VuZS5jaGlsZHJlbi5sZW5ndGg7KXRoaXMuX3NjZW5lLnJlbW92ZSh0aGlzLl9zY2VuZS5jaGlsZHJlblswXSl9Z2V0UmVuZGVyZXIoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXJ9Z2V0Q2FtZXJhQ29udHJvbHMoKXtyZXR1cm4gdGhpcy5fY2FtZXJhQ29udHJvbHN9aXNSZWFkeSgpe3JldHVybiEhdGhpcy5fY2FtZXJhJiYhIXRoaXMuX2NhbWVyYUNvbnRyb2xzfWdldENhbWVyYVBvc2l0aW9uKCl7cmV0dXJue2Zhcjp0aGlzLl9jYW1lcmEuZmFyLHBvc2l0aW9uOnRoaXMuX2NhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLHRhcmdldDp0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQuY2xvbmUoKX19c2V0Q2FudmFzU2l6ZShmKXt0aGlzLl9jYW52YXNTaXplPWZ9ZHJhdygpe3RoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgpO3RoaXMuX2NhbWVyYS5hc3BlY3Q9CnRoaXMuX2NhbnZhc1NpemUud2lkdGgvdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQ7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpO2NvbnN0IGY9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZShoKTt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4PXJlcXVlc3RBbmltYXRpb25GcmFtZShmKTt0aGlzLl9yZW5kZXJlci5yZW5kZXIodGhpcy5fc2NlbmUsdGhpcy5fY2FtZXJhKX0uYmluZCh0aGlzKTtmKCl9dXBkYXRlU2NlbmUoZixoKXtsZXQgaz17fTsiY29uZmlnImluIGYmJmYuY29uZmlnJiYoaz1KU09OLnBhcnNlKGYuY29uZmlnKSk7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJiZWZvcmVVcGRhdGVTY2VuZSJ9KTtrPXRoaXMuX2FwcGx5RGVmYXVsdHMoayx7Y2FtZXJhOntjbHM6IlBlcnNwZWN0aXZlQ2FtZXJhIiwKZm92Ojc1LG5lYXI6LjEsZmFyOjFFM30sbGlnaHRzOlt7Y2xzOiJBbWJpZW50TGlnaHQiLGNvbG9yOiIjZmZmZmZmIixpbnRlbnNpdHk6Ljc1fSx7Y2xzOiJEaXJlY3Rpb25hbExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NSxwb3NpdGlvbjpbMCwtMSwyXX1dfSk7dGhpcy5fY3JlYXRlV29ybGQoayxoKTt0aGlzLl9jbGVhclNjZW5lKCk7dGhpcy5fY3JlYXRlTGlnaHRzKHRoaXMuX3NjZW5lLGspO3RoaXMuX2NyZWF0ZUdlb21ldHJ5KGYsayk7dGhpcy5kcmF3KCl9cmVzZXRWaWV3KCl7aWYodGhpcy5pc1JlYWR5KCkpe3RoaXMuX2NhbWVyYUNvbnRyb2xzLnJlc2V0KCk7aWYoIWYmJnRoaXMuX2xhc3RNZXNoKXZhciBmPXRoaXMuX2xhc3RNZXNoO2YmJih0aGlzLl9maXRPYmplY3RUb1ZpZXdwb3J0KGYpLHRoaXMuX2xhc3RNZXNoPWYpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpfX1fY3JlYXRlR2VvbWV0cnkoZixoKXtmPWYubWVzaDtmLnZlcnRpY2VzJiZmLmZhY2VzJiYKZi5mYWNlcy5sZW5ndGg/dGhpcy5fY3JlYXRlTWVzaChmLGgpOnRoaXMuX2NyZWF0ZVBvaW50Q2xvdWQoZixoKX1fY3JlYXRlUG9pbnRDbG91ZChmLGgpe3ZhciBrPWYudmVydGljZXM7Zj1mLmNvbG9ycztsZXQgdD17bWF0ZXJpYWw6e2NsczoiUG9pbnRzTWF0ZXJpYWwiLHNpemU6LjAwNX19O2YmJmYubGVuZ3RoPT1rLmxlbmd0aD90Lm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnM6dC5tYXRlcmlhbC5jb2xvcj10aGlzLl9ydW5Db2xvcjtoPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx0KTt2YXIgbD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKHApe3ZhciBtPW5ldyBUSFJFRS5WZWN0b3IzKHBbMF0scFsxXSxwWzJdKTttLng9MSpwWzBdO20ueT0xKnBbMV07bS56PTEqcFsyXTtsLnZlcnRpY2VzLnB1c2gobSl9KTtmJiZmLmxlbmd0aD09ay5sZW5ndGgmJmYuZm9yRWFjaChmdW5jdGlvbihwKXtwPW5ldyBUSFJFRS5Db2xvcihwWzBdLzI1NSwKcFsxXS8yNTUscFsyXS8yNTUpO2wuY29sb3JzLnB1c2gocCl9KTtrPW5ldyBUSFJFRVtoLm1hdGVyaWFsLmNsc10oaC5tYXRlcmlhbCk7az1uZXcgVEhSRUUuUG9pbnRzKGwsayk7dGhpcy5fc2NlbmUuYWRkKGspO3RoaXMuX2xhc3RNZXNoPWt9c2V0Q2FtZXJhVmlld3BvaW50KGYsaCxrKXt0aGlzLl9zaWxlbnQ9ITA7dGhpcy5fY2FtZXJhLmZhcj1oO3RoaXMuX2NhbWVyYS5wb3NpdGlvbi5zZXQoZi54LGYueSxmLnopO3RoaXMuX2NhbWVyYS5sb29rQXQoay5jbG9uZSgpKTt0aGlzLl9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnRhcmdldD1rLmNsb25lKCk7dGhpcy5fY2FtZXJhQ29udHJvbHMudXBkYXRlKCk7dGhpcy5fc2lsZW50PSExfV9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlKGYpe3RoaXMuX3NpbGVudHx8dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsZXZlbnQ6Zn0pfV9maXRPYmplY3RUb1ZpZXdwb3J0KGYpe3ZhciBoPQpuZXcgVEhSRUUuQm94MztoLnNldEZyb21PYmplY3QoZik7Zj1oLmNlbnRlcigpO3ZhciBrPWguc2l6ZSgpO2s9MS4yNSpNYXRoLmFicyhNYXRoLm1heChrLngsay55LGsueikvKDIqTWF0aC50YW4oTWF0aC5QSS8xODAqdGhpcy5fY2FtZXJhLmZvdi8yKSkpO2g9aC5taW4uejt0aGlzLnNldENhbWVyYVZpZXdwb2ludCh7eDpmLngseTpmLnksejprfSwzKigwPmg/LWgrazprLWgpLGYpfV9jcmVhdGVNZXNoKGYsaCl7dmFyIGs9Zi52ZXJ0aWNlcztjb25zdCB0PWYuZmFjZXMsbD1mLmNvbG9ycztmPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx7bWF0ZXJpYWw6e2NsczoiTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLGNvbG9yOiIjYTBhMGEwIixyb3VnaG5lc3M6MSxtZXRhbG5lc3M6MH19KTtsZXQgcD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5WZWN0b3IzKG1bMF0sbVsxXSxtWzJdKTtuLng9MSptWzBdO24ueT0xKm1bMV07bi56PTEqbVsyXTsKcC52ZXJ0aWNlcy5wdXNoKG4pfSk7dC5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5GYWNlMyhtWzBdLG1bMV0sbVsyXSk7aWYobCYmbC5sZW5ndGgpe209W2xbbVswXV0sbFttWzFdXSxsW21bMl1dXTtmb3IobGV0IHU9MDt1PG0ubGVuZ3RoO3UrKyl7dmFyIHE9bVt1XTtxPW5ldyBUSFJFRS5Db2xvcihxWzBdLzI1NSxxWzFdLzI1NSxxWzJdLzI1NSk7bi52ZXJ0ZXhDb2xvcnMucHVzaChxKX19cC5mYWNlcy5wdXNoKG4pfSk7bCYmbC5sZW5ndGgmJihmLm1hdGVyaWFsPWYubWF0ZXJpYWx8fHt9LGYubWF0ZXJpYWwudmVydGV4Q29sb3JzPVRIUkVFLlZlcnRleENvbG9ycyk7cC5jZW50ZXIoKTtwLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3AuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtrPW5ldyBUSFJFRVtmLm1hdGVyaWFsLmNsc10oZi5tYXRlcmlhbCk7az1uZXcgVEhSRUUuTWVzaChwLGspO2suY2FzdFNoYWRvdz0hMDtrLnJlY2VpdmVTaGFkb3c9ITA7dGhpcy5fc2NlbmUuYWRkKGspOwp0aGlzLl9sYXN0TWVzaD1rfV9jcmVhdGVMaWdodHMoZixoKXtmb3IobGV0IGs9MDtrPGgubGlnaHRzLmxlbmd0aDtrKyspe2NvbnN0IHQ9aC5saWdodHNba107bGV0IGw9bmV3IFRIUkVFW3QuY2xzXSh0LmNvbG9yLHQuaW50ZW5zaXR5KTt0LnBvc2l0aW9uJiZsLnBvc2l0aW9uLnNldCh0LnBvc2l0aW9uWzBdLHQucG9zaXRpb25bMV0sdC5wb3NpdGlvblsyXSk7Zi5hZGQobCl9fX1iLk1lc2hWaWV3ZXI9ZH0pKExrfHwoTGs9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tZXNoLWRhc2hib2FyZC9tZXNoLWxvYWRlci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLW1lc2gtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHNlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsdmFsdWU6ImFsbCJ9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21lc2hWaWV3ZXI6e3R5cGU6T2JqZWN0fSxfZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdH0sX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PnBmLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLG5vdGlmeTohMH0sX3N0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21lc2hWaWV3ZXJBdHRhY2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX2lzTWVzaExvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZywgYWN0aXZlLCBfZGF0YVByb3ZpZGVyLCBfbWVzaFZpZXdlcikiLCJfdXBkYXRlU2NlbmUoX2N1cnJlbnRTdGVwLiosIF9tZXNoVmlld2VyKSIsIl9kZWJvdW5jZWRGZXRjaE1lc2goX2N1cnJlbnRTdGVwKSIsIl91cGRhdGVWaWV3KHNlbGVjdGVkVmlldykiXSxfY29tcHV0ZVJ1bkNvbG9yOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oZCl9LAphdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RhdGFQcm92aWRlcj1uZXcgYi5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcih0aGlzLnJlcXVlc3RNYW5hZ2VyKTtjb25zdCBkPW5ldyBiLk1lc2hWaWV3ZXIodGhpcy5fcnVuQ29sb3IpO2QuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlVXBkYXRlU2NlbmUiLHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTt0aGlzLl9tZXNoVmlld2VyPWR9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuYWN0aXZlJiZ0aGlzLl9kYXRhUHJvdmlkZXImJih0aGlzLnNldCgiX2lzTWVzaExvYWRpbmciLCEwKSx0aGlzLl9kYXRhUHJvdmlkZXIucmVsb2FkKHRoaXMucnVuLHRoaXMudGFnLHRoaXMuc2FtcGxlKS50aGVuKGQ9PntkJiYodGhpcy5zZXQoIl9zdGVwcyIsZCksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLApkLmxlbmd0aC0xKSl9KS5jYXRjaChkPT57aWYoIWR8fCFkLmNvZGV8fGQuY29kZSE9Yi5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBFcnJvcihkfHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIik7fSkpfSxfdXBkYXRlU2NlbmU6ZnVuY3Rpb24oKXtjb25zdCBkPXRoaXMuX2N1cnJlbnRTdGVwO2QmJmQubWVzaCYmKHRoaXMuX21lc2hWaWV3ZXIudXBkYXRlU2NlbmUoZCx0aGlzKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkfHwodGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkPSEwKSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWR8fCh0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fbWVzaFZpZXdlci5nZXRSZW5kZXJlcigpLmRvbUVsZW1lbnQpLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZD0hMCkpfSxfZGVib3VuY2VkRmV0Y2hNZXNoKCl7dGhpcy5kZWJvdW5jZSgiZmV0Y2hNZXNoIiwoKT0+dGhpcy5fbWF5YmVGZXRjaE1lc2goKSwKMTAwKX0sX21heWJlRmV0Y2hNZXNoKCl7Y29uc3QgZD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBmPWQuX2N1cnJlbnRTdGVwO2lmKGYmJiFmLm1lc2gmJiFmLm1lc2hGZXRjaGluZyl7Zi5tZXNoRmV0Y2hpbmc9ITA7ZC5faXNNZXNoTG9hZGluZz0hMDt0cnl7Y29uc3QgaD15aWVsZCBkLl9kYXRhUHJvdmlkZXIuZmV0Y2hEYXRhKGYsZC5ydW4sZC50YWcsZC5zYW1wbGUpO2YubWVzaD1oWzBdO2Qubm90aWZ5UGF0aCgiX2N1cnJlbnRTdGVwLm1lc2giKX1jYXRjaChoKXtpZighaHx8IWguY29kZXx8aC5jb2RlIT1iLkVycm9yQ29kZXMuQ0FOQ0VMTEVEKXRocm93IGg9aHx8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIsRXJyb3IoaCk7fWZpbmFsbHl7ZC5faXNNZXNoTG9hZGluZz0hMSxmLm1lc2hGZXRjaGluZz0hMX19fSl9LF9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWVzaFZpZXdlci5pc1JlYWR5KCkpe3ZhciBkPW5ldyBDdXN0b21FdmVudCgiY2FtZXJhLXBvc2l0aW9uLWNoYW5nZSIsCntkZXRhaWw6dGhpcy5fbWVzaFZpZXdlci5nZXRDYW1lcmFQb3NpdGlvbigpfSk7dGhpcy5kaXNwYXRjaEV2ZW50KGQpfX0sc2V0Q2FtZXJhVmlld3BvaW50OmZ1bmN0aW9uKGQsZixoKXt0aGlzLl9tZXNoVmlld2VyLnNldENhbWVyYVZpZXdwb2ludChkLGYsaCl9LF91cGRhdGVDYW52YXNTaXplOmZ1bmN0aW9uKCl7Y29uc3QgZD10aGlzLm9mZnNldFdpZHRoLGY9dGhpcy4kJCgiLnRmLW1lc2gtbG9hZGVyLWhlYWRlciIpLm9mZnNldEhlaWdodDt0aGlzLl9tZXNoVmlld2VyLnNldENhbnZhc1NpemUoe3dpZHRoOmQsaGVpZ2h0OmQtZn0pfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDYW52YXNTaXplKCk7dGhpcy5pc0Nvbm5lY3RlZCYmdGhpcy5fbWVzaFZpZXdlci5kcmF3KCl9LF9oYXNBdExlYXN0T25lU3RlcDpmdW5jdGlvbihkKXtyZXR1cm4hIWQmJjA8ZC5sZW5ndGh9LF9oYXNNdWx0aXBsZVN0ZXBzOmZ1bmN0aW9uKGQpe3JldHVybiEhZCYmMTxkLmxlbmd0aH0sX2NvbXB1dGVDdXJyZW50U3RlcDpmdW5jdGlvbihkLApmKXtyZXR1cm4gZFtmXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/ZC5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lOmZ1bmN0aW9uKGQpe3JldHVybiBkP0hoLmZvcm1hdERhdGUoZC53YWxsX3RpbWUpOiIifSxfZ2V0TWF4U3RlcEluZGV4OmZ1bmN0aW9uKGQpe3JldHVybiBkLmxlbmd0aC0xfSxfZ2V0U2FtcGxlVGV4dDpmdW5jdGlvbihkKXtyZXR1cm4gU3RyaW5nKGQrMSl9LF9oYXNNdWx0aXBsZVNhbXBsZXM6ZnVuY3Rpb24oZCl7cmV0dXJuIDE8ZH0sX3VwZGF0ZVZpZXc6ZnVuY3Rpb24oZCl7dGhpcy5fbWVzaFZpZXdlciYmImFsbCI9PWQmJnRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCl9LHRvTG9jYWxlU3RyaW5nXzpmdW5jdGlvbihkKXtyZXR1cm4gZC50b0xvY2FsZVN0cmluZygpfX0pfSkoTGt8fChMaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1lc2gtZGFzaGJvYXJkL3RmLW1lc2gtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Im1lc2gtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiLioifSxfc2VsZWN0ZWRWaWV3Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6ImFsbCJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCgpPT57dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCl9LCExKTt0aGlzLnJlbG9hZCgpfSxfZ2V0QWxsQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLW1lc2gtbG9hZGVyIil9LApfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoYil7InNoYXJlIj09dGhpcy5fc2VsZWN0ZWRWaWV3JiZ0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goZD0+e2IudGFyZ2V0IT1kJiZkLnNldENhbWVyYVZpZXdwb2ludChiLmRldGFpbC5wb3NpdGlvbixiLmRldGFpbC5mYXIsYi5kZXRhaWwudGFyZ2V0KX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYj0+e2IucmVkcmF3KCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLApoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZE1lc2hlcygpe3RoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9tZXNzYWdlLmpzClVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07dmFyIE1rOwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKGspe3RoaXMucG9ydD1rO3RoaXMuaWQ9MDt0aGlzLnJlc3BvbnNlV2FpdHM9bmV3IE1hcDt0aGlzLmxpc3RlbmVycz1uZXcgTWFwO3RoaXMucG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0PT50aGlzLm9uTWVzc2FnZSh0KSl9bGlzdGVuKGssdCl7dGhpcy5saXN0ZW5lcnMuc2V0KGssdCl9dW5saXN0ZW4oayl7dGhpcy5saXN0ZW5lcnMuZGVsZXRlKGspfW9uTWVzc2FnZShrKXtyZXR1cm4gVWkodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciB0PUpTT04ucGFyc2Uoay5kYXRhKTtjb25zdCBsPXQudHlwZSxwPXQuaWQsbT10LnBheWxvYWQ7dmFyIG49dC5lcnJvcjtpZih0LmlzUmVwbHkpe2lmKHRoaXMucmVzcG9uc2VXYWl0cy5oYXMocCkpe3ZhciB7cmVzb2x2ZTpxLHJlamVjdDp1fT10aGlzLnJlc3BvbnNlV2FpdHMuZ2V0KHApO3RoaXMucmVzcG9uc2VXYWl0cy5kZWxldGUocCk7Cm4/dShFcnJvcihuKSk6cShtKX19ZWxzZXtuPXQ9bnVsbDtpZih0aGlzLmxpc3RlbmVycy5oYXMobCkpe2NvbnN0IHg9dGhpcy5saXN0ZW5lcnMuZ2V0KGwpO3RyeXt0PXlpZWxkIHgobSl9Y2F0Y2goQSl7bj1BfX10aGlzLnBvc3RNZXNzYWdlKHtbInR5cGUiXTpsLFsiaWQiXTpwLFsicGF5bG9hZCJdOnQsWyJlcnJvciJdOm4sWyJpc1JlcGx5Il06ITB9KX19KX1wb3N0TWVzc2FnZShrKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaykpfXNlbmRNZXNzYWdlKGspe2NvbnN0IHQ9dGhpcy5pZCsrO3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImV4cGVyaW1lbnRhbC5SdW5zQ2hhbmdlZCIsaWQ6dCxwYXlsb2FkOmssZXJyb3I6bnVsbCxpc1JlcGx5OiExfSk7cmV0dXJuIG5ldyBQcm9taXNlKChsLHApPT57dGhpcy5yZXNwb25zZVdhaXRzLnNldCh0LHtyZXNvbHZlOmwscmVqZWN0OnB9KX0pfX1mLklQQz1ofSkoZC5ET19OT1RfVVNFX0lOVEVSTkFMfHwoZC5ET19OT1RfVVNFX0lOVEVSTkFMPQp7fSkpfSkoYi5saWJ8fChiLmxpYj17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3BsdWdpbi1ob3N0LWlwYy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYobSxuKXtjb25zdCBxPW5ldyBiLmxpYi5ET19OT1RfVVNFX0lOVEVSTkFMLklQQyhtKTt0LmFkZChxKTtwLnNldChxLG4pO20uc3RhcnQoKTtmb3IoY29uc3QgW3UseF1vZiBsKW09aCh4LHEpLHEubGlzdGVuKHUsbSl9ZnVuY3Rpb24gaChtLG4pe3JldHVybiBxPT57dmFyIHU9cC5nZXQobik7dT1rLmdldCh1KXx8bnVsbDtyZXR1cm4gbSh1LHEpfX1kLnJlZ2lzdGVyUGx1Z2luSWZyYW1lPWZ1bmN0aW9uKG0sbil7ay5zZXQobSx7cGx1Z2luTmFtZTpufSl9O2NvbnN0IGs9bmV3IFdlYWtNYXAsdD1uZXcgU2V0LGw9bmV3IE1hcCxwPW5ldyBNYXA7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG09PntpZigiZXhwZXJpbWVudGFsLmJvb3RzdHJhcCI9PT1tLmRhdGEpe3ZhciBuPW0ucG9ydHNbMF07biYmKG09bS5zb3VyY2U/bS5zb3VyY2UuZnJhbWVFbGVtZW50Om51bGwpJiZmKG4sbSl9fSk7ZC5icm9hZGNhc3Q9CmZ1bmN0aW9uKCl7dmFyIG09dmMucnVuc1N0b3JlLmdldFJ1bnMoKTtmb3IodmFyIG4gb2YgdClwLmdldChuKS5pc0Nvbm5lY3RlZHx8KHQuZGVsZXRlKG4pLHAuZGVsZXRlKG4pKTtuPVsuLi50XS5tYXAocT0+cS5zZW5kTWVzc2FnZShtKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfTtkLmxpc3Rlbj1mdW5jdGlvbihtLG4pe2wuc2V0KG0sbik7Zm9yKGNvbnN0IHEgb2YgdCl7Y29uc3QgdT1oKG4scSk7cS5saXN0ZW4obSx1KX19O2QudW5saXN0ZW49ZnVuY3Rpb24obSl7bC5kZWxldGUobSk7Zm9yKGNvbnN0IG4gb2YgdCluLnVubGlzdGVuKG0pfX0pKGIuaG9zdHx8KGIuaG9zdD17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL2NvcmUtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0VVJMUGx1Z2luRGF0YSIsYj0+e2lmKGIpe2I9YHAuJHtiLnBsdWdpbk5hbWV9LmA7dmFyIGQ9e307Zm9yKGxldCBmIGluIHBkLnVybERpY3QpZi5zdGFydHNXaXRoKGIpJiYoZFtmLnN1YnN0cmluZyhiLmxlbmd0aCldPXBkLnVybERpY3RbZl0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3J1bnMtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0UnVucyIsKCk9PnZjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpO3ZjLnJ1bnNTdG9yZS5hZGRMaXN0ZW5lcigoKT0+TWsuaG9zdC5icm9hZGNhc3QoKSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvYXV0b1JlbG9hZEJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7cmV0dXJuKG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpLmhhcygiX0Rpc2FibGVBdXRvUmVsb2FkIil9Yi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVk9IlRGLlRlbnNvckJvYXJkLmF1dG9SZWxvYWRFbmFibGVkIjtiLkF1dG9SZWxvYWRCZWhhdmlvcj17cHJvcGVydGllczp7YXV0b1JlbG9hZEVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9SZWxvYWRPYnNlcnZlciIsdmFsdWU6KCk9Pnt2YXIgZj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVkpO3JldHVybiJ0cnVlIj09PWZ8fG51bGw9PWZ9fSxfYXV0b1JlbG9hZElkOnt0eXBlOk51bWJlcn0sX21pc3NlZEF1dG9SZWxvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kSGFuZGxlVmlzaWJpbGl0eUNoYW5nZTp7dHlwZTpPYmplY3R9LGF1dG9SZWxvYWRJbnRlcnZhbFNlY3M6e3R5cGU6TnVtYmVyLAp2YWx1ZTozMH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRIYW5kbGVWaXNpYmlsaXR5Q2hhbmdlPXRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxfYXV0b1JlbG9hZE9ic2VydmVyOmZ1bmN0aW9uKGYpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShiLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSxmKTtmJiYhZCgpP3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyk6CndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2lzRG9jdW1lbnRWaXNpYmxlKCk/dGhpcy5fZG9SZWxvYWQoKTp0aGlzLl9taXNzZWRBdXRvUmVsb2FkPSEwO3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyl9LF9kb1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0RvY3VtZW50VmlzaWJsZSgpJiZ0aGlzLl9taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5fbWlzc2VkQXV0b1JlbG9hZD0hMSx0aGlzLl9kb1JlbG9hZCgpKX0sX2lzRG9jdW1lbnRWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuInZpc2libGUiPT09CmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZX19fSkocWZ8fChxZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3RmLXRlbnNvcmJvYXJkLmh0bWwuanMKY29uc3QgWW09e2dldExvY2F0aW9uKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbn19OwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbcWYuQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSxob21lUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9ob21lUGF0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9zYW5pdGl6ZUhvbWVQYXRoKGhvbWVQYXRoKSJ9LHRpdGxlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3VwZGF0ZVRpdGxlIn0scm91dGVyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVJvdXRlciJ9LGRlbW9EaXI6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHVzZUhhc2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZWREYXNoYm9hcmRzOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2Rhc2hib2FyZERhdGE6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkRGF0YShfZGFzaGJvYXJkUmVnaXN0cnkpIn0sX2Rhc2hib2FyZFJlZ2lzdHJ5Ont0eXBlOk9iamVjdCwKY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9hY3RpdmVEYXNoYm9hcmRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZChfZGFzaGJvYXJkRGF0YSwgX3BsdWdpbnNMaXN0aW5nKSJ9LF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpxZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9hY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sCl9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfc2hvd05vRGFzaGJvYXJkc01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkifSxfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2Rhc2hib2FyZFJlZ2lzdHJ5LCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3NlbGVjdGVkRGFzaGJvYXJkOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmcocGQuVEFCKXx8bnVsbCxvYnNlcnZlcjoiX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZCJ9LApfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xhc3RSZWxvYWRUaW1lOnt0eXBlOlN0cmluZyx2YWx1ZToibm90IHlldCBsb2FkZWQifSxfbGFzdFJlbG9hZFRpbWVTaG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vdCB5ZXQgbG9hZGVkIn0sX2RhdGFMb2NhdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3JlZnJlc2hpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoX3NlbGVjdGVkRGFzaGJvYXJkLCBfYWN0aXZlRGFzaGJvYXJkcykiLAoiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSxfc2FuaXRpemVIb21lUGF0aChiKXtpZighYilyZXR1cm4iIjtjb25zdCBkPVltLmdldExvY2F0aW9uKCksZj1uZXcgVVJMKGIsZC5ocmVmKSxoPSJodHRwOiI9PT1mLnByb3RvY29sfHwiaHR0cHM6Ij09PWYucHJvdG9jb2wsaz1mLm9yaWdpbj09PWQub3JpZ2luO2lmKCFoKXRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3QgJ2hvbWVQYXRoJyB0byBiZSBvZiBodHRwOiBvciBodHRwczouICR7Yn1gKTtpZighayl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ICdob21lUGF0aCcgYmUgYSBwYXRoIG9yIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiAke2J9IHZzLiAke2Qub3JpZ2lufWApO3JldHVybiBoJiZrP2YudG9TdHJpbmcoKToiIn0sX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSwKX2lzRGFzaGJvYXJkQWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pfHwhKGR8fFtdKS5pbmNsdWRlcyhmLnBsdWdpbik/ITE6ITB9LF9pc0Rhc2hib2FyZEluYWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pPyExOihkfHxbXSkuaW5jbHVkZXMoZi5wbHVnaW4pPyExOiEwfSxfaW5hY3RpdmVEYXNoYm9hcmRzRXhpc3QoYixkLGYpe2lmKCFmKXJldHVybiExO2NvbnN0IGg9bmV3IFNldDtiLmZvckVhY2goaz0+e2guYWRkKGsucGx1Z2luKX0pOyhkfHwiIikuc3BsaXQoIiwiKS5mb3JFYWNoKGs9PntoLmRlbGV0ZShrLnBsdWdpbil9KTtmLmZvckVhY2goaz0+e2guZGVsZXRlKGspfSk7cmV0dXJuIDA8aC5zaXplfSxfZ2V0RGFzaGJvYXJkRnJvbUluZGV4KGIsZCl7cmV0dXJuIGJbZF19LF9zZWxlY3RlZFN0YXR1cyhiLGQpe3JldHVybiBiPT09ZH0sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChiKXtiPQpifHwiIjtwZC5zZXRTdHJpbmcocGQuVEFCLGIpO2xldCBkPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtkKz1kLmVuZHNXaXRoKCIvIik/YjoiLyIrYjtnYSgic2V0IiwicGFnZSIsZCk7Z2EoInNlbmQiLCJwYWdldmlldyIpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKGIsZCl7ZCYmbnVsbD09YiYmKGI9ZFswXXx8bnVsbCxudWxsIT1iJiYocGQuc2V0U3RyaW5nKHBkLlRBQixiLHt1c2VMb2NhdGlvblJlcGxhY2U6ITB9KSx0aGlzLl9zZWxlY3RlZERhc2hib2FyZD1iKSl9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl7Y29uc3QgYj1wZC5nZXRTdHJpbmcocGQuVEFCKTt0aGlzLnNldCgiX3NlbGVjdGVkRGFzaGJvYXJkIixifHxudWxsKX0sX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChiLGQsZixoKXtpZihmJiZoJiZkW2hdJiYoZD10aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlLHRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9CmgsZCYmZCE9aCYmYltkXS5yZW1vdmVEb20mJihkPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7ZH1dYCksZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQucmVtb3ZlKCkpLGQ9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtofV1gKSkpe2I9YltoXTtpZigwPT09ZC5jaGlsZHJlbi5sZW5ndGgpc3dpdGNoKGY9Yi5sb2FkaW5nTWVjaGFuaXNtLGYudHlwZSl7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmLmVsZW1lbnROYW1lKTtoLmlkPSJkYXNoYm9hcmQiO2QuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7Y2FzZSAiSUZSQU1FIjp0aGlzLl9yZW5kZXJQbHVnaW5JZnJhbWUoZCxoLGYpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJJbnZhcmlhbnQgdmlvbGF0aW9uOiIsZil9dGhpcy5zZXQoIl9pc1JlbG9hZERpc2FibGVkIixiLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShiLApkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2YuaWQ9ImRhc2hib2FyZCI7TWsuaG9zdC5yZWdpc3RlclBsdWdpbklmcmFtZShmLGQpO2NvbnN0IGg9bmV3IFVSTCgiZGF0YS9wbHVnaW5fZW50cnkuaHRtbCIsd2luZG93LmxvY2F0aW9uLmhyZWYpO2guc2VhcmNoUGFyYW1zLnNldCgibmFtZSIsZCk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsaC50b1N0cmluZygpKTtiLmFwcGVuZENoaWxkKGYpfSxfc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKXtyZXR1cm4gdGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHt0aGlzLl9zZWxlY3RlZERhc2hib2FyZH1dICNkYXNoYm9hcmRgKX0scmVhZHkoKXthZC5zZXRVc2VIYXNoKHRoaXMudXNlSGFzaCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKX0sCiExKTt2Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5fZGF0YUxvY2F0aW9uPXZjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCk7Y29uc3QgYj12Yy5lbnZpcm9ubWVudFN0b3JlLmdldFdpbmRvd1RpdGxlKCk7YiYmKHdpbmRvdy5kb2N1bWVudC50aXRsZT1iKX0pO3BkLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGI9PmIucGx1Z2luKS5maWx0ZXIoYj0+e2I9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYl07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGI/YjpiJiZiLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYj17fTtmb3IoY29uc3QgZCBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSliW2QuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1ifSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGIpe2NvbnN0IGQ9e307Zm9yKGNvbnN0IFtoLGtdb2YgT2JqZWN0LmVudHJpZXMocWYuZGFzaGJvYXJkUmVnaXN0cnkpKWRbaF09e3BsdWdpbjprLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6ay5lbGVtZW50TmFtZX0sdGFiTmFtZTprLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmsuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmsucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9Yilmb3IoY29uc3QgW2gsa11vZiBPYmplY3QuZW50cmllcyhiKSlpZigiYm9vbGVhbiIhPT10eXBlb2Ygayl7c3dpdGNoKGsubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09ZFtoXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApoKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGY9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTprLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpmPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6ay5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGgsay5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZiYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGYsaCk7ZFtoXT17cGx1Z2luOmgsbG9hZGluZ01lY2hhbmlzbTpmLHRhYk5hbWU6ay50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6ay5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206ay5yZW1vdmVfZG9tfX1mPXt9Owpmb3IoY29uc3QgaCBvZiBPYmplY3Qua2V5cyhiKSlkW2hdJiYoZltoXT1kW2hdKTtPYmplY3QuYXNzaWduKGYsZCk7cmV0dXJuIGZ9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShiKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhiKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9ZC52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYiwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KcWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChiKXtyZXR1cm4gYj09PXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJjA9PT1kLmxlbmd0aCYmbnVsbD09Zn0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJiEhZiYmCm51bGw9PWRbZl19LF91cGRhdGVSb3V0ZXIoYil7dmMuc2V0Um91dGVyKGIpfSxfdXBkYXRlVGl0bGUoYil7YiYmdGhpcy5zZXQoImJyYW5kIixiKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYj10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2ImJmIucmVsb2FkJiZiLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLHZjLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLHZjLnJ1bnNTdG9yZS5yZWZyZXNoKCksdmMuZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1uZS5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYil7Yi50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYil7Yj1OdW1iZXIucGFyc2VJbnQoYi50YXJnZXQudmFsdWUsMTApO2I9PT0rYiYmMDxiJiZuZS5zZXRMaW1pdChiKX19KTsK", "headers": [ [ "content-type", "application/javascript; charset=utf-8" ] ], "ok": true, "status": 200, "status_text": "" } } }, "colab_type": "code", "id": "pPQY_LODv_TA", "outputId": "1fd97613-5353-4f41-9ceb-b9d82081e9fe" }, "outputs": [ { "data": { "application/javascript": [ "\n", " (async () => {\n", " const url = await google.colab.kernel.proxyPort(6006, {\"cache\": true});\n", " const iframe = document.createElement('iframe');\n", " iframe.src = url;\n", " iframe.setAttribute('width', '100%');\n", " iframe.setAttribute('height', '800');\n", " iframe.setAttribute('frameborder', 0);\n", " document.body.appendChild(iframe);\n", " })();\n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "%load_ext tensorboard\n", "%tensorboard --logdir log/" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 491 }, "colab_type": "code", "id": "oiPzQrNAKuRI", "outputId": "2ad6ad61-5137-443c-d70b-56a9555d7271" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3AAAAHaCAYAAABB8qt2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeXgV5d3/8fc3OxAIkBCWLCxhR/YQBDcUXHCvdQFXaq3VPmpta221tlpb+/izi0vrU6vWWrUScatrtW6oKJiAyC7ImoQlkACBANnv3x8zmENkCZBkcpLP67rO5TnnnpnzncnInM+5Z+4x5xwiIiIiIiLS/EUEXYCIiIiIiIjUjwKciIiIiIhImFCAExERERERCRMKcCIiIiIiImFCAU5ERERERCRMKMCJiIiIiIiECQU4EZFGYGb/MbOrGnB5l5nZfxtqeYf4rF5m5swsqik+73CZ2fVmVmhmpWaWGHQ9QTOzb5lZvr89RtZj+glmVtAUtR2Nw9kPzWyamc1qirpERIKmACcirY6ZrTWzCjNLqvP+fP8LY6+j/Qzn3GTn3D/95R71l0vn3L+cc6cdbV3742+PSY2x7IZmZtHAn4DTnHPxzrnioGtqBv4A3OBvj/l1G/19um8AdYmISCNQgBOR1moNMHXvCzMbCrQNrpwDa649YU3N3w5dgThgyRHMb2bWEo97PTmC7SEiIuGpJR7IRETq42ngypDXVwFPhU5gZglm9pSZbTGzdWZ2x94AsLdXzcz+YGbbzGyNmU0OmXemmV1jZoOAR4Bx/ilu2+u57E/M7H4zKwbuqtuL5/eqXGdmX5nZdjN72MzMb4s0sz+aWZFf1w0HOhXNzJ4G0oHX/PpuDWm+zMzy/OX8ImSeCDP7uZmtMrNiM5thZp33t5H3nq5nZrf7y1lrZpeFtMf62zDPPy3yETNrU2fen5nZJv9vttyfdbuZve9PN97Mcs2sxP/v+Dp/h3vM7BNgN9DH3xY/8LfdTjP7jZllmNmnZrbDX58Yf/5OZva6/3fa5j9PrbP83/h/r51m9t/Qnl0zO95f7nbzTnOcdqj13s82jPD3j3VmttnfbxL8ZZQCkcACM1u1n3k/8p8u8P++l4S0/cRf3kYz+059/ib7WX7ovrrdzFb7f49p/vputpBTie3g+32k/7lFZrYaOKvOZyWY2d/9eteb2W/NLHJ/dYmItGQKcCLSWs0BOpjZIP9L4BTgmTrT/BlIAPoAJ+EFvu+EtI/FCxRJwH3A3828ELWXc24ZcB0w2z/FreNhLHs1Xo/TPQdYh7OBMcAw4GLgdP/97wGTgRHAKOD8A20E59wVQB5wjl/ffSHNxwMDgInAr8wLowA3+ss8CegBbAMePtBnAN3wtlEKXlB+1MwG+G33Av39Wvv60/yqzryd8XqZrgaG+O93dM6d4gfHN4CHgES80yvfsH2vjbsCuBZoD6zz3zsdGA0cC9wKPApcDqQBx1DbOxsB/MP//HRgD/CXOut3Kd7fLhmIAW4BMLOewH/w/tZd/HX8op7rHWqa/zgZb3+JB/7inCt3zsX70wx3zmXUndE5d2JIe7xz7jn/dTe8/S8F+C7wsJl1OoLawNtXF+Jt/2eBbLz9si/eNv2Lme2t82D7/ffw9umRQCZwYZ3PeRKo8pc7EjgNuOYgdYmItEzOOT300EOPVvUA1gKTgDuA/wXOAN4BogAH9MLr1agABofM931gpv98GrAypK2tP283//VM4JqQaWeFTFufZefVqbnuMhxwfMjrGcDP/efvA98PaZvkTx91sO0R8rqXP31qyHs5wBT/+TJgYkhbd6Byf8sHJuB96W5Xp9ZfAgbsAjJC2sYBa0LmrQDi9lNblP/6CiCnzmfOBqaF/B3urtPugONCXs8Dfhby+o/AAwfYViOAbSGvZwJ3hLz+AfCW//w24OX9LOOg672f6d8DfhDyekDo9vbXp+9B9vd92v3tuif07wVsxguzh1vbNOCrkNdD/c/rGvJesb/dDrXfvw9cF9J22t6/Nd4PGeVAm5D2qcAH+/v/Qw899NCjJT90XYWItGZPAx8Bvalz+iRej1E0tT02+M9TQl5v2vvEObfb73yL59Dqs+z8eixnU8jz3SGf3aPO/PVZ1uEsvyfwspnVhLRX433JXr+f5Wxzzu0Keb3Or7ELXvCdF9JxaXhf9Pfa4pwrO0iNPdh3O+5d/qG2ZWHI8z37ed0NwMzaAvfjhfy9PVTtzSzSOVftvz7QdkoDvnFaI/Vb71B113EdtaFmf9u7Poqdc1Uhr/fWfbi1wTe3Hc65uu/Fc+j9vu5+GzpdT3/ejSF1RXDk+7aISNjSKZQi0mo559bhDWZyJvBSneYivF6OniHvpXNkX5jdESy77jyHYyOQGvI67RDTH+5n5QOTnXMdQx5xzrkDbZtOZtYu5HU6sAFvO+wBhoQsJ8HVnhZYn9o2sO923Lv8htqWP8Hr8RrrnOsA7D0l0Q48y9fygW+c1kj91jtU3XVMx+vVLNz/5EflcGs73GUfbL/fyL77anrI83y8HrikkLo6OOeGICLSyijAiUhr913glDo9RPi9KzOAe8ysvX8904/55nVy9VEIpO4dGKOBl70/M4AfmlmKmXUEflaP+vocxvIfwau9J4CZdTGz8w4xz6/NLMbMTsC7zul551wN8Bhwv5kl+8tKMbPTD7agOt4E+pvZpWYW5Q/SMRh4/TCWcTDt8QLNdv96uzsPY95/AZPM7GK/tkQzG3EE6z0d+JGZ9favJfsd8FydHrSDqffft4H+Jgda9qH2+xnATWaW6l+P9/OQeTcC/wX+aGYd/IFdMszspKOtS0Qk3CjAiUir5pxb5Zybe4DmG/GuB1oNzMIboOGJI/iY9/GGed9kZkUNvOz9eQzvy+5CYD5eyKnCO81xf/4XuMMfRfCWeiz/QeBV4L9mthNvQJixB5l+E95AJxvwQs11zrkv/bafASuBOWa2A3gXr8erXpx3H7iz8XrKivEGJDnbOVd00Bnr7wGgDV7v0RzgrcOoLQ+vd/cnwFa8AUyG+82Hs95PUHu67xqgDG//qa+7gH/6f9+L6zH9Uf1NDuFg+/1jwNvAAuBzvtkrfiXeIDFL8fanF/CuvxQRaVXMuaM5s0RERJo7825v8Ihzru6phk3x2ROAZ5xzqYeaVkRERA5NPXAiIi2MmbUxszP90/ZS8E77eznoukREROToKcCJiLQ8Bvwa7zSz+XjD/h/sPl4iIiISJnQKpYiIiIiISJhQD5yIiIiIiEiYUIATEREREREJEwpwIiIiIiIiYUIBTkREREREJEwowImIiIiIiIQJBTgREREREZEwoQAnIiIiIiISJhTgREREREREwoQCnIiIiIiISJhQgBMREREREQkTCnAiIiIiIiJhQgFOREREREQkTCjAiYiIiIiIhAkFOBERERERkTChACciIiIiIhImFOBERERERETChAKciIiIiIhImFCAExERERERCRMKcCIiIiIiImFCAU5ERERERCRMKMCJiIiIiIiECQU4ERERERGRMKEAJ9KIzKyXmTkzi6rHtNPMbFZT1CUiItIQdJwTaXoKcCI+M1trZhVmllTn/fn+walXMJUd3gFSRERkf5rzcS6klngzKzWz/wRdi0hzpQAnsq81wNS9L8xsKNA2uHJEREQaVHM/zn0bKAdONbNuTfnB+pFUwoUCnMi+ngauDHl9FfBU6ARmlmBmT5nZFjNbZ2Z3mFmE3xZpZn8wsyIzWw2ctZ95/25mG81svZn91swij6ZgM+thZq+a2VYzW2lm3wtpyzKzuWa2w8wKzexP/vtxZvaMmRWb2XYzyzWzrkdTh4iIhIXmfpy7CngEWAhcXmfZx5vZp/5xK9/MpvnvtzGzP/q1lpjZLP+9CWZWUGcZa81skv/8LjN7wT8e7gCm+cfN2f5nbDSzv5hZTMj8Q8zsHf+YW2hmt5tZNzPbbWaJIdON8rdf9GGsu0i9KMCJ7GsO0MHMBvkHnCnAM3Wm+TOQAPQBTsI7EH7Hb/secDYwEsgELqwz75NAFdDXn+Y04JqjrDkbKAB6+J/3OzM7xW97EHjQOdcByABm+O9f5a9DGpAIXAfsOco6RESk+Wu2xzkz6wlMAP7lP66s0/Yfv7YuwAjgC7/5D8BoYDzQGbgVqKnPZwLnAS8AHf3PrAZ+BCQB44CJwA/8GtoD7wJv4R1z+wLvOec2ATOBi0OWewWQ7ZyrrGcdIvWmACfyTXt/nTwVWAas39sQcrC7zTm30zm3Fvgj3j/U4P3j/YBzLt85txX435B5uwJnAjc753Y55zYD9/vLOyJmlgYcB/zMOVfmnPsCeJzag14l0NfMkpxzpc65OSHvJwJ9nXPVzrl5zrkdR1qHiIiEleZ6nLsCWOicW4r34+QQMxvpt10KvOucm+6cq3TOFTvnvvB7Bq8GfuicW+8f0z51zpXX8zNnO+f+7Zyrcc7t8Y+Hc5xzVf66/w0vxIIXXDc55/7oH3N3Ouc+89v+id9j6G/DqXjbWaTB6VxfkW96GvgI6E2d00rwfpGLBtaFvLcOSPGf9wDy67Tt1dOfd6OZ7X0vos70h6sHsNU5t7POZ2b6z78L3A18aWZrgF87517HW8c0INvMOuL9+voL/VIoItIqNNfj3JXAYwDOufVm9iHeGSPz8Y5Zq/YzTxIQd4C2+tinNjPrD/wJ7zjaFu+78jy/+UA1ALwCPGJmvYEBQIlzLucIaxI5KPXAidThnFuHd5H3mcBLdZqL8Hqveoa8l07tr5cb8f6BD23bKx/vwuwk51xH/9HBOTfkKMrdAHT2T+v4Rj3Oua+cc1OBZOD/AS+YWTv/18tfO+cG451ycjb7XhMhIiItVHM8zpnZeKAfcJuZbTKzTcBY4FJ/cJF8vEsB6ioCyg7QtouQAVr8nrEudaZxdV7/FfgS6OdffnA7sDeN5uOdVvoNzrkyvMsULsfrSVTvmzQaBTiR/fsucIpzblfom865arx/oO8xs/b+Ofk/pvb6gRnATWaWamadgJ+HzLsR+C/wRzPrYGYRZpZhZidRf7H+ACRxZhaHd0D9FPhf/71hfu3PAJjZ5WbWxTlXA2z3l1FjZieb2VD/YLYD72Bd3+sFREQk/DW349xVwDvAYLzr20YAxwBtgMl416dNMrOLzSzKzBLNbIR/fHsC+JN5g3pFmtk4M4sFVgBxZnaWP5jIHUDsIepoj3dcLDWzgcD1IW2vA93N7GYzi/W3z9iQ9qeAacC5KMBJI1KAE9kP59wq59zcAzTfiPer3mpgFvAs3sEDvFM/3gYWAJ/zzV82rwRigKXANrwLp7sfRmmleION7H2cgneefS+83riXgTudc+/6058BLDGzUrwBTaY45/YA3fzP3oF3/cOH6GAjItJqNKfjnP+D5MXAn51zm0Iea/COTVc55/Lwegx/AmzFG8BkuL+IW4BFQK7f9v+ACOdcCd4AJI/j/eC5C2/Qr4O5Be96u53+uj63t8G/XOFU4BxgE/AVcHJI+yd4P4Z+7vdyijQKc65uz7GIiIiIiBwuM3sfeNY593jQtUjLpQAnIiIiInKUzGwM3mmgaXUGFxNpUDqFUkRERETkKJjZP/HuEXezwps0NvXAiYiIiIiIhAn1wImIiIiIiISJZncj76SkJNerV6+gyxARkSYwb968Iudc3fsyyQHoGCki0joc7PjY7AJcr169mDv3QKPaiohIS2JmGmr7MOgYKSLSOhzs+KhTKEVERERERMKEApyIiIiIiEiYUIATEREREREJE83uGjgRkdaisrKSgoICysrKgi6l0cXFxZGamkp0dHTQpbQ42o9ERFoXBTgRkYAUFBTQvn17evXqhZkFXU6jcc5RXFxMQUEBvXv3DrqcFkf7kYhI66JTKEVEAlJWVkZiYmKL/tINYGYkJia2ih6iIGg/EhFpXRTgREQC1NK/dO/VWtYzKK1l+7aW9RQRORgFOBERERERkTChACci0koVFxczYsQIRowYQbdu3UhJSfn6dUVFxUHnnTt3LjfddFMTVSrNmfYjEZGmpUFMRERaqcTERL744gsA7rrrLuLj47nlllu+bq+qqiIqav+HiczMTDIzM5ukTmnetB+JiDQt9cCJiMjXpk2bxnXXXcfYsWO59dZbycnJYdy4cYwcOZLx48ezfPlyAGbOnMnZZ58NeF/ar776aiZMmECfPn146KGHglwFaQa0H4mINB71wImINAO/fm0JSzfsaNBlDu7RgTvPGXLY8xUUFPDpp58SGRnJjh07+Pjjj4mKiuLdd9/l9ttv58UXX/zGPF9++SUffPABO3fuZMCAAVx//fW6V1cAtB+JiLR8CnAiIrKPiy66iMjISABKSkq46qqr+OqrrzAzKisr9zvPWWedRWxsLLGxsSQnJ1NYWEhqampTli3NjPYjEZHGUa8AZ2ZnAA8CkcDjzrl79zPNxcBdgAMWOOcu9d+/CrjDn+y3zrl/NkDdIiItypH0cDSWdu3aff38l7/8JSeffDIvv/wya9euZcKECfudJzY29uvnkZGRVFVVNXaZsh/aj0REWr5DBjgziwQeBk4FCoBcM3vVObc0ZJp+wG3Acc65bWaW7L/fGbgTyMQLdvP8ebc1/KqIiEhDKykpISUlBYAnn3wy2GIkbGk/EhFpOPUZxCQLWOmcW+2cqwCygfPqTPM94OG9wcw5t9l//3TgHefcVr/tHeCMhil9/3aWVfKHt5fz2erixvwYEZFW4dZbb+W2225j5MiR6g2RI6b9SERaOuccq7eU8sycdfzpnRWN+lnmnDv4BGYXAmc4567xX18BjHXO3RAyzb+BFcBxeKdZ3uWce8vMbgHinHO/9af7JbDHOfeHOp9xLXAtQHp6+uh169Yd8QqVV1Vz7O/eY1xGIv932egjXo6ISGNbtmwZgwYNCrqMJrO/9TWzec45jSNfT5mZmW7u3Ln7vKf9SEQkGBtL9vDJymI+XVXE7FXFbCwpA6BXYlve+8kEIiPsiJd9sONjQw1iEgX0AyYAqcBHZja0vjM75x4FHgXv4HQ0hcRGRXLBqFSemr2WotJykuJjDzmPiIiIiIjIwRSXljNn9VY+XVXEp6uKWVO0C4DO7WIYl5HIcRlJjM9IpGdiW8yOPLwdSn0C3HogLeR1qv9eqALgM+dcJbDGzFbgBbr1eKEudN6ZR1psfU3NSuPvs9bw4rwCvn9SRmN/nIiIiIiItDA7yyrJXbvV72UrZtlG7zYt8bFRjO3dmcuP7cn4jEQGdG1PxFH0th2u+gS4XKCfmfXGC2RTgEvrTPNvYCrwDzNLAvoDq4FVwO/MrJM/3Wl4g500qr7J7cns2YnncvO59sQ+jZqARUREREQk/JVVVvP5um18uso7LXJBQQnVNY6YqAjG9OrET08fwLiMRIalJBAVWZ+hRBrHIQOcc67KzG4A3sa7vu0J59wSM7sbmOuce9VvO83MlgLVwE+dc8UAZvYbvBAIcLdzbmtjrEhdU7LSueX5BXy2ZivH9klsio8UEREREZEwUVVdw8L1JcxeVcwnK4uYu24bFVU1REYYw1MTuP6kDMb3TWRUeifioiODLvdr9boGzjn3JvBmnfd+FfLcAT/2H3XnfQJ44ujKPHxnDe3Or19bQnZOngKciIiIiEgrV1PjWF640+thW1nEZ2u2UlrujYw7qHsHrji2J8f1TWRMr860j4sOuNoDa6hBTJqdNjGRnD8ihefm5nPX7go6to0JuiQREREREWkizjnWFe/mE3/QkTmriineVQFA76R2nDuiB8dlJHFsn84khtHAhy02wAFMyUrj6TnreHn+er5zXO+gyxERaVaKi4uZOHEiAJs2bSIyMpIuXboAkJOTQ0zMwX/4mjlzJjExMYwfP77Ra5XmS/uRiDQnm0rKvh4l8tOVRWzwh/bv1iGOkwZ0Ybw/UmSPjm0CrvTItegAN6RHAsNSE8jOyWfa+F4azEREJERiYiJffPEFAHfddRfx8fHccsst9Z5/5syZxMfH64t3K6f9SESCtG1XBXNWF3/dy7Z6ize0f6e20YzLSOT6jCSOy0ikd1K7FpMFWnSAA5ialc5tLy1ifv52RqV3OvQMIiKt2Lx58/jxj39MaWkpSUlJPPnkk3Tv3p2HHnqIRx55hKioKAYPHsy9997LI488QmRkJM888wx//vOfOeGEE4IuX5oJ7Uci0lh2lVeRs3Yrn670AtvSjTtwDtrFRJLVuzOXZqUzLiORQd06NOnQ/k2pxQe4c4b34DevLyU7J08BTkSar//8HDYtathldhsKk++t9+TOOW688UZeeeUVunTpwnPPPccvfvELnnjiCe69917WrFlDbGws27dvp2PHjlx33XWH3dsijUz7kYi0MOVV1Xy+bjuzVxXxyapiFuRvp6rGERMZwaieHfnxpP6M75vIsNSORAc4tH9TavEBLj42inOH9+CVLzbwy7MHN+sRZUREglReXs7ixYs59dRTAaiurqZ79+4ADBs2jMsuu4zzzz+f888/P8gypZnTfiQiR6OquobFG3Z417GtLCZ37VbKq2qIMBia2pFrT+zD+IwkMns1r6H9m1KLD3Dg3RMuOzefVxds4LKxPYMuR0Tkmw6jh6OxOOcYMmQIs2fP/kbbG2+8wUcffcRrr73GPffcw6JFDdzLIw1D+5GIhBnnHCsKS/nEPyXyszXF7CzzhvYf0LU9l45NZ3xGEmP7dKaDOmKAVhLghqcmMLBbe7Jz8hXgREQOIDY2li1btjB79mzGjRtHZWUlK1asYNCgQeTn53PyySdz/PHHk52dTWlpKe3bt2fHjh1Bly3NjPYjETkY5xz5W/d8PejI7FVFFJV6Q/v3TGzL2cO6Mz4jiWP7JNKlffgM7d+UWkWAMzOmZqVz56tLWLy+hGNSEoIuSUSk2YmIiOCFF17gpptuoqSkhKqqKm6++Wb69+/P5ZdfTklJCc45brrpJjp27Mg555zDhRdeyCuvvKLBJ+Rr2o9EpK7CHWXMXlX8dS/b+u17AEhuH8vxfZMY39cb2j+1U9uAKw0P5pwLuoZ9ZGZmurlz5zb4ckt2V5L1u3e5KDOV354/tMGXLyJyuJYtW8agQYOCLqPJ7G99zWyecy4zoJLCzv6OkdqPRKS52b67gjmrt359P7aVm0sBSGgTzbg+iYzvm8j4jCQyurScof0b2sGOj62iBw4goW00Zw3tzivzN3D7mYNoG9NqVl1EREREpNHsrqgiZ81Wr5dtVRFLNnhD+7eJ9ob2v2h0Ksf1TWJQ9w5EttCh/ZtSq0oxU7LSeWn+el5fuJGLM9OCLkdEREREJCxt2VnOi58X8N6yQr7I305ltSM60hiZ3okfTuzHcX2TGJ7akZio1jG0f1NqVQFuTK9OZHRpR3ZOngKciDQLzrlWcfpIcztdv6XRfiQiTaGmxvHJqiKm5+Tx3yWFVNU4jknpwNXH9+Y4f2h/neXW+FrVFjYzpoxJ5543l7GicCf9u7YPuiQRacXi4uIoLi4mMTGxRX/5ds5RXFxMXFxc0KW0SNqPRKSxbd5ZxvNzC8jOzSN/6x46tY3mO8f14pIx6fRNjg+6vFanVQU4gAtGpXDf218yPSePO88ZEnQ5ItKKpaamUlBQwJYtW4IupdHFxcWRmpoadBktkvYjEWkMNTWOj1cWMf2zPN5d5vW2jeuTyE9PH8jpQ7oSG9U6b6LdHLS6AJcYH8tpQ7rx8vz1/OyMga32Du4iErzo6Gh69+4ddBkS5rQfiUhDKtxRxvNz88nOzadg2x46t4vhu8f35pIxafTpot625qDVBTiAqWPSeWPhRt5esonzRqQEXY6IiIiISGCqaxwffbWF6Z/l8d6Xm6mucRzXN5GfTx7IqYPV29bctMoANz4jkbTObZiek6cAJyIiIiKt0saSPczILWDG3HzWb99DUnwM3zuhD1PGpNErqV3Q5ckBtMoAFxHhDWby+7eXs6ZoF721g4qIiIhIK1Bd45i5fDPTc/J4/8vN1Dg4oV8SvzhrEJMGddWw/2GgVQY4gItGp/Knd1aQnZvHbZMHBV2OiIiIiEij2bB9D8/l5jNjbj4bS8pIio/lupMymDImnfTEtkGXJ4eh1Qa45A5xnDIwmRfnFfCTUwfo1wYRERERaVGqqmv4YPkWpufkMXP5ZhxwYr8u3HnOYCYO6kp0pL7/hqNWG+AApmal8c7SQt5bVsjkod2DLkdERERE5KgVbNvNjNx8npubT+GOcpLbx/I/J/fl4sw00jqrty3cteoAd1L/ZLonxDE9N18BTkRERETCVmV1De8t20x2bh4frvDuCzmhfxd+c146pwxMJkq9bS1Gqw5wkRHGxZlpPPT+V+Rv3a1fJEREREQkrORv3U12bh4z5hawZWc53TrEceMp/bg4M5XUTvpu2xK16gAHcPEYL8A9PzefH582IOhyREREREQOqrK6hneXFvJsTh6zVhZhwMkDkpmalc6EAV3U29bCtfoAl9KxDSf178KMuQXcNLGfdngRERERaZbWFe8iOzef5+cWUFRaTo+EOH44sR8XZ6bRo2OboMuTJtLqAxzAlDHpXPfMPD5csYWJg7oGXY6IiIiICAAVVTW8s7SQ6X5vW2SEccrAZC7NSufE/l2IjLCgS5QmpgAHTByUTFJ8LNNz8hXgRERERCRwa4p2kZ2bxwtzCyjeVUFKxzb85NT+XJSZRreEuKDLkwApwAHRkRFclJnKox+tpnBHGV076H8KEREREWla5VXVvL2kkOmf5TF7dTGREcakQd61bSf0U2+beBTgfFPGpPHXmat4fm4+N5zSL+hyRERERKSVWLWllOycPF6YV8C23ZWkdmrDT08fwEWjU0lWx4LUoQDn65nYjvEZiWTn5vODCX2J0C8cIiIiItJIyiqreXvJJp79LI/P1mwlKsI4dXBXpmalc3zfJH0XlQNSgAsxJSudm6bPZ9bKIk7s3yXockRERESkhVm5eSfTc/J58fMCtu+uJL1zW249YwAXjk4lub162+TQFOBCnD6kK53aRpOdm6cAJyIiIiINoqyymjcXbSQ7J5+ctVuJjjROG9yNqVnpjM9IVG+bHBYFuBCxUZFcMCqVp2avpai0nDf3LD4AACAASURBVKT42KBLEhEREZEwtaJwJ89+lsdLnxewo6yKXoltuW3yQL49OlXfM+WIKcDVMTUrjb/PWsOL8wr4/kkZQZcjIiIiImFkT0U1byzayPScPOat20Z0pHHGMd2ZmpXGsb3V29Zi1dTA9nVQuAT2bINRVzTaRynA1dE3uT2ZPTvxXG4+157YBzP9TyYiIiIiB/flph1M/yyPl+avZ2dZFX2S2vGLMwdxwagUEtXb1rKUlUDhUihc7AW2wiWweSlUlHrtsQkw8nJopByhALcfU7LSueX5BXy2ZivH9kkMuhwRERERaYZ2V1Tx+kKvt21+3nZiIiOYPNS7tm1s787qCAh31VWwdVVIUFvq/bckr3aauAToOhRGXAZdB0PXY6DLwEYLb6AAt19nDe3Or19bQnZOngKciIiIiOxjyYYSsnPy+ff89ewsryKjSzvuOGsQ3x6VSqd2MUGXJ0diV9G+PWqFi2Hzl1Bd7rVbJCT1h7QsyPyOF9S6DoEOPRo1rO2PAtx+tImJ5PwRKTw3N5+7dlfQsa3+RxQRERFpzXaVV/H6wg08+1keCwpKiImK4Kyh3Zmalc6YXp3U2xYuqsphy/KQkOb3qpUW1k4T39ULZ2OvheQh3vMuAyCqeZwKqwB3AFOy0nh6zjpenr+e7xzXO+hyRERERCQApeVV/GPWGh77eDU7yqrolxzPr84ezAWjUvQjf3PmHOzYUBvU9vasFa0AV+1NExkLyQOh7yQvpHUd4gW2+OZ9OzEFuAMY0iOBYakJZOfkM218L/2qIiIiItKK7Cqv4qnZ6/jbR6vYvruSSYOSue6kDEb3VG9bs1OxCzYv84Pa0trQVra9dpqEdC+gDTzTD2vHQOcMiAy/OBR+FTehqVnp3PbSIubnb2dUeqegyxERERGRRranoppn5qzjkQ9XUbyrggkDuvCjSf0ZntYx6NKkpga2r933OrXCJbB1DeC8aWLiIXkwDPlWbVBLHgRtWs7fTwHuIM4Z3oPfvL6U7Jw8BTgRERGRFqyssppnP8vj/2auoqi0nBP6JXHzpP6M7qnvgIHYs622N23zktpRICt3+RMYdO7jBbRhU2pPgezYEyIiAi29sSnAHUR8bBTnDu/BK19s4JdnD6Z9XHTQJYmIiIhIAyqvqua53Hwe/mAlhTvKGdcnkf+7bBRZvTsHXVrrUF0FxSvrjAC5BHYU1E7TppMX1EZdURvUugyEmHbB1R0gBbhDmJKVTnZuPq8u2MBlY3sGXY6IiIiINICKqhqen5fPw++vZENJGWN6deL+S0YwPiMp6NJartLN37xObcvy2qH6I6K8ofp7jqs9/bHrEGjfvcmH6m/OFOAOYXhqAgO7tSc7J18BTkRERCTMVVbX8PLn63no/a8o2LaHkekd+X8XDuP4vkkanKShVJZB0fJvXqu2a0vtNPHdvHDWZ0JtUEvqD1Ea2fNQ6hXgzOwM4EEgEnjcOXdvnfZpwO+B9f5bf3HOPe63VQOL/PfznHPnNkDdTcbMmJqVzp2vLmHx+hKOSUkIuiQREREROUxV1TW88sUGHnr/K9YV72ZYagK/Of8YJvTvouB2pJyDkgL/XmqhQ/V/VTtUf1Scd7pjv9NrT3/sOgTaqafzSB0ywJlZJPAwcCpQAOSa2avOuaV1Jn3OOXfDfhaxxzk34uhLDc75I1L43ZvLyM7N47cpQ4MuR0RERETqqbrG8frCDTz47lesLtrF4O4dePzKTCYOSlZwA6iphrIS/7Ed9myv89x/faDnNVW1y+qY7vWmDTqn9p5qnfuE5VD9zVl9tmYWsNI5txrAzLKB84C6Aa7FSmgbzVlDu/PK/A3cfuYg2sZoJxQRERFpzmpqHP9ZvIkH3l3BV5tLGditPY9cPprTBnclIqKFBbeq8oOErJAgtk8480NbecnBlx0RBXEdvWH44/xHp17+8wTo0AO6DfWG6o/TmWpNoT5JJAXID3ldAIzdz3TfNrMTgRXAj5xze+eJM7O5QBVwr3Pu33VnNLNrgWsB0tPTD6P8pjMlK52X5q/n9YUbuTgzLehyRERERGQ/nHO8vaSQB95dwZebdtI3OZ6HLx3F5GO6Nd/g5px3M+r99oDV43nVnoMvP7ptbeBq0xE6pHo9ZXEJIeHsAM+j22oAkWamobqSXgOmO+fKzez7wD+BU/y2ns659WbWB3jfzBY551aFzuycexR4FCAzM9M1UE0NakyvTmR0aUd2Tp4CnIiIAPW6Rjwd75jY0Z/m5865N82sF7AMWO5POsc5d11T1S3SEjnneG/ZZu5/dwVLNuygT1I7HpwygrOH9SCyKYLbfk9FPMTphwc6FfEbDOI67BuskvrW6RlL8IbbDw1qe59rYJAWpT4Bbj0QmlhSqR2sBADnXHHIy8eB+0La1vv/XW1mM4GRwD4BLhyYGVPGpHPPm8tYUbiT/l3bB12SiIgEqJ7XiN8BzHDO/dXMBgNvAr38tlXhfo24SHPgnGPmii3c/84KFhaUkN65LX+8aDjnjehBVGQD3NC5dAtsWugN1LFzU+OdirhPEOu4b29YbAeIiDz6dZEWoT4BLhfoZ2a98YLbFODS0AnMrLtzbqP/8ly8XxUxs07Abr9nLgk4jpBwF24uGJXCfW9/yfScPO48Z0jQ5YiISLDqc424Azr4zxOADU1aoUgL5pxj1soi/vTOCubnbSe1Uxvu+/YwvjUqhegjCW6hN5TetMh7FC6G0sLaafaeirg3WOlURAnAIQOcc67KzG4A3sY7/eMJ59wSM7sbmOucexW4yczOxbvObSswzZ99EPA3M6sBIvCugQvbwU8S42M5bUg3Xp6/np+dMZC4aP0SIiLSitXnGvG7gP+a2Y1AO2BSSFtvM5sP7ADucM59vL8PCYfrxEWa2uxVxdz/zgpy1m6lR0Icv/vWUC4cnUpMVD2DW1mJN9z9psVe71rhYti8DKrKvPaIaEgeCBkTvQE6uh3jBbW2nRtvpUTqqV7XwDnn3sQ77SP0vV+FPL8NuG0/830KtKhx96eOSeeNhRt5e8kmzhuREnQ5IiLSvE0FnnTO/dHMxgFPm9kxwEYg3TlXbGajgX+b2RDn3I66CwiH68RFmkru2q386b8rmL26mK4dYrn7vCFcMiaN2KgD/KjuHGxf5/eoLfZ71xbC9rzaadomeuFszDVeWOt6jG4oLc2axsM/TOMzEknr3IbpOXkKcCIirdshrxEHvgucAeCcm21mcUCSc24zUO6/P8/MVgH9gbmNXrVIGJq3bhsPvLuCj78qIik+ll+dPZhLx6bvezZU5R7vOrWvg9oir5et3P9dxCIgsS+kZMLoadB1qBfY2nfTqY0SVhTgDlNEhDeYye/fXs6aol30TmoXdEkiIhKMQ14jDuQBE4EnzWwQEAdsMbMuwFbnXLU/SnM/YHXTlS4SHhbkb+f+d1cwc/kWEtvF8IszB3H52HTaVBTB2g9qT3/ctBiKvwJX480Y0967kfSwi/1eNf8+ZTFtg10hkQagAHcELhqdyp/eWUF2bh63TR4UdDkiIhKAel4j/hPgMTP7Ed6AJtOcc86/b+rdZlYJ1ADXOee2BrQqIs3O4vUlPPDuV8xctp7hbbbw+IjdnJhQSMzah2HOIthdVDtxQrp3jdqQ873TH7sdAx17QUQDjEAp0gwpwB2B5A5xnDIwmRfnFfCTUwfU/4JZERFpUepxjfhSvBGY6873IvBioxcoEk72bCNvaQ5zPv0QK1zET6Ly+VubAiJdJXwJRMZ6vWgDzvBPfzzG62Vr0ynoykWalALcEZqalcY7Swt5b1khk4d2D7ocERERkfBQUwPb1oQM17+Yyg0LiS5dTzqQDuxq05mYlOFE9jgHug3zwlpiP4jUV1cR/V9whE7qn0z3hDim5+YrwImIiIjsT8UuKFwKhSGjQBYugYpSAJxFsik6jZw9PVlpJ9FzyFhOPXkiCclph1iwSOulAHeEIiOMizPTeOj9r8jfupu0zrooVkRERFop52DHhm/eBLt4Fd7ln0BsB29AkRGXURzfj6fWJPC3L6OxqjZcNb4X157Yh87tNHS/yKEowB2Fi8d4Ae75ufn8+LQBQZcjIiIi0viqKqBouX8T7EW1vWt7Qsbh6dTLG1Bk6EW191brmE7+tj385f2VvDCrgKgI48rje/L9kzJIio8NbHVEwo0C3FFI6diGk/p3YcbcAm6a2I+oSA1mIiIiIi3IruJ9T3/ctBi2fAk1lV57VBwkD4ZBZ3vXqnX1BxaJ67DPYjZs38Nf/r2YGbn5REQYV47ryfUnZZDcIS6AlRIJbwpwR2nKmHSue2YeH67YwsRBXYMuR0REROTIlO+E9fMgPxfWz4WNC2Hnhtr2+G5eb1q/Sf5w/cMgMQMiIg+4yMIdZTz8wUqyc/JxOKZmpfM/J/elW4KCm8iRUoA7ShMHJZMUH8v0nHwFOBEREQkPznnXpxXkQH4OFOTC5qW1N8JOGgC9T/CD2lDv0S6p3ovfvLOMR2au5pnP1lFT47goM40bTulLSsc2jbRCIq2HAtxRio6M4KLMVB79aDWFO8roqlMBREREpLkpL/V61wpyvB62gtzaa9ZiO0BqJgw8G9LGQEomtOl4RB9TXFrO3z5azVOz11JZ7fj2qBRuPKWfBnsTaUAKcA1gypg0/jpzFc/PzeeGU/oFXY6IiIi0Zs7B1tVeSMv3e9g2LwnpXesPA86EtCzvkTQAIo7uOv5tuyp49OPV/PPTtZRVVnP+yBRuOqUfvZLaNcAKiUgoBbgG0DOxHeMzEsnOzecHE/oSEWFBlyQiIiKtRcUuWP95SO9aDuwu9tpi2kPqaDjhFi+spYyGtp0b7KNLdlfy+KzV/OOTteyqqOKcYT344aR+ZHSJb7DPEJF9KcA1kClZ6dw0fT6zVhZxYv8uQZcjIiIiLZFzsG1NbVDLz/FujO2qvfbEftD/DEgd4wW2LgMPOsjIkdpRVsk/Zq3l8Vmr2VlWxVlDu/PDSf3o37V9g3+WiOxLAa6BnD6kK53aRpOdm6cAJyIiIg2jYjds+Lx2oJGCXNi1xWuLifd61E74MaRmedexNWDv2v6Ullfxz0/X8uhHqynZU8npQ7py86T+DOre4dAzi0iDUIBrILFRkVwwKpWnZq+lqLRcN6QUERGRw+McbFtbe+1aQY5337Wve9f6Qt9TvYFGUrMgeVCj9K7tz+6KKp6avY6/fbiKbbsrmTQomZsn9eeYlIQm+XwRqaUA14CmZqXx91lreHFeAd8/KSPockRERKQ5q9gNG+bvOzLkrs1eW3Q7SBkFx9/s966NgXaJTV5iWWU1z8xZxyMfrqKotIIJA7pw86T+jEg7slEqReToKcA1oL7J7cns2YnncvO59sQ+mGkwExEREcHrXdueFzIy5GdQuBhqqrz2zn0g45SQ3rXBEBnc17Syymqyc/J4eOYqtuws54R+Sdw8qT+je3YKrCYR8SjANbApWenc8vwCPluzlWP7NP0vZSIiItIMVO6BDV/se6Ps0kKvLbqtd+3a+Ju8gUZSxxzWTbIb2ycri/jp8wvYUFLGsX068/Clo8jq3bjX1olI/SnANbCzhnbn168tITsnTwFORESkNXAOSvJrg1p+DmxaWNu71qk39JlQOzJk8pBAe9cOpKKqhj++s5xHP1pNn6R2PHvNWMb3bT7BUkQ8ze9fjzDXJiaS80ek8NzcfO7aXUHHtjFBlyQiIiINqbIMNn5RO9BIfi6UbvLaottCj1Ew/sbaa9fim//o1GuLdnFT9nwWFpQwNSudX509mDYxTTNAiogcHgW4RjAlK42n56zj5fnr+c5xvYMuR0RERI6Uc1BSsO9NsjcuhJpKr71jT+h9AqSN9cJa1yEQGR1szYfBOceLn6/nzlcWExUZwSOXj+KMY7oHXZaIHIQCXCMY0iOBYakJZOfkM218Lw1mIiIiEi4qy2Djgn2vXdu50WuLagM9RsK4H3i9a2lZEJ8cbL1HYUdZJXe8vJhXF2wgq3dnHrhkBD06tgm6LBE5BAW4RjI1K53bXlrE/PztjErXiE0iIiLNUnUVLH8T8ub4vWsLoLrCa+uYDj2Pqx1opNvQsOpdO5h567bxw+z5bCwp4yen9ucHJ/clMkI/OIuEAwW4RnLO8B785vWlZOfkKcCJiIg0R2U74IWrYeU7EBXn9a6Nvc4PbFnQvmvQFTa46hrH/32wkgfe+4ruCXHM+P443RpAJMwowDWS+Ngozh3eg1e+2MAvzx5M+7iW8YudiIhIi7A9D569BLYsh7P+CCOvhKiWPfDYhu17+NFzX/DZmq2cO7wHv/3WMXTQ9xORsBMRdAEt2ZSsdPZUVvPqgg1BlyIiIiJ75efCY6dAyXq4/EUYc02LD29vLd7I5Ac/ZtH6Ev5w0XAenDJC4U0kTCnANaLhqQkM7Nae7Jz8oEsRERERgMUvwpNnQUw7uOYdyDg56Ioa1Z6Kam57aRHXPfM5PRPb8sZNJ3Dh6FQNsCYSxhTgGpGZMTUrnUXrS1i8viTockRERFov5+DD+7xr3lJGwTXvQ5cBQVfVqJZu2ME5f5nF9Jw8vn9SH164bjy9k9oFXZaIHCUFuEZ2/ogUYqMiyM7NC7oUERGR1qmqHF7+PnxwDwy7BK58BdolBl1Vo3HO8Y9P1nD+w5+wY08lz3x3LLdNHkRMlL72ibQEGsSkkSW0jeasod15Zf4Gbj9zEG1jtMlFRESazK4iyL4M8ufAyXfAibdACz59sKi0nJ8+v4APlm9h4sBk7rtwGInxsUGXJSINSD/FNIEpWensLK/ijYUbgy5FRESk9diyHB6fCBvmw4X/gJN+2qLD20crtnDGAx/zyapifn3uEB6/KlPhTaQFUndQExjTqxMZXdoxPSePizLTgi5HRESk5Vv1Acy4yhtdctobkDYm6IoaTUVVDb9/+0se+3gN/ZLjefq7WQzq3iHoskSkkagHrgmYGVPGpPN53nZWFO4MuhwREZGWbe4T8My3ISEFrnmvRYe31VtKueCvn/DYx2u4/Nh0XrvxeIU3kRZOAa6JXDAqhehIY3qOBjMRERFpFDXV8PYv4PUfebcHuPpt6NQz6KoahXOOGXPzOfvPsyjYtoe/XTGa354/lLjoyKBLE5FGpgDXRBLjYzltSDdenr+essrqoMsRERFpWcpL4bnLYfZfIOtamPocxLXMnqiSPZXcMH0+t76wkGGpCfznhydw+pBuQZclIk1EAa4JTR2Tzvbdlby9ZFPQpYiIiLQcJevhH2fAirdg8u/hzN9DZMu8zH/u2q2c+eDHvLV4Ez89fQD/uuZYuie0CbosEWlCLfNft2ZqfEYiaZ3bMD0nj/NGpARdjoiISPjbMB+enQIVu+DSGdDv1KArahRV1TU8/MEqHnxvBamd2vLCdeMYmd4p6LJEJADqgWtCERHeYCZzVm9lTdGuoMsREREJb0tfhScmQ2QMfPe/LTa8rd++h6mPzeH+d1dw3ogU3rjpeIU3kVZMAa6JXTQ6lcgIIztXg5mIiIgcEedg1v0w4wroOgS+9x50HRx0VY3izUUbmfzARyzdsIP7LxnO/ZeMoH1cdNBliUiAFOCaWHKHOE4ZmMyL8wqoqKoJuhwREZHwUlUBr94A794FQy6Aaa9DfHLQVTW43RVV/OyFhfzgX5/Tu0s8b/7wBL41MjXoskSkGVCAC8ClWekUlVbw3rLCoEsREREJH7u3wjMXwPxn4MRb4dt/h+iWN4DH4vUlnP3nWcyYl88PJmTwwnXj6JnYLuiyRKSZ0CAmATixfxd6JMQxPTefyUO7B12OiIhI81e8Cv51EZTkw7ceheGXBF1Rg6upcTzxyRrue2s5ndpF86/vjmV836SgyxKRZkYBLgCREcZFmWk89P5X5G/dTVrntkGXJCIi0nyt+di7x1tEJFz5KvQcF3RFDW7LznJueX4BH67YwqRBXbnvwmF0bhcTdFki0gzV6xRKMzvDzJab2Uoz+/l+2qeZ2RYz+8J/XBPSdpWZfeU/rmrI4sPZxWPSAHh+bn7AlYiIiDRj85+Bp7/lXed2zXstMrzNXL6ZyQ9+xJzVxfzm/GN47MrRCm8ickCH7IEzs0jgYeBUoADINbNXnXNL60z6nHPuhjrzdgbuBDIBB8zz593WINWHsZSObTipfxdmzC3gpon9iIrU5YgiIiJfq6mB934NnzwAvU+Ci5+CNh2DrqpBlVdVc99by/n7rDUM6Nqef11zLAO6tQ+6LBFp5uqTGrKAlc651c65CiAbOK+eyz8deMc5t9UPbe8AZxxZqS3PlDHpbNpRxocrtgRdioiISPNRsRuev9ILb6OnweUvtrjwtnJzKd96+FP+PmsNV47rySs3HKfwJiL1Up8AlwKEnudX4L9X17fNbKGZvWBmaYc5b6s0cVAySfGxTM/RaZQiIiIA7NgI/5gMy16H0+6Bsx+AyJZz3zPnHNk5eZzz51lsLNnD41dmcvd5xxAXHRl0aSISJhrqvL3XgF7OuWF4vWz/PJyZzexaM5trZnO3bGk9vVHRkRFclJnKB8s3U7ijLOhyREREgrVpETw+EYq+ginPwvgbwCzoqhpMye5K/ufZz/n5S4sY1bMjb918IpMGdw26LBEJM/UJcOuBtJDXqf57X3POFTvnyv2XjwOj6zuvP/+jzrlM51xmly5d6lt7izBlTBrVNU6DmYiISOu2/D/w99PBObj6LRh4ZtAVNaicNVuZ/OBH/HdJIT87YyBPXz2Wrh3igi5LRMJQfQJcLtDPzHqbWQwwBXg1dAIzC72Z2bnAMv/528BpZtbJzDoBp/nvia9nYjvGZySSnZtPTY0LuhwREZGm5RzMfhimT4WkfvC996H7sKCrajBV1TX86Z0VTHl0NtFREbx4/Xiun5BBRETL6VkUkaZ1yFEonXNVZnYDXvCKBJ5wzi0xs7uBuc65V4GbzOxcoArYCkzz591qZr/BC4EAdzvntjbCeoS1KVnp3DR9PrNWFnFi/9bVAykiIq1YdSW8+VOY9w8YdA58628Q0y7oqhpM/tbd3PzcF8xbt40LRqVw93nHEB+rW/CKyNGp178izrk3gTfrvPerkOe3AbcdYN4ngCeOosYW7/QhXenUNprs3DwFOBERaR32bIfnp8HqD+C4m2HinRDRcm6p89qCDdz+8iJw8OCUEZw3QmO4iUjD0M9AzUBsVCQXjErlqdlrKSotJyk+NuiSREREGs/WNfDsJbB1FZz3MIy8POiKGsyu8iruenUJz88rYGR6Rx6aMpK0zm2DLktEWpCW81NXmJualUZltePFeQVBlyIiItJ48uZ4I02WFsIV/25R4W1RQQln/3kWL3xewA0n92XG98cpvIlIg1OAayb6Jrcns2cnnsvNxzkNZiIiIi3Qwhnwz3MgriNc8x70PiHoihpETY3j0Y9WccFfP6Gssprp3zuWW04fQHSkvmaJSMPTvyzNyJSsdFYX7eKzNRrnRUREWhDn4P174KXvQWoWXPMuJPUNuqoGsXlnGVf9I4ffvfklpwxM5j8/PIFj+yQGXZaItGAKcM3IWUO70z4uiuycvKBLERERaRiVe+CFq+Gj+2DEZXDFy9C2c9BVNYj3vyxk8gMfk7t2K/d86xgeuXw0HdvGBF2WiLRwGsSkGWkTE8n5I1J4bm4+d+2u0EFARETCW+lmyL4UCnK9USaP/xFY+N//rKyymnv/8yVPfrqWgd3akz31WPp1bR90WSLSSqgHrpmZkpVGRVUNL89fH3QpIiIiR65wKTw2ETYthoufghN+3CLC28rNOzn/4U948tO1TBvfi3//z3EKbyLSpNQD18wM6ZHA8NQEsnPymTa+F9YCDnYiItLKfPWud4+3mLbwnTchZVTQFR015xzTc/K5+/UltI2J4olpmZwysGvQZYlIK6QeuGZoSlY6ywt3Mj9/e9CliIiIHJ6cx+DZi6BTL/je+y0ivG3fXcH1z3zO7S8vYkyvzrz1wxMU3kQkMApwzdA5w3vQNiZSg5mIiEj4qK6CN2+FN2+BfqfB1W9BQmrQVR212auKOeOBj3nvy0JuP3Mg//xOFskd4oIuS0RaMQW4Zig+Nopzh/fgtQUb2VlWGXQ5IiIiB1e2A6ZPgZy/wbH/A1Oehdj4oKs6KpXVNfzh7eVc+vgc2sRE8tL1x3HtiRlEROjSBhEJlgJcMzUlK509ldW8umBD0KWIiIgc2PY8eOJ0WPU+nH0/nPE7iIgMuqqjkr91Nxf/bTZ/+WAlF45K5fUbj2doakLQZYmIABrEpNkanprgDU2ck89lY3sGXY6IiMg3FcyF6VOhqhwufwEyTgm6oqP2yhfruePlxQA8NHUk5w7vEXBFIiL/n737Dq+yPPw//r7PySKDkMUKCTMBAghIWDKFoOBeKFjrFmlFsda2+mu/am3V1tY9Qeq2IOJCRTQICggIYYmcsPc6JOyVff/+OKFERAmQ5Dnn5PO6rudKzjOST3rVkM957vt+fkx34PyUMYbh3VJZtnUfP2zd53QcERGRH/vhA3j9QgitA7dmB3x5O1hYwj0TlzB6whLSG8YwZXQflTcR8UsqcH7ssk7JhIe4mLBAi5mIiIifsBa++RdMugkadfKtNJnU2ulUZ2Tp5r1c9OwsPlq8lbsGpvHuiB6kxEc6HUtE5IRU4PxYbGQoF3ZoxMeLt3G4qMTpOCIiUtuVFMKHI2HG3+Gsa+CGyRCV6HSqM/LD1n1c+dIcikrKmDCiJ/cMSifErT+PRMR/6TeUnxvWLZUDhSV89v12p6OIiEhtdmgXvHkpfD8Bzv0zXD4GQsKdTnXGPl6yFZcxfHJnb7o1j3c6jojISanA+bmuzeJomRTFhAWbnY4iIiK1Vd4qGDcAti6CK/8D/f4IJvCX07fWku3x0rNlAgnRgV9GRaR2UIHzc8YYhnVNZeHGPazyHnA6joiI1DZrZ8C4LCg6BDd+Bh2uCFbSawAAIABJREFUcjpRlVmz8yAbdh0mK6OB01FERCpNBS4AXHF2MqFuw/j5WsxERERqUM5r8PaVULcx3PoVpHR1OlGVys71AjCorQqciAQOFbgAkBAdznntGvLh4q0UFJc6HUdERIJdWSl88Wf49G5oeS7c8iXEBd8zSbM9Xs5qEkvD2Aino4iIVJoKXIAY3jWVvYeL+WL5DqejiIhIBcaYwcaYlcaYNcaY+05wPNUYM8MYs9gY870x5oIKx+4vv26lMeb8mk3+MwoPwrvXwdznodsIGP4uRNR1OlWV23mggCWb95Klu28iEmBU4ALEOS0TSImvo2GUIiJ+xBjjBl4AhgAZwHBjTMZxp/0FmGit7QwMA14svzaj/HU7YDDwYvnXc86+rfDaYFg1FYY8Dhf8C9whjkaqLtNzd2ItDNL8NxEJMCpwAcLl8i1mMm/dbtbnH3I6joiI+HQD1lhr11lri4AJwKXHnWOBo7ewYoFt5Z9fCkyw1hZaa9cDa8q/njO2LYZxA2H3Bt9dt+63OxalJmR7vCTXq0ObhjFORxEROSUqcAFkaJcmuF2GCQt0F05ExE8kAxWf87KlfF9FDwHXGWO2AFOAO0/hWowxI4wxOcaYnLy8vKrK/WO5n8BrF4ArBG75AtLPq57v4ycOF5Uwe00+gzIaYILgcQgiUruowAWQ+nUjGNCmPu8v3EJRSZnTcUREpHKGA69ba5sAFwBvGWMq/e+vtXastTbTWpuZlJRUtcmshdlPw7u/hvoZvpUmG7Sr2u/hh2atzqewpIzzNHxSRAKQClyAubZbKvkHi/iqfOljERFx1FYgpcLrJuX7KroFmAhgrZ0LRACJlby2+pQUweRRMO1BaHcZ3PgpxNSOQpPt8VI3IoSuzeOdjiIicspU4AJM3/QkGsdGMH7B5pOfLCIi1W0BkGaMaW6MCcO3KMnk487ZBAwEMMa0xVfg8srPG2aMCTfGNAfSgPk1kvrwbnj7Clj8NvT9A1z5KoTWqZFv7bTSMsv0FTs5t019Qt36M0hEAo9+cwUYt8swNDOFWavz2Lz7sNNxRERqNWttCTAK+ALIxbfa5HJjzMPGmEvKT/s9cJsxZikwHrjR+izHd2fOA0wF7rDWVv/DPnethf8Mgs3fweVjYMBfwFV7/hxYtGkPuw8VafVJEQlYwbk2cJC7umsKz05fzXs5m7nnvNZOxxERqdWstVPwLU5Scd8DFT73AL1+5tpHgEeqNWBFG2b7nvGGges/hqbn1Ni39hfZHi+hbkO/9CqeTygiUkNqz1tuQSS5Xh36pScxMWcLJaVazERERCpp31aISoLbvqqV5Q1gmsdLjxYJxESEOh1FROS0qMAFqGFdU9mxv4BvVlXTktIiIhJ8Ol4DI2dDfAunkzhizc6DrMs/pOGTIhLQVOAC1MC29UmMDmf8fC1mIiIipyAk3OkEjplWvoJzVlsVOBEJXCpwASrU7WJoZhNmrNyJd3+B03FERET8XrbHS/vkujSuVztW3BSR4KQCF8CGdU2htMzyXo7uwomIiPySvAOFLNq0R3ffRCTgqcAFsKYJUZzTMoF3czZTVmadjiMiIuK3ZqzYibVo/puIBDwVuAA3rFsqm3cf4du1+U5HERER8Vtferwk16tDRqO6TkcRETkjKnAB7vx2DYiLDGX8/E1ORxEREfFLR4pKmb0mj6y29THGOB1HROSMqMAFuPAQN1ec3YRsj5f8g4VOxxEREfE7s9fkU1BcxqCMhk5HERE5YypwQWB4txSKSy3vL9zidBQRERG/k+3ZQUx4CN2axzsdRUTkjKnABYFW9WPIbBrHuws2Y60WMxERETmqtMzyVe5O+repT1iI/uwRkcAXnL/JNn0HBfudTlGjhnVLZV3+Ib5bv9vpKCIiIn5jyeY97DpUpNUnRSRoBF+B278d3rgIPhkNtehu1IUdGhETEcIELWYiIiLyP196vIS4DP3Sk5yOIiJSJYKvwNVtBP3+BMs/gJz/OJ2mxtQJc3NZp2Sm/LCDvYeLnI4jIiLiF6Z5vPRokUBsnVCno4iIVIngK3AAve+BVlkw9X7YtsTpNDVmWLcUikrK+HDxVqejiIiIOG5d3kHW5h3S8EkRCSrBWeBcLrh8LEQmwns3QME+pxPViHaNY+nYJJYJ87WYiYiIyLRcLwAD29Z3OImISNWpVIEzxgw2xqw0xqwxxtz3C+ddaYyxxpjM8tfNjDFHjDFLyreXqyr4SUUlwNDXYO9m+HhUrZkPN6xbKiu9B1i8ea/TUURERByV7fGS0aguTeIinY4iIlJlTlrgjDFu4AVgCJABDDfGZJzgvBhgNPDdcYfWWms7lW8jqyBz5aX2gIEPQO5kmD+2Rr+1Uy7u2JjIMLcWMxERkVpt18FCFm7cQ5aGT4pIkKnMHbhuwBpr7TprbREwAbj0BOf9DfgnUFCF+c7cOXdB2vnwxZ9h6yKn01S76PAQLunYmE+WbudAQbHTcURERBwxfcVOyiycpwInIkGmMgUuGdhc4fWW8n3/Y4w5G0ix1n52guubG2MWG2O+Mcb0OdE3MMaMMMbkGGNy8vLyKpu9clwuuPxliG4A790IR4J/aOGwbqkcKS5l8tJtTkcRERFxRLbHS6PYCNo1rut0FBGRKnXGi5gYY1zAk8DvT3B4O5Bqre0M3AP81xjzk9+k1tqx1tpMa21mUlI1PKclMt43H27/Vvj4jqCfD9exSSxtGsYwYf7mk58sIiISZAqKS5m1Op+stg0wxjgdR0SkSlWmwG0FUiq8blK+76gYoD3wtTFmA9ADmGyMybTWFlprdwFYaxcCa4H0qgh+ylK6QdZDsOJTmPeSIxFqijGG4d1SWbZ1Hz9srR0rcIqIiBz17Zp8jhSX6vEBIhKUKlPgFgBpxpjmxpgwYBgw+ehBa+0+a22itbaZtbYZMA+4xFqbY4xJKl8EBWNMCyANWFflP0Vl9RwFrS+A7P+DLTmOxagJl3VKJjzExYQFWsxERERql2yPl+jwELq3iHc6iohIlTtpgbPWlgCjgC+AXGCitXa5MeZhY8wlJ7m8L/C9MWYJMAkYaa3dfaahT5sxcNmLENPYNx/usHNRqltsZCgXdmjEx4u3cbioxOk4IiIiNaKszDItdyf9WicRHuJ2Oo6ISJWr1Bw4a+0Ua226tbaltfaR8n0PWGsnn+Dc/tbanPLP37fWtit/hMDZ1tpPqjb+aagTB0NfhwM74KPfBvV8uGHdUjlQWMJn3293OoqIiEiNWLJlL/kHC7X6pIgErTNexCQgNekC5/0NVn0Oc55zOk216dosjpZJUUxYoMVMRESkdsj2eHG7DP3T6zsdRUSkWtTOAgfQfSS0vRimPQSbjn/2eHAwxjCsayoLN+5hlfeA03FERESq3TSPl+7N44mNDHU6iohItai9Bc4YuOR5iG0Ck26CQ7ucTlQtrjg7mVC3Yfx8LWYiIiLBbUP+IVbvPKjVJ0UkqNXeAgdQpx5c/QYcyoMPb4eyMqcTVbmE6HDOa9eQDxdvpaC41Ok4IiIi1Sbb4wUgq60KnIgEr9pd4AAad4bzH4U12fDt006nqRbDu6ay93AxXyzf4XQUERGRapOd66VNwxhS4iOdjiIiUm1U4AC63goZl8H0v8PGOU6nqXLntEygeWIUf/s0lxU79jsdR0REpMrtPlREzobdGj4pIkFPBQ7K58M9B3FNYdLNcCjf6URVyuUyjP11F9wuuGbMPBZt2uN0JBERkSo1Y8VOyiwqcCIS9FTgjoqoC0Pf8D3c+4MRQTcfLq1BDJNGnkO9yFCuG/cd364JrpIqIiK1W7bHS4O64XRIjnU6iohItVKBq6jRWTDkH7D2K5j9hNNpqlxKfCTv3d6TlLhIbnptAV9qTpyIiASBguJSZq7OI6ttA4wxTscREalWKnDH63ITtL8KZjwK62c5nabK1a8bwbu396Bt47r85p1FfLBoi9ORREREzsjctbs4XFSq4ZMiUiuowB3PGLj4aYhvAe/fAgd3Op2oytWLDOOdW7vTvXk890xcyptzNzgdSURE5LR96fESFeamZ8sEp6OIiFQ7FbgTCY/xzYcr2Afv3wplwff8tOjwEF69sSuDMhrwwMfLeWHGGqy1TscSERE5JWVllq9yvfRrnUR4iNvpOCIi1U4F7uc0bA9DHof138DMfzmdplpEhLp58Vdnc3nnZP71xUoe+3yFSpyIiASU77fuY+eBQg2fFJFaI8TpAH7t7Oth47fw9T8gtQe06O90oioX6nbxxNCOxESEMHbmOvYfKeaRyzvgdmkSuIiI+L9szw7cLsO5res7HUVEpEboDtwvMQYufBIS03xDKQ8E56qNLpfhr5e0Y9S5rZiwYDN3TVhMUUlwPUZBRESC0zTPTro2i6NeZJjTUUREaoQK3MmER/vmwxUe9JW40hKnE1ULYwz3nt+a+4e04bPvtzPirRyOFAXf3D8REQkem3YdZqX3AIMyGjodRUSkxqjAVUaDDLjwCdgwC775h9NpqtXt/Vry2BUd+GZVHje8Op/9BcVORxIRETmhLz2+kTGD2mr+m4jUHipwldX5V9DpVzDz37DmK6fTVKvh3VJ5dlhnFm3aw7WvzGPXwUKnI4mIiPzEtFwvrRvEkJoQ6XQUEZEaowJ3Ki74NyS1gQ9ug/3bnE5TrS7u2JhXrs9ktfcgV4+Zy/Z9R5yOJCIi8j97DxexYMMerT4pIrWOCtypCIuEq9+A4gKYdEvQzoc76tw29Xnz5m549xdy1Utz2ZB/yOlIIiIiAMxYuZPSMkuWCpyI1DIqcKcqqTVc9BRsmgMzHnE6TbXr3iKB8bf14EhxKVe9PJfc7fudjiQiIkK2x0v9mHDOSo51OoqISI1SgTsdHa/xPSNu9pOwOtvpNNWuQ5NYJt7egxCX4Zoxc1m0aY/TkUREpBYrLCnlm5V5DGzbAJeeWyoitYwK3Oka8jg0aA8fjIB9W5xOU+1a1Y/hvZE9iYsK47px3zF7db7TkUREpJaau3YXh4pKOU/DJ0WkFlKBO12hdWDo61BaBJNuhtLgX24/JT6S90b2JDU+kptfX8AXy4PzweYiIuLfsj1eIsPc9GyZ4HQUEZEapwJ3JhLT4OJnYPN38NXDTqepEfVjIpgwogftkuvy23cW8cGi4L/7KCIi/qOszDIt10vftCQiQt1OxxERqXEqcGeqw1XQ5SaY8yysnOp0mhpRLzKMt2/pTo8W8dwzcSlvzNngdCQREaklfti2D+/+Qj0+QERqLRW4qjD4H9CwA3x4O+zd5HSaGhEVHsJ/bujKoIwGPDh5Oc99tRprrdOxREQkyGV7vLgMDGhT3+koIiKOUIGrCqERMPQNKCuF926CkiKnE9WIiFA3L/3qbK7onMwT2at4dEquSpyIiFSrbI+XzGbxxEWFOR1FRMQRKnBVJaElXPocbM2BaQ85nabGhLhd/HtoR27o2ZRXZq3nvveXUVqmEiciIlVv8+7DrNhxQKtPikitFuJ0gKDS7nLY8C3MewGangNtL3I6UY1wuQwPXdKO2DqhPDt9DQcLS3jqmk6Ehej9ARERqTrZHi8AWW1V4ESk9lKBq2rnPwJbFsBHv4WG7SGumdOJaoQxhnvOa01MRCiPTMnlYGEJL1/XhTphWiFMRESqxrRcL2n1o2mWGOV0FBERx+gWSVULCfc9Hw7gvRuhpNDJNDXutr4t+McVHZi5Oo/rX/2O/QXB/3w8ERGpfvsOF/Pd+t1afVJEaj0VuOoQ3xwuewG2LYYv/8/pNDVuWLdUnhvemSWb9zJ87Dx2HaxdJVZERKrejJU7KS2zZKnAiUgtpwJXXdpeDN1/A/PHgOdjp9PUuIvOaszY6zNZm3eQq8fMZdveI05HEhGRAJad6yUpJpxOTeo5HUVExFEqcNVp0MOQ3AU+HgW71zmdpsad27o+b97cnZ37Cxn68lzW5x9yOpKIiASgwpJSvlmZR1bb+rhcxuk4IiKOUoGrTiFhcNVrYIxvPlxxgdOJaly35vGMH9GDI8WlDH15Lrnb9zsdSUREAsx363ZzsLBEq0+KiKACV/3imsJlL8P2pfDln51O44j2ybFMvL0noW7DNWPmsnDjHqcjiYhIAMn2eKkT6qZXq0Sno4iIOE4Fria0uQB6joIF4+CH951O44hW9aN5b2RP4qPCuG7cd8xene90JBERCQDWWqbleumTlkhEqB5NIyKiAldTsh6CJl1h8mjYtdbpNI5oEhfJxJE9aZoQyc2vL2DqDzucjiQiIn5u+bb9bN9XoMcHiIiUU4GrKe5Q33w4dwhMvAGKa+eqjPVjInh3RE/aJdfljv8u4v2FW5yOJCIifuxLjxeXgQFt6jsdRUTEL6jA1aR6KXD5GPAug6n3OZ3GMbGRobx9S3d6tkjg9+8t5fVv1zsdSURE/FS2x0uXpnEkRIc7HUVExC+owNW09POh12hY+Dp8/57TaRwTFR7Cf27M5Px2DXjoEw/PfrUaa63TsURExI9s2XOY3O37NXxSRKQCFTgnDPg/SOkBn4yGvFVOp3FMeIibF649myvPbsKT2at45LNclTgREfmfaR4vAIMyGjqcRETEf6jAOcEdCle9CqER8N4NUHTY6USOCXG7+NdVZ3HjOc0YN3s9972/jNIylTgREYFpuTtpmRRF88Qop6OIiPgNFTinxCbD5WNhpwc+/4PTaRzlchkevDiDuwam8W7OZu4av5iikjKnY4mIiIP2HSlm3rpduvsmInKcShU4Y8xgY8xKY8waY8zPrr5hjLnSGGONMZkV9t1fft1KY8z5VRE6aKRlQZ/fw+K3Ycl4p9M4yhjDPYPS+cuFbfls2XZuezOHI0WlTscSERGHfL1yJyVllkEZWn1SRKSikxY4Y4wbeAEYAmQAw40xGSc4LwYYDXxXYV8GMAxoBwwGXiz/enJU//8HTXvDZ/fAzhVOp3HcrX1a8PiVZzFrdR7Xv/od+wuKnY4kIvKzTvYGpzHmKWPMkvJtlTFmb4VjpRWOTa7Z5P5vWu5OEqPD6JQS53QUERG/Upk7cN2ANdbaddbaImACcOkJzvsb8E+goMK+S4EJ1tpCa+16YE3515Oj3CFw5TgIjSyfD3fI6USOu7prCs9fezZLNu9l+Nh55B8sdDqSiMhPVOYNTmvt76y1nay1nYDngA8qHD5y9Ji19pIaCx4AikrK+HrFTga2aYDbZZyOIyLiVypT4JKBzRVebynf9z/GmLOBFGvtZ6d6rQB1G/lKXN5K+Oxep9P4hQs6NGLcDV1Zm3eQq1+ey7a9tfPB5yLi1yr7BudRw4HaPV6+kuav382BwhKy9PgAEZGfOONFTIwxLuBJ4Pdn8DVGGGNyjDE5eXl5ZxopMLU8F/r9EZb+1zcnTuiXnsRbt3Qn70AhQ1+ey7q8g05HEhGpqNJvUhpjmgLNgekVdkeU/9s3zxhzWfXFDDzZnh1EhLro3SrR6SgiIn6nMgVuK5BS4XWT8n1HxQDtga+NMRuAHsDk8oVMTnYtANbasdbaTGttZlJS0qn9BMGk35+geV/fXTivx+k0fqFrs3jGj+hBQXEpV4+Zi2fbfqcjiYicjmHAJGttxdWZmlprM4FrgaeNMS1PdGFte5PTWku2x0vvVknUCdO0eRGR41WmwC0A0owxzY0xYfj+EfrfZGtr7T5rbaK1tpm1thkwD7jEWptTft4wY0y4MaY5kAbMr/KfIli43HDFOAiP8c2HK9QdJ4D2ybFMHNmTULeLYWPnsnDjbqcjiYhAJd+kLDeM44ZPWmu3ln9cB3wNdD7RhbXtTU7P9v1s21fAeRo+KSJyQictcNbaEmAU8AWQC0y01i43xjxsjPnFSdfW2uXARMADTAXuOO7dRzleTAPffLhda+DT34HVQ60BWiZF897IniREh3PduPnMWh3870KLiN/7xTc4jzLGtAHigLkV9sUZY8LLP08EeuH7t7LWy/Z4MQYGtNXjA0RETqRSc+CstVOstenW2pbW2kfK9z1grf3JP1TW2v7ld9+Ovn6k/LrW1trPqy56EGvRD/rdB8smwqI3nE7jN5rERTLx9p40S4ziltdzmPrDDqcjiUgtdgpvcA7DtyJzxXfk2gI5xpilwAzgH9ZaFTh8Be7s1DgSo8OdjiIi4pfOeBETqSZ974UW/WHKH2HHMqfT+I2kmHAm3NaD9sl1+e07C3kvZ/PJLxIRqSaVeYPTWvuQtfa+466bY63tYK3tWP7xPzWd3R9t23uE5dv2M0jDJ0VEfpYKnL86Oh+uThxMvAEKtHjHUbGRobx9a3d6tUrkD5O+59XZ652OJCIiVWBarhdABU5E5BeowPmz6CS46j+wZz18Mlrz4SqIDAth3A2ZDG7XkIc/9fDMtNVY/e8jIhLQsj1eWiRG0TIp2ukoIiJ+SwXO3zXrDef+GZZ/ADkaYVNReIib56/tzFVdmvDUtFX8/bNclTgRkQC1v6CYeet26e6biMhJhDgdQCqh9z2waS5MvR+SM6FxJ6cT+Y0Qt4vHrzyLmIgQ/jN7PQcKinnsirNwu4zT0URE5BR8szKP4lJLlgqciMgv0h24QOByweVjITIR3rsRCvY5ncivuFyGBy7K4O6sNCbmbOHO8YsoLNHTKkREAsm0XC8JUWGcnRrndBQREb+mAhcoohJg6GuwdxNMvlPz4Y5jjOHurHT+76IMpizbwW1vLuRwUYnTsUREpBKKS8uYsWInA9rU1wgKEZGTUIELJKk9YOAD4PkY5r/idBq/dEvv5jx+1VnMXp3H9f+Zz74jxU5HEhGRk5i/fjf7C0o0fFJEpBJU4ALNOXdB2vnwxf+DrYucTuOXrs5M4YVrz2bplr0MHzuP/IOFTkcSEZFfkO3xEh7iok9aotNRRET8ngpcoHG54PKXIbqBbz7ckb1OJ/JLQzo0YtwNXVmXf5CrX57L1r1HnI4kIiInYK0l2+OlT1oikWFaW01E5GRU4AJRZDwMfR32b4WP79B8uJ/RLz2Jt2/pTt7BQoa+NId1eQedjiQiIsdZseMAW/ceIauthk+KiFSGClygSukKWX+FFZ/CvJecTuO3MpvFM2FED4pKy7h6zFyWb9MKniIi/iTb48UYGKgCJyJSKSpwgaznHdD6Asj+P9iS43Qav9WucSwTb+9JmNvFsLHzWLhxt9ORRESkXLbHS6eUeiTFhDsdRUQkIKjABTJj4LIXIaaxbz7cYRWTn9MiKZr3fnMOSdHhXDduPjNX5TkdSUSk1tu+7wjLtu5jkFafFBGpNBW4QFcnzjcf7sAO+Oi3mg/3C5Lr1eHd23vSLDGKW95YwOfLtjsdSUSkVpuWuxOA81TgREQqTQUuGDTpAuf9DVZ9DnOeczqNX0uKCWfCiB6c1aQed/x3EePnb3I6kohIrZXt8dIsIZKWSdFORxERCRgqcMGi+0hoezFMewg2fed0Gr8WWyeUt27pRu+0JO7/YBm/e3cJBwr0wG8RkZp0oKCYuWvzGZTRAGOM03FERAKGClywMAYueR5im8Ckm+DQLqcT+bXIsBBevSGT32Wl8/GSrVz47GwWb9rjdCwRkVpj5qp8ikstgzIaOh1FRCSgqMAFkzr14Oo34FAefDQSysqcTuTXQtwuRmelMfH2npSWWYa+PJcXZqyhtEzzCEVEqtu0XC9xkaGcnVrP6SgiIgFFBS7YNO4M5z8Kq7+EOc84nSYgZDaLZ8roPgxu35B/fbGS68Z9x459BU7HEhEJWsWlZUxfsZMBbRoQ4tafIiIip0K/NYNR11sh4zL46m+wca7TaQJCbJ1QnhvemcevOoulW/Yy+JmZfLl8h9OxRESC0oINu9l3pJhBGfWdjiIiEnBU4IKRMXDJcxDXtHw+XL7TiQKCMYarM1P49M7eNImrw4i3FvKXj5ZRUFzqdDQRkaAyzbOTsBAXfdKSnI4iIhJwVOCCVURdGPqG7+HeH4zQfLhT0CIpmg9+04sRfVvw9rxNXPL8bFbs2O90LBGRoGCtJTt3B71bJRIVHuJ0HBGRgKMCF8wanQVD/gFrv4LZTzidJqCEhbj4fxe05c2bu7H7UDGXPP8tb8zZgNWD0kVEzsgq70E27z5CVls9vFtE5HSowAW7LjdB+6tgxqPww/tQWuJ0ooDSNz2JqXf3oVfLBB6cvJzb3sxh96Eip2OJiASsbI9vfnFWW81/ExE5HSpwwc4YuPhpSEyHSTfDE63hs9/DxjkaVllJidHhvHpjVx68OIOZq/IZ/PRMZq/WvEIRkdOR7fHSKaUe9etGOB1FRCQgqcDVBuExMOIbuOZtaN4HFr8Drw2Bp9rBF3+GrQtBQwN/kTGGm3o156M7elG3Tii/fvU7Hvs8l6ISlWARkcry7i9g6ZZ9DMrQ8EkRkdOl2cO1RWgEtL3YtxUehFVTfUMqvxsDc5+HuGbQ/krfVj/Dd+dOfiKjcV0+GdWbv33mYcw365i7dhfPDutMs8Qop6OJiPi9ableABU4EZEzoDtwtVF4NHS4CoaPhz+shktfgPgWMPtpeOkceLEHfPM45K9xOqlfqhPm5tHLO/DydWezcddhLnx2FpMWbtECJyIiJ5Ht8ZIaH0la/Wino4iIBCwVuNquThx0vg5+/SH8fiVc+AREJvgWPXm+C7zcx1fs9m5yOqnfGdy+EZ+P7kP75FjufW8poycsYX9BsdOxRET80qHCEuas2cWgjAYYjfIQETltKnByTHQSdL0VbpoCv1sO5z8K7lCY9iA83QHGDYJ5L8OBHU4n9RuN69Xhv7f14N7z0vls2XYueGYWCzfucTqWiIjfmbkqj6LSMg2fFBE5QypwcmKxydDzDrhtOty1BAY+CMVHYOqf4Ik28PpFkPMaHNrldFLHuV2GUQPSmHh7TwCuHjOX575aTWmZhlSKiByVneulXmQomU3jnI4iIhLQVODk5OKbQ5974Dez4Y750O9PcGA7fHo3PJEOb18FS8a3q1hWAAAgAElEQVRDwT6nkzqqS9M4pozuw4UdGvFE9iqufWUe2/YecTqWiIjjSkrLmL5iJwNa1yfErT89RETOhH6LyqlJag3n3g+jcuD2WdBzFOSthI9Gwr/SYMKv4IcPoOiQ00kdUTcilGeGdeKJoR35Yes+hjwzi6k/bHc6loiIo3I27mHv4WINnxQRqQJ6jICcHmOg0Vm+Lesh2JLjeyzB8g9hxacQGgmth/geS9AqC0LCnU5cY4wxXNmlCV2axnHXhMWMfHsRw7ul8sBFGdQJczsdT0Skxk3zeAlzu+iTnuR0FBGRgKcCJ2fOGEjp6tvOfwQ2zvGVOc/Hvo/hsdD2Imh/BTTv51sYpRZolhjFpJHn8GT2KsbMXMuCDbt5dlhnMhrXdTqaiEiNsdaSnevlnFYJRIfrzw4RkTOlIZRStVxuaN4HLn4a7l0Fv3of2lwIuZ/A21fCE63h09/BhtlQVup02moXFuLiviFtePuW7uw/UsxlL3zLa9+u1zPjRKTWWL3zIBt3HSarrYZPiohUBRU4qT7uUEjLgstfgntXwzXvQIv+sHQCvH4hPNUOpt7vG34Z5IWmV6tEPh/dh77pifz1Ew83v76A/IOFTscSEal22R4vgOa/iYhUERU4qRmhEb5hlFe9Cn9Y4/uY3AUWjINxA+GZsyD7Qdj+fdCWuYTocF65PpOHL23Ht2t3MfjpWcxcled0LBGRapXt8dKxSSwN6kY4HUVEJCiowEnNC4vyLW4y7B1fmbvsJUhMhznPwZg+8HxXmPEY5K1yOmmVM8Zwfc9mTB7Vi/ioUK5/dT6PfOahqKTM6WgiIlVu54EClmzeq+GTIiJVSAVOnBURC52uheve9w2zvOgpiGkI3/wTXugKL/WGWU/Cng1OJ61SbRrWZfKo3lzXI5VXZq3nipe+ZV3eQadjiYhUqa9ydwIwqJ0KnIhIVVGBE/8RlQCZN8ONn8I9uTD4H76hl1/9FZ7pCK8MhLkvwv5tTietEhGhbv5+WQfG/roLW/Yc4aLnZjMxZ7MWOBGRoJHt8ZISX4fWDWKcjiIiEjRU4MQ/1W0EPX4Dt06D0d9D1l+htAi+uB+ezIDXLoQF/4FD+U4nPWPntWvI1NF96dikHn+c9D2jxi9m35Fip2OJiJyRw0UlzF6TT1bbBhhjnI4jIhI0VODE/8U1hd53w8hZMCoH+t8Ph3bCZ/fAv9PhrStg8TtwZK/TSU9bw9gI3r61O384vzVTf9jBBc/MImfDbqdjiYictpmr8ikqKdPqkyIiVUwFTgJLYhr0/xPcMR9Gfgu9RsOuNfDxb+HfaTB+OCybBIWBN5/M7TLccW4rJo3sidtluHrMXJ6etoqSUi1wIiKBJ9vjpW5ECF2bxTsdRUQkqIQ4HUDktBgDDdv7toEPwNZF8MP7sPwDWDkFQupA68G+1S5bDfLNpQsQnVPj+Oyu3jzw8XKenraab9fk8/SwziTXq+N0NBGRSikts0xf4WVAm/qEuvVesYhIVarUb1VjzGBjzEpjzBpjzH0nOD7SGLPMGLPEGDPbGJNRvr+ZMeZI+f4lxpiXq/oHEMEYaNIFBj8Kv/PAjVN8K1uunwnvXgf/agUfjoTV2VAaGHPLYiJCeeqaTjx1TUdytx9gyNMzmbJsu9OxREQqZeHGPew5XMygjIZORxERCTonvQNnjHEDLwCDgC3AAmPMZGutp8Jp/7XWvlx+/iXAk8Dg8mNrrbWdqja2yM9wuaBZL9825HFY/w388AHkfgJLx0OdOMi41HdnrmkvcLmdTvyLLu/chLNT47hrwhJ++84irslM4cFLMogM081zEfFf03K9hLoNfdMTnY4iIhJ0KvNXYDdgjbV2HYAxZgJwKfC/Amet3V/h/ChA66CL89wh0Gqgb7voSVg73TfM8vv3YOHrEN0A0s+Hxp2hUSdo0A5Cwp1O/RNNE6KYNLInT2Wv4qVv1rJg426eHdaZ9smxTkcTEfkJay3ZHi89WyYSExHqdBwRkaBTmQKXDGyu8HoL0P34k4wxdwD3AGHAgAqHmhtjFgP7gb9Ya2ed4NoRwAiA1NTUSocXqbSQcGg9xLcVHYbVX/jKnGcyLHrTd44rBOq39ZW5Rh19xa5BOwh1fu5ZqNvFHwe3oXerRH43cQlXvDiHPw5uzc29muNyaXluEfEfa/MOsj7/EDf3auZ0FBGRoFRl47CstS8ALxhjrgX+AtwAbAdSrbW7jDFdgI+MMe2Ou2OHtXYsMBYgMzNTd++keoVFQrvLfZu1sHcjbFsC25fC9iWw4jNY/JbvXOOGpDbQuJOv2DXuBA3a+76GA85plcjU0X354/vf8/fPcpm1Op9/D+1IUoz/3TkUkdop27MTgCw9PkBEpFpUpsBtBVIqvG5Svu/nTABeArDWFgKF5Z8vNMasBdKBnNNKK1LVjIG4Zr6t3WW+fdbCvs2+Qrdtia/UrfoClrxTfo0LElsfK3WNOkLDDhAeXSOR46LCGPvrLrz93Sb+/qmHIc/M5N9DO9K/df0a+f4iIr8k27ODDsmxNIp1fvSCiEgwqkyBWwCkGWOa4ytuw4BrK55gjEmz1q4uf3khsLp8fxKw21pbaoxpAaQB66oqvEi1MAbqpfq2thf79lkL+7f5ytzRu3Vrp/sWRvFdBInp5UMvjxa7syA8ppoiGn7doyndmsVz1/jF3PjaAm7u1Zw/DWlNeIh/L8wiIsEr70Ahizfv5e6B6U5HEREJWictcNbaEmPMKOALwA28aq1dbox5GMix1k4GRhljsoBiYA++4ZMAfYGHjTHFQBkw0lq7uzp+EJFqZQzEJvu2Nhce279/u6/UHb1bt2EWLJt49CJIaHls6OXRUhdRdYuPtG4Yw8ejevHYlFxe/XY989bt4tnhnWlVv2buBoqIVDR9hRdrYZCGT4qIVBtjrX9NOcvMzLQ5ORphKQHsgPfYfLqjd+v2bzl2PL5FhYVSyj/WiTvjbzvN4+UPk5ZSUFzGgxdncE3XFIzRAifi34wxC621mU7nCBT+/m/krW8sIHf7AWb/6Vz9/hEROQO/9O+jHiYlUtViGkDMeZB+3rF9B/PKS91i38ctObD8g2PH45r5ilzFu3WR8af0bbMyGjD17r7cM3EJ932wjJmr83js8rOIjdQy3iJS/Y4UlTJrdT7Du6WqvImIVCMVOJGaEJ0EaVm+7ahDu2BHhYVSti0Bz8fHjsemQuOO5cWus6/YRf3yQ3Eb1I3grZu7M3bWOv79xUqWbJrJ08M60635qZVBEZFTNWt1HoUlZRo+KSJSzVTgRJwSlQAtB/i2ow7vhh3fHyt125dC7ifHjtdt8uOFUhp3gugfrz7pchlG9mtJzxYJjJ6wmGFj5zLq3FbcNTCNELerhn44Ealtsj1eYiJC9IaRiEg1U4ET8SeR8dCiv2876sjeCqWufG7dys+OHY9pVGHoZfkwzLqN6JhSj0/v6sODHy/n2elr+HbtLp6+phMp8c48w05EgldpmWX6ip2c27o+oXqjSESkWqnAifi7OvWgeV/fdlTBftixrMJCKUtg1VSgfFGi6AbQqBPRjTryxFmdOC+lIfdOzeOCZ2fx6OUduLhjY0d+FBEJTos37WHXoSINnxQRqQEqcCKBKKIuNOvl244qPHhcqVsKa7LBlnE+kBWZyNLSpnz7Xgqv52Ry9cUXEZnUzPeIBBGRM5Cd6yXUbejXOsnpKCIiQU8FTiRYhEdD056+7aiiQ7DjB9i+BPf2pXTetphORZ/g2vwRvPgXSsLjCGnS+ccrYNZrqlInIqck2+OlR4sE6kZo1VsRkeqmAicSzMKiILW7bwMMYIqP8MOib/k8eyrNjqzmXO8WEtbPxJSV+K4Jj4WkdEhMh4RWvo+J6RDfHNz640xEfmxt3kHW5R3ixnOaOR1FRKRWUIETqW1C69C+exZNOvTlvveX8YflOxjQqi7/7htC/D4PeH+A/NWw5itY8s6x61whENe8vNClHSt2ia2q5EHkIhKYpnm8AAxsq/lvIiI1QQVOpJaqFxnGS9edzfj5m3n40+VkvRvCv4dexICutxw7qWAf5K+B/FXHtl1rYPWXUFZ87Lyo+scVuzTfFpsKLq1IJxLMsj1e2jWuS3K9Ok5HERGpFVTgRGoxYwzXdk+la7M47hy/mJtfz+HXPZoyOiuNxOhwiIiFJl18W0WlJbB344+LXf5qWP4hFOw9dl5IRPkwzIp37NJ8+8KiavaHFZEql3+wkIWb9nDXgDSno4iI1BoqcCJCWoMYPrqjF/+cuoI35mxg0sIt/Kp7KiP6taB+TMRPL3CHQEJL39Z6yLH91sLhXT8udfmrfatiej4GW3bs3NiUH9+xSyj/PKahFlERCRDTV+zEWvT4ABGRGqQCJyIARIS6efDidlzXoykvzFjDa3M28Na8jQzvlsrIfi1pGHuCInc8YyAq0bc1PefHx4oLYPe6CsWuvOQteguKDx07LyzmuKGYRxdRaQEhYVX7Q4vIGcn2eGkcG0G7xnWdjiIiUmuowInIj7RMiubJqztx14A0Xvx6DW/P28h/v9vENV1TGNm/5enPcwmNgAYZvq0ia+HA9p8Wuw2z4PsJx84zbohrdoK5dukQGX/aP6+InJ6C4lJmrc7j6swUjO6ai4jUGBU4ETmhZolRPH5VR+4ckMaLX69lwoJNTFiwiau6pPDb/i1JiY+smm9kDNRt7Nta9P/xscIDvkVTKha7/DWwdjqUFh47LzLhBKtjpvmeaedyV01OEfmR2avzKSgu0/BJEZEapgInIr8oJT6Sx67owKgBrRjzzVomzN/MxJzNXNE5mTvObUWzxGpcjCQ8Bhp39m0VlZXC3k3HFbvVsGIKHH7z2HnusJ8uonL0dXhM9eUWqQWyPV5iwkPo3jzB6SgiIrWKCpyIVEpyvTo8fGl7ftu/FWNmruW/323i/UVbuKxTMncMaEXLpOiaC+Ny+x4sHt8c0s/78bHDu31lbtfqY8XOuxxyPwVbeuy8mMY/vWOXmO67E6jhYCK/qKzM8tUKL/1aJxEWokeFiIjUJBU4ETklDWMjePDidvymf0tembmOt+dt4sMlW7n4rMaMGtCK9AYO39mKjIfU7r6topIi2LP+uBUyV8H370Lh/mPnhUb99EHlCa0gugHUifetwClSyy3evJf8g0UaPiki4gD9JSIip6V+TAR/vjCD2/u1ZNys9bw5dwOffL+NC9o3YtSAVrRt5Ger0oWEQVJr31aRtXBw50+L3aZ5sGziT79OnTiILF9pMzKhfNXNpJ/uiyz/XCtnBjVjzGDgGcANjLPW/uO4408B55a/jATqW2vrlR+7AfhL+bG/W2vfqJnUZy7b4yXEZejfur7TUUREah0VOBE5I4nR4dw3pA23923Bq9+u5/VvN/DZsu2cl9GAuwam0T451umIv8wYiGng25r3+fGxosO+RVR2r4NDeb5n3B3Kg0P5vs93rYXN3/k+r/iMu4rCY489WiEyEaISKpS9xOOOJUJIePX/zFIljDFu4AVgELAFWGCMmWyt9Rw9x1r7uwrn3wl0Lv88HngQyAQssLD82j01+COctmm5Xrq3iCe2TqjTUUREah0VOBGpEnFRYfz+vNbc2rsFr81Zz6uz1/Olx8vANvW5c2AanVLqOR3x1IVFQqOzfNsvKSuDI3vgcH55ucs/VvL+9zoP9myArTm+/WUlP/M9Y35c8iqWuxPd5QurotVA5XR0A9ZYa9cBGGMmAJcCnp85fzi+0gZwPpBtrd1dfm02MBgYX62Jq8D6/EOs2XmQ67qnOh1FRKRWUoETkSoVGxnK3Vnp3Ny7OW/O2cC42eu57IVv6ZeexF0D0+jSNM7piFXP5fKVrqiEnw7RPBFroWAvHNp1rNz9r+jtOlYA922F7Ut9n5cVn/hrhUad4K7e0ddJP90XFqVFWqpOMrC5wustQPcTnWiMaQo0B6b/wrXJP3PtCGAEQGqq86VpmscLQJbmv4mIOEIFTkSqRd2IUEYNSOPGXs15a+5GXpm1jitfmkPvVoncOaAV3VvU4qXHjfHNpasTB7Q6+fnW+hZaqXhX71DeTwvfQS94Pb5jFZ+TV1FIxLFC93Nz9yre+QuPUeGrGsOASdZWXAq1cqy1Y4GxAJmZmbaqg52qbI+Xto3q0iROd39FRJygAici1So6PITf9G/JDec05Z15mxgzcx3XjJ1H9+bxjM5Ko2eLBIwKwi8zBiJifVtCy5Ofby0UHTzBMM78CnP5yvflrfJ9LD584q/lDvv5uXutL4AGGVX7swaWrUBKhddNyvedyDDgjuOu7X/ctV9XYbZqsftQETkbdzNqQJrTUUREai0VOBGpEZFhIdzWtwXX9WjK+PmbGDNzLde+8h2ZTeO4a2AafdISVeSqijG+O2fhMb5n5VVG0aETD+M8+vroHb/d63wFsOggxDWr7QVuAZBmjGmOr5ANA649/iRjTBsgDphbYfcXwKPGmKNjis8D7q/euGdu+oqdlFkY1FbDJ0VEnKICJyI1qk6Ym5t7N+fa7qm8l7OZF79ey/WvzqdTSj1GD0yjf+skFTknhEX5trimlTu/uKDWD6201pYYY0bhK2Nu4FVr7XJjzMNAjrV2cvmpw4AJ1lpb4drdxpi/4SuBAA8fXdDEn2V7dtCwbgTtk/3sMSEiIrWICpyIOCIi1M2vezbj6q4pvL9wKy/MWMNNry+gQ3Isdw1MI6ttfRU5fxYa4XQCv2CtnQJMOW7fA8e9fuhnrn0VeLXawlWxguJSZq7K58ouyfpvU0TEQS6nA4hI7RYe4uba7ql8/Yf+PH7lWew7Usxtb+ZwwbOzmfrDdsrKHF+zQUSAOWvzOVJcyqCMhk5HERGp1VTgRMQvhLpdXN01hem/78cTQztSUFzKyLcXMeSZWXyydBulKnIijsr2eIkOD6FHi3ino4iI1GoqcCLiV0LcLq7s0oRp9/TjmWGdKLWWO8cv5rynvuGjxVspKS1zOqJIrVNWZpmWu5N+6UmEh7idjiMiUqupwImIX3K7DJd2SubLu/vywrVnE+Jycfe7Sxj01EwmLdyiIidSg5Zu2UvegUIG6eHdIiKOU4ETEb/mchkuPKsRn4/uw8vXdaFOqJt731vKgCe+4d0FmygqUZETqW7ZHi9ul+Hc1vWdjiIiUuupwIlIQHC5DIPbN+Szu3oz7vpM6kWG8qf3l3Huv7/mne82UlhS6nREkaA1LddLt2bxxEaGOh1FRKTWU4ETkYBijCErowEf39GL127qSv264fz5wx/o/6+veWPOBgqKVeREqtLGXYdY5T2o4ZMiIn5CBU5EApIxvuFcH/zmHN6+pTtN4urw4OTl9H18Bv+ZvZ4jRSpyIlUh2+MFUIETEfETKnAiEtCMMfROS2Ti7T0Zf1sPWiZF87dPPfR5fDpjZ67lUGGJ0xFFAlq2x0ubhjGkxEc6HUVERFCBE5EgYYyhZ8sExo/owcTbe9K2UV0enbKCPo/P4MWv13BQRU7klO05VMSCDbt1901ExI+owIlI0OnWPJ63bunO+785h7OaxPL41JX0+sd0nv1qNfuOFDsdTyRgzFi5kzILWW1V4ERE/IUKnIgErS5N43j9pm58fEcvujaL58nsVfT+53SezF7F3sNFTscT8XvZHi8N6obTITnW6SgiIlJOBU5Egl7HlHqMuyGTT+/sTa+WiTz71Wp6/3MG//piBbsPqciJnEhBcSnfrMojq20DXC7jdBwRESmnAicitUb75Fhe/nUXpt7dh36tk3jx67X0/ud0Hvs8l/yDhU7HE/Erc9ft4nBRKVma/yYi4ldCnA4gIlLT2jSsywvXns1q7wGen7GGV2au4405G/hV96bc3rcF9etGOB1RxHHZHi9RYW7OaZngdBQREalAd+BEpNZKaxDDM8M6k31PPy7o0IjX52yg9+MzeGjycrbvO+J0PBHHlJVZvsr10jc9ifAQt9NxRESkAhU4Ean1WiZF8+TVnfjqnn5c1qkxb8/bSL/Hv+YvHy1j614VOal9lm3dh3d/oR4fICLih1TgRETKNUuM4vGrOjLj3v5cldmEdxdspv+/ZnDf+9+zPv+Q0/FEaky2x4vbZRjQpr7TUURE5DiVKnDGmMHGmJXGmDXGmPtOcHykMWaZMWaJMWa2MSajwrH7y69baYw5vyrDi4hUh5T4SB69vAPf/OFchndL5YPFWxnwxNeMfGshizftcTqeSLWblusls2kc9SLDnI4iIiLHOWmBM8a4gReAIUAGMLxiQSv3X2ttB2ttJ+Bx4MnyazOAYUA7YDDwYvnXExHxe43r1eHhS9vz7Z8GcEf/VsxZm8/lL87h6jFz+SrXS1mZdTqiSJXbvPswK3Yc0PBJERE/VZk7cN2ANdbaddbaImACcGnFE6y1+yu8jAKO/lVzKTDBWltorV0PrCn/eiIiASMpJpx7z2/NnPsH8n8XZbBl92FueSOH85+eyXs5mykqKXM6okiV+dLjBVCBExHxU5UpcMnA5gqvt5Tv+xFjzB3GmLX47sDddSrXiogEgujwEG7p3Zxv/nguT13TEbfL8IdJ39Pn8emM+WYt+wuKnY4ocsamebykN4imaUKU01FEROQEqmwRE2vtC9balsCfgL+cyrXGmBHGmBxjTE5eXl5VRRIRqRahbheXd27C56P78MbN3WiZFM1jn6+g12PTeWxKLjv2FTgdUeS07D1cxPwNu3X3TUTEj1XmQd5bgZQKr5uU7/s5E4CXTuVaa+1YYCxAZmamJpWISEAwxtAvPYl+6Uks27KPMTPX8sqsdbz67Xou65TMiL4tSGsQ43RMkUr7emUepWWWrLYqcCIi/qoyd+AWAGnGmObGmDB8i5JMrniCMSatwssLgdXln08Ghhljwo0xzYE0YP6ZxxYR8S8dmsTy/LVn8/W953Jtt1Q++X4bg56ayS2vL2D++t1Yq/emxP9le7zUjwmnY5N6TkcREZGfcdI7cNbaEmPMKOALwA28aq1dbox5GMix1k4GRhljsoBiYA9wQ/m1y40xEwEPUALcYa0traafRUTEcakJkfz10vaMzkrnzbkbeGPOBq4eM5fOqfW4vW8LBmU0xO0yTscU+YnCklK+XrmTSzol49L/R0VE/FZlhlBirZ0CTDlu3wMVPh/9C9c+AjxyugFFRAJRfFQYd2elc3vflkxauJlXZq1n5NuLaJ4YxW19WnDF2clEhOqpKuI/5q3bzaGiUgZl6OHdIiL+rMoWMRERkZ+qE+bm1z2bMf33/Xj+2s5Eh4fw/z5cRu9/Tuf56avZe7jI6YgiAGR7dlAn1M05LROdjiIiIr+gUnfgRETkzIS4XVz0/9u799gs6zOM49fdWk4FRChIKcdyPqggqBGwSOUgKo6p2zCOROPQZc5pmIcuW+KWaDxkHrOJCkpmJB4WXWJkU1uFlpMIIoi0wqDUcSgth9iCAgK990cbJz5ltEr7e5+330/S0PaP5srdpjdXn9/zvOf20JXnZGpl6T49W1iqP7+7WU8v2aqZF/TWzZf0U1antqFjooVydxUUVypnUAZXhgEgwVHgAKAZmZnG9s/Q2P4ZKimv1ryi0tp75VaWafq5mbolp7+G9egYOiZamE93Vmt39WHdNWxw6CgAgFPgCCUABDI0s6Me+9lIFd0zUTeN7av84gpd8dRSzXp+lZZv2cuTK9Fs8ot3K8Wk3CHc/wYAiY4CBwCB9ejUVn+4aphW5F2mu6cOVkn5Ad0wf5Wm/2WZ3ly/S8eO14SOiCSXX1KpMX06q3N6q9BRAACnQIEDgARxZrs03TZxgJbdO1EPXXOOvjpyXL95+WNd+ucl+tuKMn319bHQEZGEtu//SiXl1Zo8jBfvBoA4oMABQIJpk5aqmRf2VsGcCXp21mh169Ba9725UeMeel+P52/WvoNHQkdEEikoqZAkTaLAAUAs8BATAEhQKSmmqcO7a+rw7lpTtl/PFJbqyff+rWcKt+qnY3rpF5f0U58u6aFjIuYKSio0oFt79cvgZwkA4oACBwAxMKZvZ83v21lbKg9oXtE2vbp6uxau+lzTRmTqlpxsnderU+iIiKGqQ0e1qnS/Zudkh44CAGggChwAxMiAbh308HXnas6UQVqwvEwLV32uRRvKdXF2F906IVsTBnWVmYWOiZhYsqlSx2pck4ZyfBIA4oJ74AAghs7u2EZ504ZoRV6ufn/FUG3b+6VuXLBa055cqjfW7tBRnlyJBsgvrlBG+9YaxRVcAIgNChwAxFiHNmmanZOtonsm6tGfnKcad815bb0mPLJY85eW6uARnlyJ+n19rEaFm/Zo0tBuSknhqi0AxAUFDgCSQKszUnTt6J56584cLbjxAvXu0k73LyrRxQ++p0fe/kyVBw6HjogEs2rbPh04cozjkwAQM9wDBwBJxMw0cUg3TRzSTeu2f6HnirZqbuFWzV+6Tdecn6XZOdnq37V96JhIAPnFFWqblqrxAzNCRwEANAIFDgCS1MhenfT0DaNVtvdLzV9Wqr+v2aFX12zXpKFn65cTsjW6T+fQERGIu6uguEKXDMxQm7TU0HEAAI3AEUoASHJ9M9J1/4xztDwvV7dPHKDVZft17dyVum7uCuUXV6imxkNHRDPbuKtau6oO8+LdABBDFDgAaCEy2rfWnCmDtSIvV3+cPkzlVYc1+8U1mvx4oV5d/R8dOXY8dEQ0k/ziCplJlw3pFjoKAKCRKHAA0MK0a3WGbhzXT4V3X6qnrh+lNmmpuvf1DRr/8GI9vWSLqg4dDR0RTaygpEKje5+lLu1bh44CAGgkChwAtFBnpKbo6vN66K3bx+ulmy/SkO4d9MjbmzT2wff0wKJilVcdCh0RTWDnF4e0cVe1JnN8EgBiiYeYAEALZ2YaPzBD4wdm6NOdVZq3tFQvLC/TguVlunpkD92a01+Du3cIHROnSUFxhSRR4AAgprgCBwD4xoisM/XkzFFaclJDiYkAAAVgSURBVNelmnVxH/1rw25NfaJINy34UCu37pM7DzyJu4KSCmV3TVc2LycBALFEgQMARPTq3E73TR+uFXm5+u3kQfpkR5Wun/eBZvx1uf65oVzHeXJlLFUfPqoPSvdx9Q0AYowCBwA4qbPSW+n2ywZqeV6uHvjxCFUdOqpfLVyr3EeXqGjzntDx0EhLNu3R0eOuKRQ4AIgt7oEDAJxSm7RU3XBRH828oLfyi3drbmGpOrZNCx0LjVRT4xrVu5NG9jordBQAwPdEgQMANFhqiunyEZmaOry7zCx0HDTSjFFZmjEqK3QMAMAPwBFKAECjUd4AAAiDAgcAAAAAMUGBAwAAAICYoMABAAAAQExQ4AAAAAAgJihwAAAAABATFDgAAAAAiAkKHAAAAADEBAUOAAAAAGKCAgcAAAAAMUGBAwAAAICYoMABAAAAQExQ4AAAAAAgJihwAAAAABATFDgAAAAAiAkKHAAAAADEhLl76AwnMLM9kj4/DV8qQ9Le0/B1kgkziWImUcwkipnU73TMpY+7dz0dYVqC07Qj+XmOYib1Yy5RzCSKmUQ16X5MuAJ3upjZGncfEzpHImEmUcwkiplEMZP6MZd44vsWxUzqx1yimEkUM4lq6plwhBIAAAAAYoICBwAAAAAxkcwF7rnQARIQM4liJlHMJIqZ1I+5xBPftyhmUj/mEsVMophJVJPOJGnvgQMAAACAZJPMV+AAAAAAIKkkXYEzs8vNbJOZbTGzvNB5EoGZvWBmlWb2aegsicLMepnZYjMrNrONZnZH6EyhmVkbM/vQzNbXzeRPoTMlCjNLNbOPzeyt0FkSgZmVmdkGM1tnZmtC50HDsSNPxH6MYj9GsR9Pjv0Y1Rw7MqmOUJpZqqTNkiZL2iFptaTr3b04aLDAzCxH0kFJL7r7iNB5EoGZZUrKdPe1ZtZB0keSZrTknxUzM0np7n7QzNIkLZN0h7t/EDhacGY2R9IYSR3d/arQeUIzszJJY9yd1/2JEXZkFPsxiv0YxX48OfZjVHPsyGS7AnehpC3uXuruX0t6RdKPAmcKzt2LJO0PnSORuHu5u6+te/+ApBJJWWFTheW1DtZ9mFb3ljx/4fmezKynpCslzQ+dBfiB2JHfwX6MYj9GsR/rx34MJ9kKXJak7d/6eIda+C8dnJqZ9ZU0StKqsEnCqzsKsU5SpaR8d2/xM5H0hKR7JNWEDpJAXNK7ZvaRmd0SOgwajB2JRmE//g/7sV7sx/o1+Y5MtgIHNIqZtZf0uqQ73b06dJ7Q3P24u4+U1FPShWbWoo8UmdlVkird/aPQWRLMeHc/X9I0SbfVHUMDkETYjydiP56I/fh/NfmOTLYCt1NSr2993LPuc0BE3Tn21yUtdPc3QudJJO7+haTFki4PnSWwcZKurjvP/oqkXDN7KWyk8Nx9Z92/lZL+odqjeUh87Eg0CPvx5NiP32A/nkRz7MhkK3CrJQ00s35m1krSTElvBs6EBFR3Q/Lzkkrc/bHQeRKBmXU1s05177dV7YMOPgubKix3/52793T3vqr9ffK+u/88cKygzCy97sEGMrN0SVMk8QS/eGBH4pTYj1Hsxyj2Y/2aa0cmVYFz92OSfi3pHdXedPuau28Mmyo8M3tZ0kpJg81sh5ndHDpTAhgnaZZq/2K0ru7titChAsuUtNjMPlHtf/Ty3Z3HAuO7zpa0zMzWS/pQ0iJ3fztwJjQAOzKK/Vgv9mMU+xEN1Sw7MqleRgAAAAAAkllSXYEDAAAAgGRGgQMAAACAmKDAAQAAAEBMUOAAAAAAICYocAAAAAAQExQ4AAAAAIgJChwAAAAAxAQFDgAAAABi4r/LXKoaofcbQgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "f, (ax1, ax2) = plt.subplots(1, 2, figsize = (15, 7.2))\n", "f.suptitle('Monitoring the performance of the model')\n", "\n", "ax1.plot(h.history['loss'], label = 'Train')\n", "ax1.plot(h.history['val_loss'], label = 'Test')\n", "ax1.set_title('Model Loss')\n", "ax1.legend(['Train', 'Test'])\n", "\n", "ax2.plot(h.history['accuracy'], label = 'Train')\n", "ax2.plot(h.history['val_accuracy'], label = 'Test')\n", "ax2.set_title('Model Accuracy')\n", "ax2.legend(['Train', 'Test'])\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "iHBJxF2rTFpw", "outputId": "33dc72f5-2177-48a4-c44e-c2b557bfd070" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overall Accuracy: 86.0\n" ] } ], "source": [ "# Evaluate the model\n", "loss, accuracy = model.evaluate(x_test, y_test, verbose = 0)\n", "print('Overall Accuracy: {}'.format(round(accuracy * 100, 0)))" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 187 }, "colab_type": "code", "id": "SnkCCGbblYPr", "outputId": "6f1d56ba-eff6-40eb-e54b-adb84815f8d7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Classification Report:\n", " precision recall f1-score support\n", "\n", " 0 0.87 0.88 0.88 2972\n", " 1 0.85 0.84 0.84 2370\n", "\n", " accuracy 0.86 5342\n", " macro avg 0.86 0.86 0.86 5342\n", "weighted avg 0.86 0.86 0.86 5342\n", "\n" ] } ], "source": [ "y_pred = (model.predict(x_test) > 0.5).astype('int32')\n", "print(f'Classification Report:\\n{classification_report(y_pred, y_test)}')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 481 }, "colab_type": "code", "id": "Dv7thTTKl5nX", "outputId": "ee921609-9e7d-4adc-bfcb-db373a70b768" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------\n", "Confusion Matrix\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Non-sarcasticSarcastic
Non-sarcastic2611385
Sarcastic3611985
\n", "
" ], "text/plain": [ " Non-sarcastic Sarcastic\n", "Non-sarcastic 2611 385\n", "Sarcastic 361 1985" ] }, "metadata": { "tags": [] }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "print('--'*30); print('Confusion Matrix')\n", "cm = confusion_matrix(y_test, y_pred)\n", "cm = pd.DataFrame(cm , index = ['Non-sarcastic', 'Sarcastic'] , columns = ['Non-sarcastic','Sarcastic'])\n", "display(cm); print('--'*30)\n", "\n", "plt.figure(figsize = (8, 5))\n", "_ = sns.heatmap(cm, cmap= 'Blues', linecolor = 'black' , linewidth = 1 , annot = True, \n", " fmt = '' , xticklabels = ['Non-sarcastic', 'Sarcastic'], \n", " yticklabels = ['Non-sarcastic', 'Sarcastic']).set_title('Confusion Matrix')" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 153 }, "colab_type": "code", "id": "0ogPGTB7IfOG", "outputId": "d1ddf20d-cd70-4049-b3a5-013862c83d39" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluate model on sample sarcastic lines\n", "------------------------------------------------------------\n", "`are you always so stupid or is today a special ocassion` is a Sarcastic statement.\n", "`i feel so miserable without you it is almost like having you here` is a Sarcastic statement.\n", "`if you find me offensive then i suggest you quit finding me` is a Sarcastic statement.\n", "`if i wanted to kill myself i would climb your ego and jump to your iq` is a Sarcastic statement.\n", "`amphibious pitcher make debut` is a Sarcastic statement.\n", "`it is okay if you do not like me not everyone ha good taste` is a Sarcastic statement.\n" ] } ], "source": [ "print('Evaluate model on sample sarcastic lines'); print('--'*30)\n", "statements = ['Are you always so stupid or is today a special ocassion?', #Sarcasm\n", " 'I feel so miserable without you, it\\'s almost like having you here.', #Sarcasm\n", " 'If you find me offensive. Then I suggest you quit finding me.', #Sarcasm\n", " 'If I wanted to kill myself I would climb your ego and jump to your IQ.', #Sarcasm\n", " 'Amphibious pitcher makes debut', #Sarcasm\n", " 'It\\'s okay if you don\\'t like me. Not everyone has good taste.' #Sarcasm\n", " ]\n", "\n", "for statement in statements:\n", " statement = statement.lower()\n", " statement = replace_words(statement)\n", " statement = remove_punctuation(statement)\n", " statement = lem(statement)\n", " statement = re.sub(' +', ' ', statement)\n", "\n", " headline = tokenizer.texts_to_sequences(statement)\n", " headline = pad_sequences(headline, maxlen = maxlen, dtype = 'int32', value = 0)\n", "\n", " sentiment = (model.predict(headline) > 0.5).astype('int32')\n", " if(np.argmax(sentiment) == 0):\n", " print(f'`{statement}` is a Non-sarcastic statement.')\n", " elif (np.argmax(sentiment) == 1):\n", " print(f'`{statement}` is a Sarcastic statement.')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YFCwsMESuxt7" }, "source": [ "### Conclusion\n", "* We used data pre-processing techniques to clean headlines, such as:\n", " * Converting to lower case\n", " * Converting to standard lexicons such as it's to it is\n", " * Remove punctuations\n", " * Lemmatize\n", " * Remove multiple spaces\n", "* Some of the observation:\n", " * 44% of the data have sarcastic labels whereas 56% don't.\n", " * Suprising! There are no headlines from HuffPost that are sarcastic whereas all but one from The Onion are sarcastic.\n", " * Based on some random headlines seen above, it appears that the data is mostly lower-cased. Pre-processing such as removing punctuations and lemmatization can be used.\n", " * There are digits in the headlines for e.g. *3 things i needed to hear when i weighed 300 pounds* where removing the digits wouldn't help.\n", " * 83% of data where length of sentence (headlines) > 100 are sarcastic headlines.\n", "* Used Glove embedding layer with Bidirectional LSTM layer. Model architecture was also plotted. Also saw how we can use tensorboard to visualize the metrics such as loss and accuracy.\n", "* Created a separate training and test sets; while fitting the model kept aside a 0.2 for validation;\n", "* Model achieved 86% accuracy on the test set; classification report and confusion matrix were also printed.\n", "* Model was also evaluated on some sample sarcastic statements and did well in identifying all them as sarcasm." ] } ], "metadata": { "accelerator": "GPU", "colab": { "collapsed_sections": [], "name": "Sequential Models in NLP - Sentiment Classification.ipynb", "provenance": [], "toc_visible": true }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 4 }